English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
セッション会話概要
セッションとは、一定の期間内に、ユーザーが同じブラウザプロセスを使用してWebアプリケーションとのインタラクションプロセスを指します。
セッション(Session)は、通常ユーザーの状態を追跡し、このブラウザプロセス内でユーザーが保存する情報をキャッシュするために使用されます。
ユーザーがブラウザを閉じると、前のセッションは再び取得できなくなります(CookieのmaxAgeが-1の状態)。新しいブラウザを開いたときは、新しいセッションが開始されます。
クラスjavax.servlet.http.HttpSession。各HttpSessionはユーザーのセッションを表します。
各セッションの有効期限はデフォルトで30分。
ブラウザがサーバーに初めてアクセスした際には、どのページを先にアクセスしても、サーバーはユーザーにユニークなセッション識別子、すなわちjsessionidを割り当て、cookieの形でユーザーに返します。
以下はレスポンスヘッダーです(以下はServlet3.0の、Servlet2.5HttpOnly属性がありません)
サーバーは各ユーザーに対してセッションを作成します。つまり、HttpSessionオブジェクトで、サーバー側に保存されます。
それでは、ユーザーがサーバーに再訪問した際に、サーバーはどうやってそれが現在のユーザーであると知るのでしょうか?
ブラウザがサーバーに再訪問した際には、jsessionidを含むcookieを持ち運び、サーバーがそのidに基づいてユーザーのHttpSessionオブジェクトを返し、セッションが維持されます。
それでは、異なるブラウザで同じセッションを実現できるのでしょうか?
以下は典型的なURLで、ある程度の欺瞞的な効果があり、異なるブラウザで同じセッションを実現できます:
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C )
ブラウザとサーバーの関係は以下の2つの図に示されています:
HttpSession:
Servletでは、HttpServletRequest.getSessionメソッドを使用してセッションオブジェクトを取得します。
HttpSessionインターフェースの以下のメソッドは、セッション範囲内でデータを共有するために使用されます:
getAttribute(“name”) setAttribute(“name”,object); getAttributeNames() removeAttrubute(“name”)
Invalidate(); - このメソッドはサーバー側のsessionキャッシュを強制的に削除します。
例:
ServletのhttpSessionにsetAttributeを使用して値を設定します。
リンクや他の方法で他のservletに移動し、getAttributeを使用して情報を表示します。
任意のServletでgetAttributeを使用して情報を表示します。
このブラウザを閉じ、情報を取得したservletに再びアクセスすると、情報がなくなっていることがわかります。
以下のようになります:
String name=request.getParameter("name"); request.setAttribute("name", "request---"+name); request.getSession().setAttribute("name", "session---"+name); getServletContext().setAttribute("name", "application---"+name);
セッションのユニークな識別子ID:
セッションにはユニークな識別子、つまりIDがあります。
ブラウザが新しいセッションを取得した場合、ユーザーはsession.geId()を通じてIDの値をプリントすることができます。
ブラウザを閉じずに、複数のページ間を移動する場合、同じセッションが使用されます。
例えば:
request.getSession().getId()
安全なログアウトとは何か:
ユーザーがログアウトしたときは、セッションから自分の情報をクリアする必要があります-つまり、安全なログアウトを行います。
安全なログアウトは、サーバー上に残した情報を完全に削除するためのもので、ハッキングを防ぐために使用されます
Session.invalidate();
1、request.getSession().invalidate();
これにより、セッションプール内の対応するオブジェクトが削除されます
2、Session.removeAttribute(…)
例えば:
request.getSession().removeAttribute("realCode");
セッションオブジェクト内の属性を削除するために使用されます
セッションの追跡にはURLをリライトする方法があります:
以前に述べたように、Servletコンテナはクライアント側にSessionIDを保存し、以降、ブラウザからHTTPリクエストが送信されるたびに、このSessionIDが含まれます。ServletコンテナはHTTPリクエスト内のこのSessionIDを読み取り、そのSessionIDに基づいてコンテナからHttpSessionオブジェクトを取得し、HTTPリクエストがどのセッションに属するかを追跡するために、このプロセスをセッションの追跡と呼びます。
ブラウザがcookieをサポートしている場合、ServletコンテナはSessionIDをcookieとしてブラウザのクライアントに保存します。しかし、セキュリティの観点からcookieを無効にした場合、Servletコンテナはどうやってセッションを追跡するのでしょうか?
まずはIEでcookieを無効にしてみましょう(注意:一部のGHOSTシステムでは効果がありません)。
IE>ツール>インターネットオプション>プライバシー>詳細>cookieを無効にする:
ホームページに以下のようなリンクを追加できます:(以下のSaveServlet.java GetServlet.java LogoutServlet.javaのコードは最後に記載しています)
<h2>URL再書き換え技術のデモ---ユーザーがcookieを無効にした後に、sessionが無効になる問題を解決するために</h2> <form action="<%=response.encodeURL("saveServlet") %>" method="post"> name:<input type="text" name="name"/><br/> <input type="submit"/> </form> <a href="<%=response.encodeURL("getServlet") %>">URLを再書き換え-いくつかのコンテナのデータを読み取る</a><br/> <a href="<%=response.encodeURL("logoutServlet") %>">URLを再書き換え-セキュリティ退室</a>
このフォームはaction属性に以下のように設定されています。/aa”)%>”>でこの機能を実現できます
cookieを無効にしても、ブラウザはサーバーから送信されるcookieを受け取ることができますが、ブラウザは受け取るだけで送信することはできず、cookieを送信できないため、sessionプールから対応するオブジェクトを取得することもできません。
上記のコードは、フォームに入力したい値を入力した後、以下のgetServletのリンク先にアクセスして、入力した値が表示されるか確認するまでアクセスします。答えは肯定的です。このアクセスパスは、以下のように似たものです。
http://localhost:8080/day07_2/CNCookieServlet;jsessionid=F8692D61CD46D094DBB7A8FC7387649C の、後ろに付随するjsessionid=F8692D61CD46D094DBB7A8FC7387649CはそのIDです。そのため、別のブラウザでこのURLを入力してもアクセスできます。
以下に補足します:(以下の状況は、sessionプールのHttpSessionオブジェクトが対応するsessionのJSESSIONID値とvalue値をcookieに書き込む場合です。このcookieはシステムが作成したものを上書きします。私が設定した有効期限は10分です。上書きしない場合、cookieはブラウザを閉じると消滅し、以下の現象は発生しませんでした。)
cookieを無効にするかどうかの両方の情况下、sessionプールで新しいオブジェクトが作成されるIDは異なります。つまり、cookieを無効にしてフォームにnameの値を入力した場合の検索結果は以下の通りです:
そしてjsessionidは2BB51EBDEAAF14D19656C71E1B6F9FF6
その後すぐにcookieを無効にしないモードに切り替え、別の名前、例えばTomを入力して、自然に2つのTomが検索結果に表示されます。jsessionidは
203F9E4DB5D874476B81DAF350661B6A、無効にする場合とは異なり、以下の結果が得られます
その後、ブラウザを閉じ、再びブラウザに入り、cookieを無効にしないモードでアクセス結果を確認します。以下の通りです:
以下に主要なコードを貼り付けます:
SaveServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SaveServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text"/html;charset=utf-8"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("utf-8"); String name=request.getParameter("name"); request.setAttribute("name", "request---"+name); request.getSession().setAttribute("name", "session---"+name); getServletContext().setAttribute("name", "application---"+name); //cookie技術とsession技術を組み合わせてアプリケーションを実装する例---※機能:ブラウザを閉じた後に、ユーザーが10分以内にサイトにログインでき、セッションの情報にアクセスできます。 //クライアントに「JSESSIONID」というキーで「sessionid」という値を持つcookieを書き込みます。 Cookie c=new Cookie("JSESSIONID", request.getSession().getId()); c.setMaxAge(60*10);//この現象はこの一文が原因です。この一文がないと、上記の現象は発生しません。 c.setPath(request.getContextPath()); response.addCookie(c); out.println("保存成功..."; out.flush(); out.close(); } }
GetServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class GetServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text"/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN>"; out.println("<HTML>"; out.println("<HEAD><TITLE>A Servlet</TITLE></HEAD>"; out.println("<BODY>"; String reqName=(String) request.getAttribute("name"); String seName=(String) request.getSession().getAttribute("name"); String appName=(String) getServletContext().getAttribute("name"); out.println(reqName+"<br/>"; out.println(seName+"<br/>"; out.println(appName+"<br/>"; out.println("</BODY>"; out.println("</HTML>"; out.flush(); out.close(); } }
LogoutServlet.java
package cn.hncu.servlets.session; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LogoutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text"/html;charset=utf-8"); PrintWriter out = response.getWriter(); //安全なログアウト---session オブジェクトを無効にすることで十分です。 request.getSession().invalidate(); out.println("安全にログアウトしました..."); } }
以上は編集者が皆さんに紹介したJavaWeb Session 会話管理についてです。皆さんの助けになれば幸いです。何かご不明な点があれば、コメントを残してください。編集者はすぐに回答します。
声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしました。本サイトは所有権を持ちません。また、人間による編集は行われていません。著作権侵害を疑う内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メールを送信する際、#を@に変更してください。申し訳ありませんが、報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)