我需要从http.Filter 转发我的请求(到jsp,但我不认为这很重要) 如果原始请求的URI通过了我的过滤器运行的验证。
我发现了page that faced similar task
我还需要了解以下内容:
如何在doFilter()
方法中获取ServletContext(为了调用转发API)getServletContext()
未重新签名
我需要call chain.doFilter()
在前锋之前,之后还是根本没有?
另外,如果我的验证通过,或者只有在它失败的情况下(因为在这种情况下我不会继续转发我的页面),我必须调用chain.doFilter()
吗?
这个问题实际上继续this thread, 更明显的是,代码可能是这样的:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
HttpServletRequest httpServletRequest = ((HttpServletRequest)request);
String requestURI = httpServletRequest.getRequestURI();
String contextPath = httpServletRequest.getContextPath();
if (<this is my implementation of the validation of this filter>){
getServletContext().getRequestDispatcher(
"MySpecific.jsp").forward(request,response);
}
}
chain.doFilter(request,response);
}
答案 0 :(得分:11)
如何在doFilter()方法中获取ServletContext?
httpServletRequest.getSession().getServletContext();
我是否必须在前锋之前调用chain.doFilter(),之后还是根本不调用?另外,如果我的验证通过,或者仅当它失败时,我必须调用chain.doFilter()(因为在这种情况下我不会继续转发我的页面)?
我想说如果您转发了请求,则不应该调用chain.doFilter()
- 转发的请求将根据自己的过滤器配置进行过滤。如果验证失败,则取决于您的Web应用程序的语义是什么 - 如果原始页面是某种常规错误/登录/欢迎屏幕,您可能希望在验证失败时继续执行此操作。如果不了解更多的背景,很难说。
答案 1 :(得分:11)
要获得ServletContext
,您有两个选择:
在初始化期间存储FilterConfig
并致电FilterConfig.getServletContext()
致电HttpServletRequest.getSession().getServletContext()
我认为您不一定需要ServletContext
才能获得RequestDispatcher
,因为您可以致电HttpServletRequest.getRequestDispatcher()
。
关于FilterChain.doFilter()
电话,如果你转发,我认为你不会拨打电话,因为一旦你转发,我认为你不希望任何标准行为发生。
如果你不转发(你不属于你的if块),那么我会调用FilterChain.doFilter()
方法,但是假设另一端有一个目标被调用。