我正在用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 } }