2009-04-14 7 views
1

初めてセッションにアクセスするときにセッションを作成して情報を保存するサーブレットベースのアプリケーションがあります。この情報は後続のページで使用されます。 msword文書の内部から最初のURLをクリックすると、処理が失敗します。サーブレットはセッションを作成し、応答を返します。応答は新しく開かれたブラウザに表示されます。ブラウザの内側からクリックすると、新しいセッションが作成されます。ブラウザーからクリックされた後続のURLはすべて第2セッションを再利用しますブラウザのリンクがクリックされたときに、word文書のurlで作成されたhttpセッションをどのようにして取得するのですか?

第2の要求でサーバが最初のセッションを認識するように強制する方法はありますか?

私は、セッションを取得し、そのIDを新しいリンクと共に書き込んで、それ自身をコールバックするサンプルサーブレットを作成しました。以下は

テスト・サーブレット

public class SessionServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     StringBuffer sb = new StringBuffer(); 
     sb.append("<HTML>\r\n<HEAD>\r\n<title>\r\nServlet Session Test\r\n</title>\r\n"); 
     sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n"); 
     sb.append("</HEAD>\r\n<BODY>\r\n"); 

     HttpSession userSession = request.getSession(true); 

     if (userSession.isNew()) { 
      sb.append("User Session is new\r\n"); 
     } else { 
      sb.append("User Session is old\r\n"); 
     } 
     sb.append("<br>User Session ID = " + userSession.getId() + "<BR>"); 

     sb.append("URL <a href=\"http://localhost:9080/myTestApp/SessionTest\"> Session Test </a>"); 
     sb.append("</BODY> </HTML>\r\n"); 

     response.setContentType("text/html; charset=UTF-8"); 
     ServletOutputStream sos = response.getOutputStream(); 
     sos.write(sb.toString().getBytes("UTF-8")); 
    } 
} 
+0

他のアプリケーションでリンクをクリックしたときの動作が異なります。たとえば、Acrobat Readerリンクは、ブラウザが後続のページで引き続き使用するセッションを1つだけ作成します。 – GregA100k

答えて

0

FiddlerなどのWebデバッガをインストールするか、Wiresharkキャプチャを行うと、私はあなたのJSESSIONID CookieはHTTPリクエストに送信されていない賭けです。私はIEで開いているMicrosoft Wordからのリンクでこれを見てきました。私がやっていること

request.getSession(false)にあなたのコードを変更し、あなたが戻ってnullを取得する場合は、URLに追加追加のクエリ文字列パラメータ(例えばnewSession =真)に戻って自分自身にresponse.sendRedirectを行うことです。この追加パラメータでリクエストが返ってきたら、request.getSession(true)を実行します。うまくいけば、これはyoruの既存のセッションを見つけるでしょうが、そうでなければ新しいセッションを作ります。コードを無限のsendRedirectループに入れないように注意してください。これは、IEが2番目のHTTPリクエストを作成するときにCookieを送信するために機能します。

関連する問題