可能有一個客戶端解決方案。
的作用點在這裏我們可以交流是在這裏:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
我們將提供自己的(包裹)HttpURLConnection
,它將處理JSESSIONID
。但不幸的是,我們必須進一步開始。
訣竅是我們註冊一個新的協議,例如, 「xhttp」,我們用它來包裝一個真正的「http」協議連接。所以,你的URL看起來像:
xhttp://www.example.com/...
首先,定義一個URLStreamHandlerFactory
類
public class MyURLStreamHandlerFactory implements URLStreamHandlerFactory {
public URLStreamHandler createURLStreamHandler(String protocol) {
if ("xhttp".equals(protocol)) {
return new MyURLStreamHandler();
}
return null;
}
}
在Java(或應用程序)初始化時,我們可以設置它。每個JVM只能執行一次。
URLStreamHandlerFactory fac = new MyURLStreamHandlerFactory();
URL.setURLStreamHandlerFactory(fac);
因此,我們繼續使用MyURLStreamHandler
。
public class MyURLStreamHandler extends URLStreamHandler {
@Override
protected URLConnection openConnection(URL url) throws IOException {
return new MyHttpURLConnection(url);
}
}
這很簡單,我們創建自己的連接。讓我們做的髒東西:
public final class MyHttpURLConnection extends HttpURLConnection {
private HttpURLConnection conn;
public MyHttpURLConnection(URL url) throws MalformedURLException, IOException {
super(url);
String newUrlString = url.toExternalForm().substring(1);
conn = (HttpURLConnection) new URL(newUrlString).openConnection();
}
@Override
public void disconnect() {
conn.disconnect();
}
@Override
public boolean usingProxy() {
return false;
}
@Override
public void connect() throws IOException {
conn.connect();
conn.setRequestProperty("JSESSIONID", "X");
}
}
,瞧,我們成功地訪問我們的連接,並設置JSESSIONID
頭。
您所需要的只是編譯您的類,將類文件添加到客戶端jar中,並使init代碼在上述代碼運行的相同JVM中以某種方式運行。
如果你不能做到這一點,還有另外一種可能:設置以下系統參數給客戶端的Java應用程序:
-Djava.protocol.handler.pkgs=com.example.myprotocol
在這種情況下創建一個com.example.myprotocol.xhttp
(xhttp喜歡你的協議名稱),請將我們的MyURLStreamHandler
類重命名爲com.example.myprotocol.xhttp.Handler
。這是協議解析器將查找它的固定名稱。請注意,此java.protocol.handler.pkgs
屬性由安全管理器檢查。
您必須能夠傳遞一些信息,根據請求在服務器端進行身份驗證的信息。如果它不是一個cookie,它可能是一個基本的身份驗證標題,但是從您的角度來看,這與Cookie沒有多大區別...... – zagyi 2013-02-26 18:45:53
所以您建議我將令牌發送給我的客戶端,無論何時它會發送一個對服務器的請求(如JSESSIONID令牌)。但是,如何從服務器端生成這個令牌,以及如何根據存儲的會話檢查它? – 2013-02-26 18:48:51
Option1將在成功登錄後將JSESSIONID存儲在客戶端上,並將每個請求的表單客戶端重新發送到服務器。選項2是客戶端在auth頭中發送每個請求的憑證,然後不需要進行會話處理。 – zagyi 2013-02-26 18:56:43