在servlet重定向之前使用过滤器修改响应URL(Java/Tomcat)

在servlet重定向之前使用过滤器修改响应URL(Java/Tomcat),tomcat,servlets,httpresponse,servlet-filters,Tomcat,Servlets,Httpresponse,Servlet Filters,我正在尝试使用servlet过滤器修改servlet的响应URL,然后servlet本身发出响应。sendRedirect。但这件事让我一事无成。我首先使用servlet进行测试,然后设置一些虚拟JSP页面来复制servlet的相同基本行为。servlet来自第三方供应商,无法修改 对于这个问题,我将继续使用JSP页面,并假设它们无法修改。如果我可以修改servlet,就不需要发布这个问题了 我还引用了下面的两个主题来帮助我构建过滤器 servlet/JSP中发生的事情是,它加载了https

我正在尝试使用
servlet过滤器
修改
servlet的响应URL,然后servlet本身发出
响应。sendRedirect
。但这件事让我一事无成。我首先使用servlet进行测试,然后设置一些虚拟
JSP
页面来复制servlet的相同基本行为。servlet来自第三方供应商,无法修改

对于这个问题,我将继续使用JSP页面,并假设它们无法修改。如果我可以修改servlet,就不需要发布这个问题了

我还引用了下面的两个主题来帮助我构建过滤器

servlet/JSP中发生的事情是,它加载了
https
,然后基于当前URL构建了一个新的
URL
,添加了
querystring参数
,cacheid,并重新加载页面,即

  • 我希望它看起来像这样:

  • 因此,我的想法是构建一个截取响应的过滤器,在servlet/JSP发出响应之前。sendRedirect,修改位置和状态头,它应该可以工作。但它不太管用

    testfilter.jsp

    <%
    
    if (request.getParameter("cacheid") == null) {
        response.sendRedirect("http:/example.com/test/testfilter.jsp?cacheid=123456");
    }
    
    %>
    <html>
    <head></head>
    <body>Test</body>
    </html>
    
    次要问题是我不确定如何在这个修改后的响应中附加querystring参数cacheid及其值

    主要问题是过滤器似乎只在第二次调用testfilter.jsp时启动(使用querystring参数cacheid)。以下是原始响应:

    HTTP/1.1 302 Moved Temporarily
    Content-Length: 0
    Content-Type: text/html;charset=ISO-8859-1
    Location: http://example.com/test/testfilter.jsp?cacheid=123456
    Server: Microsoft-IIS/7.5
    Set-Cookie: JSESSIONID=66ACCD1EFF485CE820BB9E705311C31D; Path=/test; Secure
    Date: Thu, 25 Aug 2016 19:18:54 GMT
    
    HTTP/1.1 200 OK
    Content-Length: 60
    Content-Type: text/html;charset=ISO-8859-1
    Server: Microsoft-IIS/7.5
    Set-Cookie: JSESSIONID=1342FB2D65F5568AC7EA1EF21E6FB8E4; Path=/test
    Date: Thu, 25 Aug 2016 19:18:54 GMT
    
    <html>
    <head></head>
    <body>Test</body>
    </html> filtered
    

    HTTP/1.1 302 Moved Temporarily
    Content-Length: 0
    Content-Type: text/html;charset=ISO-8859-1
    Location: http://example.com/test/testfilter.jsp?cacheid=123456
    Server: Microsoft-IIS/7.5
    Set-Cookie: JSESSIONID=66ACCD1EFF485CE820BB9E705311C31D; Path=/test; Secure
    Date: Thu, 25 Aug 2016 19:18:54 GMT
    
    HTTP/1.1 200 OK
    Content-Length: 60
    Content-Type: text/html;charset=ISO-8859-1
    Server: Microsoft-IIS/7.5
    Set-Cookie: JSESSIONID=1342FB2D65F5568AC7EA1EF21E6FB8E4; Path=/test
    Date: Thu, 25 Aug 2016 19:18:54 GMT
    
    <html>
    <head></head>
    <body>Test</body>
    </html> filtered
    
    HTTP/1.1200正常
    内容长度:60
    内容类型:text/html;字符集=ISO-8859-1
    服务器:Microsoft IIS/7.5
    设置Cookie:JSESSIONID=1342FB2D65F5568AC7EA1EF21E6FB8E4;路径=/test
    日期:2016年8月25日星期四19:18:54 GMT
    试验
    过滤
    
    如果我能让过滤器第一次截获它,在它发送自己的重定向之前,我会被设置好。但事情似乎从来没有这么简单

    我希望我解释得足够好,问题是什么。任何帮助都将不胜感激


    谢谢。

    设置Nginx并将此类逻辑移到Nginx指令代理中。\u重定向是一种解决方法

    我被同样的问题困住了。你找到解决这个问题的方法了吗?