首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在tomcat中使用Filter class-method响应servlet客户端时设置http状态码

如何在tomcat中使用Filter class-method响应servlet客户端时设置http状态码
EN

Stack Overflow用户
提问于 2016-03-03 17:03:00
回答 3查看 47.2K关注 0票数 7

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

我的filter类派生自javax.servlet.filter,我在doFilter方法中编写代码:

代码语言:javascript
运行
复制
@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头文件类似于"Server: Apache-Coyote/1.1“

欢迎任何帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-03 19:01:19

我很快就实现了一个用于身份验证的过滤器。我已经编写了类似如下的代码:

代码语言:javascript
运行
复制
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
    }
}
票数 20
EN

Stack Overflow用户

发布于 2016-03-03 18:12:47

这对我来说很有效:

代码语言:javascript
运行
复制
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);
}
票数 5
EN

Stack Overflow用户

发布于 2019-05-20 17:25:14

方法HttpServletResponse::sendError可以帮助我从SpringBoot 2.0应用程序中的过滤器返回:

代码语言:javascript
运行
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35767502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档