为什么重定向会带有之前的请求标头

时间:2016-02-29 05:23:15

标签: jsp redirect servlets java-ee servlet-filters

我在解决为什么sendRedirect方法在浏览器发出带有全新请求和响应对象的请求时发送以前标头的问题。

如果我提供一些背景信息,我们正在使用JAVA CMS平台,在一些罕见的情况下转储堆栈跟踪,公开所使用的技术。这是通过笔测试发现的,并被视为安全威胁。因此我们建议通过显示正常的错误页面来修复它。

以下是我用来重现此问题的请求的屏幕截图。 enter image description here

发出请求时,它会通过CMS的过滤器链。此问题发生在CMS平台过滤器链中的一个过滤器中。因此,我创建了以下自定义过滤器并将其作为第一个过滤器,以便任何请求在到达CMS平台过滤器链之前首先进入此自定义过滤器。这是回到客户端时的最后一个。这种过滤器类型通过过滤器而不做任何处理。如果链中的任何地方出现问题,唯一的工作就是重定向到通用错误页面。

我正在尝试重定向到CMS中托管的页面。会发生什么情况是当重定向的请求到达服务器时它包含旧的请求标头,当它通过过滤器链时,这个问题会一次又一次地发生。

注意:我无法避免使用CMS平台过滤器链,因为它是从JCR(Java内容存储库)动态构建页面的

public class CPSFirstFilter implements Filter {

    private static final Logger log =    LoggerFactory.getLogger(CPSFirstFilter.class);
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @SuppressWarnings("unchecked")
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

    HttpServletRequest httpServletRequest = null;
    HttpServletResponse httpServletResponse = null;

    try {
        httpServletRequest = (HttpServletRequest) request;

        //TETSing. This is how I found out that second request has previous headers
        Enumeration headerNames = httpServletRequest.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String key = (String) headerNames.nextElement();
            String value = httpServletRequest.getHeader(key);
            System.out.println("Key : " + key + " Value : " + value);
        }

        chain.doFilter(request, response) 

    } catch (Exception e) {
        log.error("Logging from XSSFilter: " + e.getMessage());
        // Redirecting
        httpServletResponse.sendRedirect(getRequestURL(httpServletRequest, "/500-internal-error.html"));
        return;
       }
    }

    @Override
    public void destroy() {
    }


    private String getRequestURL(HttpServletRequest request, String destination) {

        String url = request.getRequestURL().toString();
        String uri = request.getRequestURI();
        String ctx = request.getContextPath();
        String base = url.substring(0, url.length() - uri.length()) + ctx;
        System.out.println("2: " + base + destination);
        return base + destination;
      }


}

为什么重定向请求具有以前的标头,是否有办法清除它们?有没有更好的方法来处理标题?

如果我可以清除旧标题,然后我可以通过CMS过滤器链发送第二个网页请求,它将毫无问题地提供错误页面。

第二个选项是创建静态html网页,并在重定向到此页面时避免使用过滤器链。客户不喜欢第二个选项

注意:如果我可以摆脱以前的标题,我认为如果没有明确的重定向,以下内容也应该有用。

 <error-page>
    <error-code>500</error-code>
    <location>/500-internal-error.html</location>
 </error-page>

0 个答案:

没有答案