转发来自筛选器的请求

2022-09-04 01:28:02

我需要从http转发我的请求(到jsp,但我认为这无关紧要)。筛选原始请求的 URI 是否通过我的筛选器运行的某些验证。

我发现这个页面面临类似的任务

我仍然需要弄清楚以下几点:

  1. 我如何在方法中获取ServletContext(为了调用转发API)不重新对齐doFilter()getServletContext()

  2. 我是否必须在前锋之前,之后向前还是根本不进行?此外,如果我的验证通过或仅在验证失败时才调用(因为在这种情况下,我不会继续转发我的页面)?call chain.doFilter()chain.doFilter()

这个问题实际上延续了这个线程,更明显,代码可能是这样的:

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);

    }

答案 1

如何在 doFilter() 方法中获取 ServletContext?

httpServletRequest.getSession().getServletContext();

我是否必须在转发之前,转发之后调用chain.doFilter()或根本不调用?此外,如果我的验证通过或仅当验证失败(因为在这种情况下我不会继续转发我的页面),我是否必须调用chain.doFilter()?

我想说的是,如果您转发了请求,则不应调用 - 转发的请求将根据其自己的过滤器配置进行过滤。但是,如果验证失败,则取决于 Web 应用的语义 - 如果原始页面是某种常规错误/登录/欢迎屏幕,则可能需要在验证失败时继续此操作。如果不了解更多的背景,很难说。chain.doFilter()


答案 2

要获得 ,您有 2 个选项:ServletContext

  • 在初始化和调用期间存储FilterConfigFilterConfig.getServletContext()

  • HttpServletRequest.getSession().getServletContext()

我不认为你一定需要得到,因为你可以打电话给.ServletContextRequestDispatcherHttpServletRequest.getRequestDispatcher()

关于呼叫,如果您正在转接,我认为您不会拨打电话,因为一旦您转接,我就假设您不希望任何标准行为发生。如果你不转发(你不会落入你的if块),那么我会调用该方法,但是假设另一端有一个目标要调用。FilterChain.doFilter()FilterChain.doFilter()


推荐