簡體   English   中英

如何在Tomcat中獲取org.apache.catalina.connector.Request對象?

[英]How do I get the org.apache.catalina.connector.Request object in Tomcat?

我需要編寫一個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類?

(這是我的評論升級為答案)

如果您正在使用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內部。

Tomcat將真正的Request對象存儲在RequestFacade的受保護變量請求中,因此您可以使用反射獲取它(在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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM