我正在使用的子类HttpServletRequestWrapper对请求参数进行一些转换,并且在第一次请求转换的值时会对其进行缓存。例如,第一次getQueryString()调用时,我调用super.getQueryString()并计算所需的结果并将其保存在字段中,然后将其返回。下次,我只使用缓存的结果。
HttpServletRequestWrapper
getQueryString()
super.getQueryString()
除非有一些“转发”,否则此方法就像一种魅力。转发请求时,Tomcat会替换原始请求,因此不会更改我的缓存查询字符串,并且转发的页面将获取原始查询字符串,而不是转发到的查询字符串。
覆盖setRequest()清除缓存的方法也无济于事,就像请求被包装两次一样,它setRequest在内部包装器(不是我的包装器)上调用,并且我无法知道何时发生。
setRequest()
setRequest
我正在寻找一种在包装的请求层次结构发生更改时得到通知的方式,以便在发生“转发”时可以清除缓存。
原始请求URI可以作为带有key的请求属性RequestDispatcher.FORWARD_REQUEST_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版本中,您需要对密钥进行硬编码。
String originalRequestURI = request.getAttribute("javax.servlet.forward.request_uri"); // ...