gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:01:40 24 4
gpt4 key购买 nike

我正在尝试使用 servlet 过滤器修改 servlet 的响应 URL,之前 servlet 本身发出一个 响应.sendRedirect。但是我对此一无所获。我首先测试了 servlet,然后我设置了一些虚拟 JSP 页面来复制 servlet 的相同基本行为。 servlet 来自第三方供应商,无法修改。

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

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

Redirecting a request using servlets and the "setHeader" method not working

Looking for an example for inserting content into the response using a servlet filter

servlet/JSP 中发生的事情是它使用https 加载,然后根据当前 URL 使用 http 构建一个新的 URL >,附加一个querystring参数,cacheid,然后重新加载页面,即

  1. https://example.com/test/testfilter.jsp
  2. http://example.com/test/testfilter.jsp?cacheid=123456

我希望它看起来像这样:

  1. https://example.com/test/testfilter.jsp
  2. https://example.com/test/testfilter.jsp?cacheid=123456

所以我的想法是构建一个拦截响应的过滤器,servlet/JSP 发出response.sendRedirect 之前,修改位置和状态 header ,它应该可以工作。但它不是很有效。

测试过滤器.jsp

<%

if (request.getParameter("cacheid") == null) {
response.sendRedirect("http:/example.com/test/testfilter.jsp?cacheid=123456");
}

%>
<html>
<head></head>
<body>Test</body>
</html>

过滤器

这是我的doFilter 方法:

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("BEFORE filter");

PrintWriter out = response.getWriter();

CharResponseWrapper responseWrapper = new CharResponseWrapper((HttpServletResponse) response);

if ( ((HttpServletRequest)request).getParameter("cacheid") == null ) {
// Not sure how to append querystring parameter
responseWrapper.setHeader("location", "https://example.com/test/testfilter.jsp?cacheid=123456");
responseWrapper.setStatus(HttpServletResponse.SC_FOUND);
}

chain.doFilter(request, responseWrapper);

String servletResponse = new String(responseWrapper.toString());

out.write(servletResponse + " filtered"); // Here you can change the response

System.out.println("AFTER filter, original response: " + servletResponse);

if ( ((HttpServletRequest)request).getParameter("cacheid") == null ) {
// Not sure how to append querystring parameter
responseWrapper.setHeader("location", "https://example.com/test/testfilter.jsp?cacheid=123456");
responseWrapper.setStatus(HttpServletResponse.SC_FOUND);
}
}

小问题是我不确定如何在此修改后的响应中附加查询字符串参数、cacheid 及其值。

主要问题是过滤器似乎只在第二次调用 testfilter.jsp 时触发(使用查询字符串参数 cacheid)。这是原始响应:

https://example.com/test/testfilter.jsp

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://example.com/test/testfilter.jsp?cacheid=123456

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

如果我能让过​​滤器在第一次发送它自己的重定向之前拦截它,我就已经准备好了。但事情似乎从来没有那么简单。

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

谢谢。

最佳答案

设置 Nginx 并将此类逻辑移动到 Nginx 指令中 proxy_redirect 是一种解决方法。

关于tomcat - 在 servlet 重定向之前使用过滤器修改响应 URL (Java/Tomcat),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39153377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com