2011-04-11 46 views
2

我正在使用HttpServletRequestWrapper的子类对请求参数进行一些转换,并在第一次请求时缓存转换后的值。例如,第一次调用getQueryString()时,我打电话给super.getQueryString()并计算我想要的结果并将它保存在一个字段中,然后将其返回。下一次,我只是使用缓存的结果。如何知道请求何时在RequestWrapper对象中转发

这种方法就像一个魅力,除非有一些“转发”。当请求被转发时,Tomcat将替换原始请求,所以我的缓存查询字符串不会更改,并且转发的页面将获取原始查询字符串,而不是转发到的字符串。

覆盖setRequest()清除缓存的方法也无济于事,就好像请求被包装了两次,它在内部包装器上(这不是我的)调用setRequest,我无法知道它的时间发生。

我正在寻找一种方法,当包装的请求层次结构发生变化时通知我,以便我可以在有“转发”时清除缓存。

+1

为什么不只是在处理请求之前使用过滤器修改(并处理和存储缓存值)请求数据?这更像是在规范中认为你应该做这样的事情。 – HefferWolf 2011-04-11 14:12:50

+0

我将这个请求包装在一个过滤器中,但我猜测规范说你不应该修改原始请求值,而是包装请求。看到这个:http://stackoverflow.com/questions/1413129/modify-request-parameter-with-servlet-filter – Iravanchi 2011-04-11 14:34:29

回答

10

原始请求URI可用作请求属性,密钥为RequestDispatcher.FORWARD_REQUEST_URI

String originalRequestURI = request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI); 

if (originalRequestURI != null) { 
    // It was forwarded. Now get the query string as follows. 
    String originalQueryString = request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING); 
} 

注:在老年Servlet API的版本,则需要hardcode关键代替。

String originalRequestURI = request.getAttribute("javax.servlet.forward.request_uri"); 
// ... 
+0

感谢您的答案,我会试一试,然后发布更新。 – Iravanchi 2011-04-12 14:10:46

相关问题