繁体   English   中英

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

[英]How to set http status code when responding to servlet client from Filter class-method in 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”

任何帮助欢迎...

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

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
    }
}

这对我有用:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
    ServletException {

    response.resetBuffer();
    response.getOutputStream().write("Your content".getBytes());
    HttpServletResponse hsr = (HttpServletResponse) response;
    hsr.setStatus(401);
    chain.doFilter(request, response);
}

方法HttpServletResponse :: sendError对我来说正在从SpringBoot 2.0应用程序的过滤器中返回:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (authenticated)
    {
         chain.doFilter(req, response);
    }
    else
    {
    ((HttpServletResponse) response).sendError(HttpStatus.FORBIDDEN.value(), "Authorization shall be provided");
    }
    chain.doFilter(request, response);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM