我正在用spring编写一个not服务(这个问题不是关于spring的……)它实现了一个(希望) restful api。据我所知,所有响应都应该是xml或json格式的。在大多数情况下,这并不是什么大问题。但在一种情况下,这似乎是不可能的。我使用的是tomcat中的一个工具,其中涉及到一个servlet。出于某种原因,我必须使用过滤器(这个原因是身份验证)。由于我是servlet的新手,我的理解最终不是很好,但对我来说,它看起来是这样的
我的filter类派生自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头文件类似于"Server: Apache-Coyote/1.1“
欢迎任何帮助。
发布于 2016-03-03 19:01:19
我很快就实现了一个用于身份验证的过滤器。我已经编写了类似如下的代码:
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
}
}
发布于 2016-03-03 18:12:47
这对我来说很有效:
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);
}
发布于 2019-05-20 17:25:14
方法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);
}
https://stackoverflow.com/questions/35767502
复制相似问题