如何在Tomcat中获取org.apache.catalina.connector.Request对象?

Jes*_*num 6 java tomcat servlets

我需要写一个Servlet或者Filter类可以访问到org.apache.catalina.connector.Request对象,它被包裹在给我的servlet的RequestFacade对象.由于RequestFacade不是Request的子类,因此转换不起作用.

我需要这个的原因是因为我试图调用Request的setRequestedSessionId()方法,这显然不是Http servlet规范的一部分.我需要这样做的原因是因为会话ID以不同于JSESSIONID的名称包含在URL中.我无法更改参数的URL或名称,因此我尝试通过提取会话ID并调用Request.setRequestedSessionId()来将请求与正确的会话相关联.

其实我已经解决了使用阀子类的问题,而是因为据我所知,我需要安装在Tomcat /服务器/ classes目录下我的阀门,而不是子类,其余包装它的,我不喜欢使用阀我的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 );
}
Run Code Online (Sandbox Code Playgroud)

}

有没有办法在Servlet或Filter中做同样的事情?或者有没有办法在我的应用程序.war文件中打包Valve类?

mat*_*att 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内部.


JRL*_*JRL 5

Tomcat 将真实的Request对象存储在RequestFacade的受保护变量request中,因此您可以通过反射获取它(在 Servlet 或 JSP 中):

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);
Run Code Online (Sandbox Code Playgroud)