我在我的网络应用程序中设置了COMET功能(借助诸如AsyncContext和startAsync之类的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()
)。是否需要重载任何其他方法,或者请求无法以这种方式重定向?
答案 0 :(得分:0)
考虑到还没有人回答这个问题,而且我以这种方式过滤请求的所有尝试都失败了,我将继续并假设这个问题的答案是:
不,您不能通过包装并重载所有与URL相关的方法来过滤请求到其他目的地。确定请求目的地的代码显然不依赖于这些方法。