是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码? [复制]
Posted
技术标签:
【中文标题】是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码? [复制]【英文标题】:Is it possible to write a servlet filter to take inspect HTTP response codes? [duplicate] 【发布时间】:2010-11-06 15:34:28 【问题描述】:是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码?
我想编写一个过滤器,它可以非破坏性地检查传出的 HTTP 响应代码。但是,Response 对象上似乎没有类似getResponseCode()
的方法。
我也不清楚应该如何处理来自 servlet 的未处理异常。我真的不希望这个过滤器实际设置任何东西。被动就好。
想法?
(我的另一种方法是编写一个自定义的 Tomcat 阀门,但这不是那么便携。)
【问题讨论】:
怎么我先问了这个问题,但是“这个问题之前已经问过了,已经有了答案。”另一个问题是两个月后来的。不是重复的吗? 【参考方案1】:您是否考虑围绕原始响应类编写代理包装器?这样您就可以处理对象上的事件/方法调用。
【讨论】:
是的,我对细节很模糊。在这种情况下如何处理未处理的异常?我的代理包装器是否会被传回调用堆栈,在那里可能会更改状态代码? (我真的不知道这是否可能。)【参考方案2】:您可以使用HttpServletResponseWrapper 包装您的外发回复:
class GetStatusWrapper extends HttpServletResponseWrapper
private int status;
GetStatusWrapper(HttpServletResponse response)
super(response);
@Override
public void setStatus(int sc)
super.setStatus(sc);
status = sc;
public int getStatus()
return status;
然后在您的过滤器中:
public class GetStatusResponseFilter implements Filter
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain filterChain)
throws IOException, ServletException
GetStatusWrapper wrapper;
wrapper = new GetStatusWrapper((HttpServletResponse) response);
filterChain.doFilter(request, wrapper);
System.out.println("status = " + wrapper.getStatus());
@Override
public void init(FilterConfig arg0) throws ServletException
@Override
public void destroy()
【讨论】:
好的,我在实现这个时遇到了三个问题:一个)还有其他设置状态的方法,但我已经把那些(我希望。)二)如果状态不是明确设置(就像我的测试中发生的那样),这是否意味着我可以安全地假设它是 200 OK?三)例如,如果 super.sendRedirect() 抛出错误会发生什么?我开始发现这种方法过于冗长,并且不相信我会在 100% 的时间内获得具有权威的 SC。 1) 这只是一个“看看它是否有效”的实现。 2) 绝对 3) 这是真正的问题 4) 恕我直言,没有其他便携式方法可以作为这个;只有少数方法必须重写 好的,它正在生产中并且似乎正在运行。谢谢。最后,我将 int status 初始化为 200,用内部 try/catch 块覆盖各种 setStatus、sendError 和 sendRedirect 方法。 不客气,你能在某处发布完整的课程吗?以上是关于是否可以编写一个 servlet 过滤器来检查 HTTP 响应代码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 java servlet 过滤器中的 OPTIONS 方法调用?