一尘不染

从tomcat的Filter类方法响应servlet客户端时如何设置http状态代码

tomcat

我正在用spring(这个问题不是关于spring
…)编写一个Web服务,该Web服务实现了(希望)静态API。据我了解,所有响应都应采用xml或json格式。在大多数情况下,这并不是什么大问题。但是在一种情况下,这似乎是不可能的。我正在使用tomcat中涉及Servlet的工具。由于某种原因,我不得不使用过滤器(而这就是身份验证)。由于我是servlet的新手,所以最终我的理解不是很好,但是对我来说,看起来像这样

我的过滤器类是从javax.servlet.filter派生的,并且正在doFilter方法中编写代码:

@Override
public void doFilter(ServletRequest request, ServletResponse response,
                          FilterChain chain) throws IOException, ServletException { // ... }

在某个时候,我意识到我必须以http状态代码401响应客户端,并且还想向他提供有关所发生情况的xml或json信息。现在对我来说,好像我可以

1)使用ServletResponse:这使我可以获得OutputStream并将xml /
json写出来。但是,我根本无法设置http状态代码。到达客户端的最终响应确实包含一些http标头。

2)将ServletResponse强制转换为HttpServletResponse:这允许我设置状态代码,但是我似乎无法设置响应主体,但可以从tomcat处理响应主体。

两种方法似乎都不完整。如果我使用ServletResponse写入OutputStream,然后转换为HttpServletResponse,然后调用sendError(401)-希望我写到OutputStream的所有内容都到达客户端-
我的响应不包含http“状态行”。但是,http标头的存在类似于“服务器:Apache-Coyote / 1.1”

任何帮助欢迎…


阅读 294

收藏
2020-06-16

共1个答案

一尘不染

我不久就实现了用于身份验证的过滤器。我已经编写了类似于以下内容的代码:

public void doFilter(ServletRequest req, ServletResponse resp,
                         FilterChain chain)
{
    HttpServletResponse response=(HttpServletResponse) resp;

    boolean authenticated=false;
    // perform authentication

    if (authenticated)
    {
         chain.doFilter(req, response);
    }
    else
    {
         // don't continue the chain
         response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
         response.setHeader("WWW-Authenticate", "BASIC realm=\"Your realm\"");

         response.setContentType("what you need");
         PrintWriter writer=response.getWriter();

         // don't set content length , don't close
    }
}
2020-06-16