Java:我可以更改HTTP标头并读取标头服务器端吗?

时间:2013-05-28 23:44:29

标签: java http-headers

我有一个遗留的Java Web应用程序可以 MANY 重定向和转发。我正试图在ServletFilter中找到一种方法来区分GET请求与来自客户端的服务器端重定向和GET请求。

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

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

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

提前感谢任何提示。

3 个答案:

答案 0 :(得分:0)

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

你可以使用Cookies。

答案 1 :(得分:0)

您可以使用HttpServletRequestWrapper,这里有一个关于如何执行此操作的全面教程:

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

答案 2 :(得分:0)

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

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

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

例如:

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

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

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