我需要编写一个Servlet或Filter类,它可以访问org.apache.catalina.connector.Request对象,该对象包含在我的servlet的RequestFacade对象中。转换不起作用,因为RequestFacade不是Request的子类。
我需要这个的原因是因为我试图调用Request的setRequestedSessionId()方法,这显然不是Http servlet规范的一部分。我需要这样做的原因是因为会话ID以不同于JSESSIONID的名称包含在URL中。我无法更改参数的URL或名称,因此我尝试通过提取会话ID并调用Request.setRequestedSessionId()来将请求与正确的会话相关联。
我实际上已经使用Valve子类解决了这个问题,但是我不喜欢使用Valve,因为据我所知,我需要在Tomcat / server / classes目录中安装我的Valve子类而不是打包它与我的其余webapp。如果有一种可移植的方式在不同的Servlet容器中执行此操作,那将是很好的,但目前我已经辞职以制作这个特定于Tomcat的。
这是工作的阀门代码:
public class SessionSetter extends ValveBase {
public void invoke( Request request, Response response ) throws IOException, ServletException {
String sessionId = request.getParameter( "whatever" );
request.setRequestedSessionId( sessionId );
}
}
有没有办法在Servlet或Filter中做同样的事情?或者有没有办法在我的应用程序.war文件中打包Valve类?
答案 0 :(得分:5)
(这是我的评论升级为答案)
如果你正在使用Tomcat 5.5或6,那么这可能是你可以看到的另一种选择:http://tomcat.apache.org/tomcat-6.0-doc/config/systemprops.html#Sessions。您可以使用系统属性更改用于会话ID参数的名称。虽然据我所知,它不适用于Tomcat 7(我认为tc7实现的servlet规范对更改名称更为严格)。
至于从webapp(servlet或过滤器)访问Tomcat内部请求对象,我认为你无法做到。我似乎记得在某处读取RequestFacade类明确存在以防止这种情况,因此webapp不会弄乱Tomcat内部。
答案 1 :(得分:4)
Tomcat将真正的请求对象存储在 RequestFacade 的受保护变量请求中,以便您可以获取它(在Servlet或JSP中)与reflection:
import java.lang.reflect.Field;
import org.apache.catalina.connector.Request;
...
Field f = request.getClass().getDeclaredField("request");
f.setAccessible(true); // grant access to (protected) field
Request realRequest = (Request)f.get(request);