1

我有一个旧版 Java webapp,它可以进行许多重定向和转发。我试图在 ServletFilter 中找到一种方法来区分 GET 请求与那些服务器端重定向和来自客户端的 GET 请求。

我希望通过在发送重定向/转发之前向标头添加一个属性作为标志来做到这一点,然后在 ServletFilter 中读取它以相应地路由它。

我在 ServletFilter 中的重定向和 request.getAttribute("myflag") 之前尝试了 request.setAttribute("myflag", "yes")。我得到的只是空值。

我可以修改标头服务器端并读取这些修改服务器端吗?

提前感谢您的任何提示。

4

3 回答 3

0

如果您的应用程序设置了请求属性然后转发请求,则转发的 URI 上的过滤器(如果执行)将看到请求属性值。

相反,如果应用程序设置了请求属性,然后在响应上发出重定向,浏览器会向下一个 URI 发出新的 HTTP 请求 - 因此以前的请求对象属性不会被保留,您将获得空值。

您可以使用此技术来确定哪些请求是重定向与转发。

例如:

在 URI /webapp/a处执行的 Servlet A调用request.setAttribute("forward", Boolean.TRUE),然后response.sendRedirect("/webapp/b")

如果你有一个映射到/webapp/b的 servlet 过滤器,在上面的场景中,request.getAttribute("forward")将是null.

但是,如果/webapp/a要求 RequestDispatcher转发到 /webapp/b,则request.getAttribute("forward")在 servlet 过滤器中的调用doFilter()将产生Boolean.TRUE,因为请求对象是相同的。然后它可以推断该请求是转发(或包含)而不是重定向或直接 GET 请求到/webapp/b

于 2013-05-29T01:50:04.460 回答
0

您可以使用HttpServletRequestWrapper,这里有一个关于如何做到这一点的综合教程:

http://vangjee.wordpress.com/2009/02/25/how-to-modify-request-headers-in-a-j2ee-web-application/

于 2013-05-29T01:39:37.923 回答
0

不要使用 request.setAttribute()/request.getAttribute() ,它是转发的范围。

您可以使用 Cookie。

于 2013-05-29T01:24:24.390 回答