3

我正在使用 的子类HttpServletRequestWrapper对请求参数进行一些翻译,并在第一次请求翻译值时缓存它们。比如第一次getQueryString()被调用,我调用super.getQueryString()并计算出我想要的结果并保存在一个字段中,然后返回。下一次,我只使用缓存的结果。

除非有一些“转发”,否则这种方法就像一个魅力。当一个请求被转发时,Tomcat 替换了原来的请求,所以我缓存的查询字符串没有改变,转发的页面得到的是原来的查询字符串,而不是转发到的那个。

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

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

4

1 回答 1

13

原始请求 URI 可用作带有 key 的请求属性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 版本中,您需要对密钥进行硬编码。

String originalRequestURI = request.getAttribute("javax.servlet.forward.request_uri");
// ...
于 2011-04-11T15:52:36.030 回答