一尘不染

如何知道何时在RequestWrapper对象中转发请求

tomcat

我正在使用的子类HttpServletRequestWrapper对请求参数进行一些转换,并且在第一次请求转换的值时会对其进行缓存。例如,第一次getQueryString()调用时,我调用super.getQueryString()并计算所需的结果并将其保存在字段中,然后将其返回。下次,我只使用缓存的结果。

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

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

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


阅读 292

收藏
2020-06-16

共1个答案

一尘不染

原始请求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");
// ...
2020-06-16