如何知道请求何时在 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 对象中转发的主要内容,如果未能解决你的问题,请参考以下文章

(CORS) 浏览器如何知道何时进行飞行前请求

如何知道动态创建的 Angular 组件何时可以在 DOM 中请求?

我如何知道一个内存请求何时被转发到另一个 numa 节点,它是哪个节点?

WCF 如何根据请求决定何时返回 SOAP 或 JSON?

如何检测 XHR 何时返回缓存的资源?

RequestWrapper脚本替换