English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JavaWebセッションセッション管理の実例詳細

セッション会話概要

セッションとは、一定の期間内に、ユーザーが同じブラウザプロセスを使用して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(メールを送信する際、#を@に変更してください。申し訳ありませんが、報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われるコンテンツを削除します。)

おすすめ