如何从ServletFilter中的ServletResponse中获取HTTP状态代码?
问题描述:
我正在尝试报告从我的webapp返回的每个HTTP状态代码。但是,状态代码似乎无法通过ServletResponse访问,或者即使我将其转换为HttpServletResponse也是如此。有没有办法在ServletFilter中访问这个值?
I'm trying to report on every HTTP status code returned from my webapp. However the status code does not appear to be accessible via the ServletResponse, or even if I cast it to a HttpServletResponse. Is there a way to get access to this value within a ServletFilter?
答
首先,您需要将状态代码保存在方便的地方。最好用您的实现包装响应并将其保留在那里:
First, you need to save the status code in an accessible place. The best to wrap the response with your implementation and keep it there:
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过滤器,你可以做你的报告:
In order to use this wrapper, you need to add a servlet filter, were you can do your reporting:
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
}
}