jsessionid は Cookie です。URL の後に「;jsessionid=xxx」を追加することで「セッション ID」を渡すことができます。サーブレット コンテナはユーザー セッションの記録に使用され、応答の作成時に自動的に作成されます。 . ユーザーのアクセス記録を記録するために使用します。
まず第一に、JSESSIONID は Cookie であり、サーブレット コンテナ (tomcat、jetty) によってユーザー セッションを記録するために使用されます。
JSESSIONID をいつ植えるか
セッションを作成するとき、つまり request.getSession() が呼び出されるとき、 getSession に関する情報はありません。 HTML にアクセスしてもセッションは作成されないという点もいくつか追加されます。JSP ページはデフォルトでセッションを作成します。JSP ページで自動セッション作成をオフにすることができます。
JSESSIONID の動作原理:
URL 書き換え
サーバーはメモリ内にセッションを作成し、Cookie を必要とします。リクエストに Set- を設定することに加えて、 header Cookie に加えて、Tomcat などのコンテナには URL 書き換えメカニズムがあります。この仕組みは、クライアントのCookieが利用できない場合の隠蔽策であり、URLの後に; jsessionid=xxx を追加することでセッションIDを渡すことで、Cookieが利用できない場合でもセッションの可用性を保証することができます。セッションは URL で公開されており、それ自体は安全ではありません。ここでの基本的なオンライン意見は一貫しています
しかし、最も重要な疑問は、クライアント Cookie が利用できないことを Tomcat がどのようにして知るのかということです。 tomcat のソースコードのデバッグトレースを idea にインポートしました。バージョンによって多少の違いはありますが、ほぼ同じになるはずです。
Tomcat には org.apache.catalina.connector.Response という実装クラスがあります。 Response. やり方は2つあり、それぞれencodeRedirectURLとencodeURLのURL書き換えですが、encodeRedirectURLはリダイレクト時に呼び出され、encodeURLは手動で呼び出されるようで、デフォルトではURL書き換えはリダイレクト時にのみ行われます。 2 つのメソッドのコードは似ています。以下では、encodeRedirectURL
/** * Encode the session identifier associated with this response * into the specified redirect URL, if necessary. * * @param url URL to be encoded * @return <code>true</code> if the URL was encoded */ @Override public String encodeRedirectURL(String url) { if (isEncodeable(toAbsolute(url))) { return (toEncoded(url, request.getSessionInternal().getIdInternal())); } else { return (url); } }
にのみ焦点を当てます。メソッドのコメントは明確に記述されています。必要に応じて、リダイレクト先の URL にセッション ID を挿入します。 isEncodeable メソッドをもう一度見てみましょう。主要な場所に中国語のコメント
/** * Return <code>true</code> if the specified URL should be encoded with * a session identifier. This will be true if all of the following * conditions are met: * <ul> * <li>The request we are responding to asked for a valid session * <li>The requested session ID was not received via a cookie * <li>The specified URL points back to somewhere within the web * application that is responding to this request * </ul> * * @param location Absolute URL to be validated * @return <code>true</code> if the URL should be encoded */ protected boolean isEncodeable(final String location) { if (location == null) { return false; } // Is this an intra-document reference? if (location.startsWith("#")) { return false; } // Are we in a valid session that is not using cookies? final Request hreq = request; final Session session = hreq.getSessionInternal(false); if (session == null) { return false; } //这里其实就是网上说的客户端禁用Cookie if (hreq.isRequestedSessionIdFromCookie()) { return false; } // Is URL encoding permitted // servlet3.0后可以在项目web.xml里关掉URL重写,对应tomat7之后 if (!hreq.getServletContext().getEffectiveSessionTrackingModes(). contains(SessionTrackingMode.URL)) { return false; } if (SecurityUtil.isPackageProtectionEnabled()) { return ( AccessController.doPrivileged(new PrivilegedAction<Boolean>() { @Override public Boolean run(){ return Boolean.valueOf(doIsEncodeable(hreq, session, location)); } })).booleanValue(); } else { //这个方法会重写URL return doIsEncodeable(hreq, session, location); } }
を追加しました。これは、Request オブジェクトの isRequestedSessionIdFromCookie を呼び出して、クライアント Cookie が利用可能かどうかを判断します。内部のロジックも非常に単純です。 JSESSIONID Cookie がリクエストで渡されるかどうかを読み取ることです。そのため、インターネット上では初めて訪問したという人もいますが、実際、クライアントが JSESSIONID を渡さない限り、Tomcat は Cookie が利用できないものとみなします。
以上がjsessionidとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。