我可以包装请求并将其过滤到原始目的地以外的某个地方吗?

时间:2012-02-22 17:03:30

标签: java java-ee servlets servlet-filters

我在我的网络应用程序中设置了COMET功能(借助诸如AsyncContextstartAsync之类的Servlet 3.0功能)来实现诸如实时通知之类的功能。在唯一的servlet前面添加一个过滤器后,我意识到这个功能不再有效,因为响应是在转发后自动提交的。

请求设置COMET功能要求在处理请求后不提交响应。这意味着我既不能使用转发或重定向将处理传递给我的servlet。因此,我坚持使用doFilter(),据我所知,它在执行后不会自动提交响应。

我原以为我可以在自定义HTTPServletRequestWrapper中包装请求,这会覆盖处理URL的所有方法,如下所示:

public class ActionServletRequestWrapper extends HttpServletRequestWrapper
{
    public ActionServletRequestWrapper(HttpServletRequest request)
    {
        super(request);
    }

    @Override
    public String getRequestURI()
    {

        String originalRequestURI = super.getRequestURI();
        int lastSlashIndex = originalRequestURI.lastIndexOf("/");
        return originalRequestURI.substring(0, lastSlashIndex) + "/ActionServlet";
    }

    @Override
    public StringBuffer getRequestURL()
    {
        String originalRequestURL = super.getRequestURI();
        int lastSlashIndex = originalRequestURL.lastIndexOf("/");
        return new StringBuffer(originalRequestURL.substring(0, lastSlashIndex) + "/ActionServlet");
    }

    @Override
    public String getServletPath()
    {
        return "/ActionServlet";
    }
}

...但是将其传递给doFilter()似乎没有将执行传递给ActionServlet(尽管通过断点我发现在某些时候调用了被覆盖的getServletPath())。是否需要重载任何其他方法,或者请求无法以这种方式重定向?

1 个答案:

答案 0 :(得分:0)

考虑到还没有人回答这个问题,而且我以这种方式过滤请求的所有尝试都失败了,我将继续并假设这个问题的答案是:

不,您不能通过包装并重载所有与URL相关的方法来过滤请求到其他目的地。确定请求目的地的代码显然不依赖于这些方法。