我有一个遗留的Java Web应用程序可以 MANY 重定向和转发。我正试图在ServletFilter中找到一种方法来区分GET请求与来自客户端的服务器端重定向和GET请求。
我希望通过在重定向/转发发送之前向标头添加属性作为标志,然后在ServletFilter中读取它以相应地路由它。
我在ServletFilter中的重定向和request.getAttribute(“myflag”)之前尝试了request.setAttribute(“myflag”,“yes”)。我得到的都是空值。
我可以修改服务器端头并读取服务器端的那些修改吗?
提前感谢任何提示。
答案 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 。