我正在尝试报告从我的webapp应用程序返回的每个HTTP状态代码。但是,状态代码似乎不能通过ServletResponse访问,或者即使我将其转换为HttpServletResponse也无法访问。有没有办法在ServletFilter中访问这个值?
发布于 2009-08-19 19:32:08
首先,您需要将状态代码保存在一个可访问的位置。最好将响应与您的实现包装在一起,并将其保留在其中:
public class StatusExposingServletResponse extends HttpServletResponseWrapper {
private int httpStatus;
public StatusExposingServletResponse(HttpServletResponse response) {
super(response);
}
@Override
public void sendError(int sc) throws IOException {
httpStatus = sc;
super.sendError(sc);
}
@Override
public void sendError(int sc, String msg) throws IOException {
httpStatus = sc;
super.sendError(sc, msg);
}
@Override
public void setStatus(int sc) {
httpStatus = sc;
super.setStatus(sc);
}
public int getStatus() {
return httpStatus;
}
}
为了使用这个包装器,您需要添加一个servlet过滤器,以便您可以进行报告:
public class StatusReportingFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
StatusExposingServletResponse response = new StatusExposingServletResponse((HttpServletResponse)res);
chain.doFilter(req, response);
int status = response.getStatus();
// report
}
public void init(FilterConfig config) throws ServletException {
//empty
}
public void destroy() {
// empty
}
}
发布于 2010-11-29 23:35:16
从Servlet3.0开始,就有了HttpServletResponse#getStatus()
。
因此,如果有升级的空间,可以升级到Servlet3.0(Tomcat7、Glassfish 3、JBoss AS 6等),并且不需要包装器。
chain.doFilter(request, response);
int status = ((HttpServletResponse) response).getStatus();
发布于 2010-12-20 08:35:45
还需要包含#sendRedirect的包装器,最好将状态初始化为'200‘而不是'0’
private int httpStatus = SC_OK;
...
@Override
public void sendRedirect(String location) throws IOException {
httpStatus = SC_MOVED_TEMPORARILY;
super.sendRedirect(location);
}
https://stackoverflow.com/questions/1302072
复制相似问题