来自过滤器的转发请求

时间:2010-08-05 13:42:29

标签: java java-ee filter

我需要从http.Filter 转发我的请求(到jsp,但我不认为这很重要) 如果原始请求的URI通过了我的过滤器运行的验证。

我发现了page that faced similar task

我还需要了解以下内容:

  1. 如何在doFilter()方法中获取ServletContext(为了调用转发API)getServletContext()未重新签名

  2. 我需要call chain.doFilter()在前锋之前,之后还是根本没有? 另外,如果我的验证通过,或者只有在它失败的情况下(因为在这种情况下我不会继续转发我的页面),我必须调用chain.doFilter()吗?

  3. 这个问题实际上继续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);
    
        }
    

2 个答案:

答案 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()方法,但是假设另一端有一个目标被调用。