如何知道请求何时在 RequestWrapper 对象中转发
Posted
技术标签:
【中文标题】如何知道请求何时在 RequestWrapper 对象中转发【英文标题】:How to know when the request is forwarded in a RequestWrapper object 【发布时间】:2011-08-03 02:35:59 【问题描述】:我正在使用HttpServletRequestWrapper
的子类对请求参数进行一些翻译,并在第一次请求时缓存翻译后的值。比如第一次调用getQueryString()
,我调用super.getQueryString()
,计算出我想要的结果并保存在一个字段中,然后返回。下一次,我只使用缓存的结果。
除非有一些“转发”,否则这种方法就像一个魅力。当一个请求被转发时,Tomcat 会替换原来的请求,所以我缓存的查询字符串没有改变,被转发的页面得到的是原来的查询字符串,而不是被转发到的那个。
重写setRequest()
方法来清除缓存也无济于事,好像请求被包装了两次,它在内部包装器上调用setRequest
(这不是我的),我没有办法知道什么时候发生。
我正在寻找一种在包装的请求层次结构发生变化时得到通知的方法,以便在有“转发”时清除缓存。
【问题讨论】:
为什么不直接使用过滤器在处理请求之前修改(并处理和存储您的缓存值)请求数据?这更像是做规范认为你应该做的事情。 我将请求包装在过滤器中,但我猜规范说您不应该修改原始请求值,而是包装请求。看到这个:***.com/questions/1413129/… 【参考方案1】:原始请求 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");
// ...
【讨论】:
以上是关于如何知道请求何时在 RequestWrapper 对象中转发的主要内容,如果未能解决你的问题,请参考以下文章
如何知道动态创建的 Angular 组件何时可以在 DOM 中请求?