セッションセッションの紹介
セッションとは、同じブラウザプロセスとWebアプリケーションを一定期間にわたって使用するユーザー間の相互作用プロセスを指します。
通常、セッションはユーザーのステータスを追跡し、このブラウザプロセスでユーザーの情報をキャッシュするために使用されます。
ユーザーがブラウザを閉じると、前のセッションを再度取得できません(Cookieの最大値が-1)。新しいブラウザを再度開くと、新しいセッションが開始されます。
クラスjavax.servlet.http.httpsession。各HTTPSESSIONは、ユーザーのセッションを表します。
各セッションの有効期限はデフォルトで30分です。
ブラウザが最初にサーバーにアクセスするとき、最初にどのページにアクセスしても、サーバーはユニークなセッション識別子をユーザー、つまりjSessionIDに割り当ててから、Cookieの形でユーザーに戻します。
次の図は応答ヘッダーです(次の図はサーブレット3.0に基づいており、サーブレット2.5にはhttponly属性はありません)
サーバーは、各ユーザーのセッション、つまりHTTPSESSIONオブジェクトを作成し、サーバー側に保存します。
それで、ユーザーが再びサーバーにアクセスすると、サーバーはどのようにして知っているか、現在のユーザーをどのように知っていますか?
ブラウザが再度サーバーにアクセスすると、サーバーにアクセスするためにJSESSIONIDを含むCookieが携帯されます。サーバーは、このIDに基づいてこのユーザーのHTTPSESSIONオブジェクトを返し、セッションを維持します。
(それで、異なるブラウザに同じセッションを実装することは可能ですか?
以下は、特定のスプーフィング効果があり、異なるブラウザに同じセッションを実装できる典型的なURLです。
http:// localhost:8080/day07_2/cncookieservlet; jsessionId = f8692d61cd46d094dbb7a8fc7387649c)
ブラウザとサーバーの関係は次のとおりです。
httpsession:
サーブレットでは、セッションオブジェクトはhttpservletrequest.getsessionメソッドを介して取得されます。
HTTPSESSIONインターフェイスの次の方法は、セッション全体のデータを共有するために使用されます。
getAttribute( "name")setattribute( "name"、object); getattributenames()removeattribute( "name")
Invalidate(); - このメソッドは、サーバーキャッシュセッションを強く削除します。
例:
サーブレットのhttpsesssionでのsetAttribute。
HyperConnectを介して別のサーブレットに移動するか、getattributeで情報を表示します。
任意のサーブレットでgetAttributeを呼び出して情報を表示します。
このブラウザを閉じて、情報を取得するサーブレットを再訪すると、情報がなくなったことがわかります。
次のように:
文字列名= request.getParameter( "name"); request.setattribute( "name"、 "request ---"+name); request.getSession()。setAttribute( "name"、 "session ---"+name); getServletContext()。setAttribute( "name"、 "application ---"+name);
セッションのユニークな識別子:
各セッションには、一意の識別子、つまりIDがあります。
ブラウザが新しいセッションを取得すると、ユーザーはsession.geid()を介してID値を印刷できます。
ブラウザを閉じることなく、同じセッションを使用して複数のページにジャンプします。
のように:
request.getSession()。getId()
安全な出口とは何ですか:
ユーザーが終了すると、セッションから情報をクリアする必要があります。つまり、安全に終了する必要があります。
安全な出口は、サーバーがハッキングされないように、サーバーに残した情報をクリアすることです。
session.invalidate();
1。request.getSession()。invalidate();
これにより、セッションプール内の対応するオブジェクトを削除できます。
2。Session.RemoveAttribute(…)
のように:
request.getSession()。removeattribute( "realcode");
セッションオブジェクトの属性を削除するために使用されます
URLを書き換えてセッションを追跡します。
前述のように、サーブレットコンテナは最初にクライアントにセッションIDを保存します。その後、ブラウザがHTTPリクエストを発行すると、このセッションIDが含まれます。サーブレットコンテナは、HTTPリクエストでSESSIONIDを読み取り、HTTPリクエストが属するセッションの追跡を容易にするために、このSESSIONIDに基づいてコンテナからHTTPSESSIONオブジェクトを取り出します。このプロセスはセッション追跡と呼ばれます。
ブラウザがCookieをサポートする場合、サーブレットコンテナはブラウザのクライアントのCookieとしてSessionIDを保存します。しかし、ユーザーがセキュリティ上の理由でCookieを無効にした場合、サーブレットコンテナはどのようにセッションを追跡できますか?
まず、IEでCookieを無効にしましょう(注:一部のゴーストシステムでは機能しません)。
IE>ツール>インターネットオプション>プライバシー> Advanced、およびCookieを無効にします。
このようなハイパーリンクをホームページに追加できます:( saveservlet.java getservlet.java logoutservlet.java logoutservlet.javaに関連するコードを次のコードで配置します)
<h2> urlテクノロジーの書き換えを実証します----ユーザーがCookieを無効にした後にセッションが無効であるという問題を解決する</h2> <form action = "<%= response.encodeurl(" saveservlet ")%>" method = "post"> name:<入力タイプ= "テキスト" name = "name"/> < href = "<%= response.encodeurl(" getServlet ")%>">いくつかのコンテナでurl読み取りデータを書き換える</a> <br/> <a href = "<%= response.encodeurl(" logoutservlet ")
この文<form action = "<%= response.encodeurl("/aa ")%>">この関数を実現できます
ここでCookieを無効にした後、ブラウザはサーバーから送信されたCookieを受け取ることができますが、ブラウザはそれらを受け入れることができ、サーバーに送信することはできません。 Cookieを送信できない場合、対応するオブジェクトを取得するためにセッションプールに行くことはできません。
フォームで目的の値を入力した後、下のGetServletのハイパーリンクに移動して、入力値を表示できるかどうかを確認します。答えはイエスです。ここのアクセスパスは似ています
http:// localhost:8080/day07_2/cncookieservlet; jsessionId = f8692d61cd46d094dbb7a8fc7387649c、jsessionid = f8692d61cd46d094dbb7a8fc73877777777749c。このようにして、このURLを別のブラウザに入力してアクセスできます。
ここに追加したい:(次の状況は、セッションプールでhttpsessionオブジェクトを書くとき、対応するセッションのjsessionid値と値をCookieに書くことです。このCookieは、システムによって作成されたものと同等のシステムを上書きします。存在時間を10分に設定します。
Cookieが無効になっているかどうかにかかわらず、セッションプールで新しく作成されたオブジェクトのIDは異なります。つまり、Cookieが無効になっているときにフォームに名前の値を入力すると、クエリの結果は次のとおりです。
JSessionIDは2bb51ebdeaaf14d19656c71e1b6f9ff6です
その後、すぐにそれを無効にすることなくCookieモードに変更し、Tomなどの別の名前を入力すると、クエリの結果は当然2つのTOMになります。
203F9E4DB5D874476B81DAF350661B6A。これは無効化とは異なり、次の結果が表示されます。
その後、この時点でブラウザを閉じて、ブラウザをもう一度入力し、次のようにCookieモードを無効にすることなくアクセス結果を表示します。
メインコードを以下に投稿します。
saveservlet.java
パッケージcn.hncu.servlets.session; java.io.ioexceptionをインポートします。 java.io.printwriterをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.http.cookieをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 public class saveservletは、httpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {dopost(request、response); } public void dopost(httpservletrequest request、httpservletResponse応答)throws servletexception、ioexception {respons.setContentType( "text/html; charset = utf-8"); printwriter out = response.getWriter(); request.setcharacterencoding( "utf-8");文字列名= request.getParameter( "name"); request.setattribute( "name"、 "request ---"+name); request.getSession()。setAttribute( "name"、 "session ---"+name); getServletContext()。setAttribute( "name"、 "application ---"+name); //アプリケーション用のCookieテクノロジーとセッションテクノロジーを組み合わせた例-Cnustry:ブラウザを閉じた後、ユーザーが10分以内にこのサイトにログインできる場合、セッションの情報にアクセスできます//キー「JSessionId」とセッションIDとしての価値をクライアントに書くこともできます。 Cookie c = new Cookie( "jsessionid"、request.getSession()。getId()); C.SetMaxage(60*10); //上記の現象はこの文によって引き起こされます。この文がなければ、上記のような現象はありません。 Response.AddCookie(c); out.println( "susterfully ..."); out.flush(); out.close(); }}getServlet.java
パッケージcn.hncu.servlets.session; java.io.ioexceptionをインポートします。 java.io.printwriterをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。パブリッククラスのGetServletは、httpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {respons.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サーブレット</title> </head>"); out.println( "<body>"); string reqname =(string)request.getAttribute( "name"); string sename =(string)request.getSession()。getattribute( "name"); string appname =(string)gestervletcontext()。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
パッケージcn.hncu.servlets.session; java.io.ioexceptionをインポートします。 java.io.printwriterをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 public class logoutservletは、httpservlet {public void doget(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {respons.setcontenttype( "text/html; charset = utf-8")を拡張します。 printwriter out = response.getWriter(); // Safe Exit ---セッションオブジェクトが無効である限り、request.getSession()。無効な(); out.println( "Safe Exit ..."); }}上記は、編集者が紹介したJavawebセッション管理管理です。それがあなたに役立つことを願っています。ご不明な点がございましたら、メッセージを残してください。編集者は時間内に返信します!