HTTPOnlyCookies設定が有効になっているWebsphere6.1.0.31で実行されているアプリケーションに問題があります。問題は、HttpURLConnectionを介してサーブレットに接続するアプレットにあります。アプレットには、JSPページからパラメータによってJSESSIONIDが渡されます。HttpURLConnect呼び出しでは、Cookieヘッダーを設定し、JSESSIONIDを含めます。サーブレットは渡されたCookieを使用せず、新しいセッションを作成してエラーを引き起こします。HTTPOnlyCookiesを無効にすると、これはエラーなしで機能します。設定は(com.ibm.ws.webcontainer.HTTPOnlyCookies = *)です。
以下は、このタスクをどのように実行しているかを示すために変更されたコードです。これは本番ソフトウェアにあるため、プロジェクトに関連する情報を削除するためにコードを変更しただけです。
// The Applet
public class TheApplet extends JApplet {
private String servletURL;
private String sessionId;
public void init() {
this.sessionId = getParameter(SESSION_ID_PARAM);
this.servletURL = "https://THEURL/CONTEXT/TheServlet.do?params=params";
}
public void start () {
Thread t = new Thread(new Runnable() {
public void run() {
HttpClient httpClient = new HttpClient(this.servletURL, this.sessionId);
Map theMap = httpClient.getData();
}
});
t.start();
}
}
public class HttpClient {
public Map getData() {
ObjectInputStream ois = doGet(this.servletURL, this.sessionId);
/*
... Process return .. error happens before processing
*/
}
private ObjectInputStream doGet(String servletURL, String sessionId) {
URL url = new URL(servletURL);
HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
httpConn.setDoInput (true);
httpConn.setDoOutput (true);
httpConn.setRequestProperty("Cookie", "JSESSIONID="+sessionId);
httpConn.setUseCaches (true);
return new ObjectInputStream (httpConn.getInputStream ());
}
}
// The Servlet
// Struts 1.2.9
import org.apache.struts.actions.DispatchAction;
public class TheServletAction extends DispatchAction {
public ActionForward performGetData(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
Map theMap = new HashMap();
/*
... db call and build Map
*/
TheResponseWriter.writeObjectIntoResponse(theMap, response);
}
}
public class TheResponseWriter {
public static void writeObjectIntoResponse(Object oObjToWrite, HttpServletResponse response) {
ServletOutputStream out = response.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
response.setContentType("application/octet-stream");
oos.writeObject(oObjToWrite);
oos.flush();
oss.close();
out.close();
}
}
以下は、アプレットからのJavaコンソールトレースファイルに表示されるエラーです。ここでも小さな情報を変更するだけで、WASReqURLに「ホスト名」がないことに気づきました。
network: Cache entry not found [url: https://THEURL/CONTEXT/TheServlet.do?params=params, version: null]
network: Connecting https://THEURL/CONTEXT/TheServlet.do?params=params with proxy=DIRECT
network: Connecting socket://THEURL:443 with proxy=DIRECT
network: Server https://THEURL/CONTEXT/TheServlet.do?params=params requesting to set-cookie with "WASReqURL=https:///CONTEXT/TheServlet.do?params=params; HTTPOnly; Path=/"
network: Cache entry not found [url: https://THEURL/CONTEXT/index.jsp, version: null]
network: Connecting https://THEURL/CONTEXT/index.jsp with proxy=DIRECT
network: Connecting socket://THEURL:443 with proxy=DIRECT
network: Server https://THEURL/CONTEXT/index.jsp requesting to set-cookie with "JSESSIONID=; HTTPOnly; Expires=Thu, 01 Dec 1994 16:00:00 GMT; Domain=THEURL"
network: Server https://THEURL/CONTEXT/index.jsp requesting to set-cookie with "JSESSIONID=dfdsfdsafds3q32-sad9287287:163bb19cr; HTTPOnly; Path=/"
- Wed Dec 14 09:05:58 EST 2011 - ERROR - Thread-8 - com.the.package.HttpClient - java.io.StreamCorruptedException: invalid stream header: 0A0A0A0A
助けてくれてありがとう、そしてあなたが援助する必要があるかもしれないさらなる情報を私に知らせてください。私はまったく役立つものを見つけることができません。
_詳細を追加する
本番環境では、行(httpConn.setRequestProperty( "Cookie"、 "JSESSIONID =" + sessionId);)も存在せず、プロセスは正常に機能します。しかし、クライアントはWebsphereでhttpOnly設定を有効にしたいと考えていますが、アプレットが機能していません。セッションのパスが機能しない理由を見つけたかもしれません。Cookieヘッダーを見ると、JSESSIONIDのヘッダーが、アプレットのパラメーターとして設定されているものとは異なることに気付きました。調べてみると、クラスター環境のJSESSIONID形式に関する情報が見つかりました。https://www.ibm.com/developerworks/mydeveloperworks/blogs/Dougclectica/entry/websphere_session_ids22?lang=en、これはCacheID + SessionID +:+CloneIDです。JSPページでこれらの値を取得する方法を見つけようとしているところです。