1.セッションの簡単な紹介
Web開発では、サーバーは各ユーザーのブラウザにセッションオブジェクト(セッションオブジェクト)を作成できます。注:ブラウザは、セッションオブジェクトのみを所有しています(デフォルト)。したがって、ユーザーデータを保存する必要がある場合、サーバープログラムはユーザーデータをユーザーのブラウザ専用のセッションに書き込むことができます。ユーザーがブラウザを使用して他のプログラムにアクセスすると、他のプログラムはユーザーのセッションからユーザーのデータを取得してユーザーにサービスを提供できます。
2。セッションとCookieの主な違い
Cookieは、ユーザーのデータをユーザーに書き込むブラウザです。
セッションテクノロジーは、ユーザーデータをユーザー所有のセッションに書き込みます。
セッションオブジェクトはサーバーによって作成され、開発者はリクエストオブジェクトのGetSessionメソッドを呼び出してセッションオブジェクトを取得できます。
3。セッションの実装原則
3.1。サーバーは、ユーザーのブラウザにサービスを提供するセッションをどのように実装しますか?
サーバーがセッションを作成すると、Cookieの形でセッションID番号をクライアントに書き戻します。このようにして、クライアントのブラウザが閉じていない限り、サーバーにアクセスすると、セッションID番号が表示されます。サーバーがクライアントブラウザにセッションIDがあることを見つけたとき、それはメモリ内の対応するセッションを使用してそれを提供します。次のコードで証明できます。
パッケージXDP.GACL.SESSION; Import java.io.ioException; Import javax.servlet.servletexception; import javax.servlet.http.httpservlet; Import javax.servlet.http.httpservletrequest; import javax.http.httpseponseponse; javax.servlet.http.httpsesssion; Import javax.servlet.http.httpsession; Import javax.servlet.http.httpsession; public classdemo1 extends httpservlet {public void doget(httpservletrexcectのリクエスト) Response.setcharacterencoding( "utf = 8"); Response.setContentType( "text/html; charset = utf-8"); //リクエストオブジェクトのgetSession()を使用してセッションを取得します。セッションが存在しない場合は、httpsession session = request.getSession()を作成します。 //セッションセッションでデータを保存します。SetAttribute( "data"、 "Lonely Canglang"); //セッション文字列sessionId = session.getId()のIDを取得します。 //セッションが新しく作成されているかどうかを判断します(session.isnew()){response.getWriter()。印刷( "セッションが正常に作成されました、セッションのIDは:"+sessionId); } else {response.getWriter()。print( "セッションはすでにサーバーに存在し、セッションのIDは"+sessionId); }} public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}以下の図に示すように、サーバーは初めてアクセスするときに、新しいセッションを作成し、Cookieの形でセッションIDをクライアントブラウザに送信します。
[更新]ボタンをクリックして、再度サーバーをリクエストします。この時点で、ブラウザがサーバーを再度リクエストすると、下の図に示すように、Cookieに保存されているセッションIDがサーバー側に渡されることがわかります。
request.getSession()メソッドは、新しく作成されたセッションの後に次の処理を行ったに違いありません
//セッションIDSTRING SESSIONID = SESSION.GETID(); // jsessionId cookie cookie = new cookie( "jsessionId"、sessionid); // cookie cookie.setpath(request.getContextPath())の有効なパスを設定して、jsessionid cookie = new cookie( "jsessionId"、sessionId); Response.AddCookie(Cookie);
4.ブラウザがCookieを無効にした後のセッション処理
4.1。 IE8はCookieを無効にします
ツール - >インターネットオプション - >プライバシー - >設定 - >スライダーを上部に引っ張る(すべてのCookieをブロック)
4.2。解決策:URL書き換え
Response.Encoderedirecturl(java.lang.String URL)を使用して、sendredirectメソッドの後にURLアドレスを書き換えます。
Response.Encodeurl(java.lang.String URL)を使用して、フォームアクションとハイパーリンクのURLアドレスを書き直します
4.3。例:Cookieを無効にした後、サーブレットはセッションでデータを共有します
IndexServlet
パッケージxdp.gacl.session; Import java.io.ioexception; import java.io.printwriter; Import java.util.linkedhashmap; import java.util.map; import java.util.set; Import javax.servlet.servletexception; Import javax.havax.htp.htpts javax.servlet.http.httpservletrequest; import javax.servlet.httpservletrequest; Import javax.servlet.httpservletresponse; // Homepage:すべての書籍の公開indexservlet extrencevlet {public void doegt( httpservletResponse Response)servletexception、ioException {respons.setContentType( "text/html; charset = utf-8"); printwriter out = response.getWriter(); // session request.getSession(); out.write( "このウェブサイトには次の本があります:<br/>"); set <map.entry <string、book >> set = db.getall()。entryset(); for(map.entry <string、book> me:set){book book = me.getValue(); string url = request.getContextPath() + "/servlet/buyservlet?id =" + book.getid(); //応答。 encodeurl(java.lang.string url)は、ハイパーリンクurl = response.encodeurl(url)のフォームアクションとURLアドレスを書き換えるために使用されます。 //ハイパーリンクout.println(book.getName()+"<a href = '"+url+"'>購入</a> <br/>"); }} public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}/*** @author gacl*データベースをシミュレート*/class db {private static map <string、book> map = new linkedhashmap <string、book>(); static {map.put( "1"、new Book( "1"、 "Javaweb Development")); map.put( "2"、new Book( "2"、 "Spring Development")); map.put( "3"、new Book( "3"、 "Hibernate Development")); map.put( "4"、new Book( "4"、 "Struts Development")); map.put( "5"、new Book( "5"、 "ajax Development")); } public static map <string、book> getall(){return map; }} class book {private string id;プライベート文字列名; public book(){super(); } public Book(string id、string name){super(); this.id = id; this.name = name; } public string getId(){return id; } public void setid(string id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; }}Buyservlet
パッケージXDP.GACL.SESSION; Import java.io.ioException; Import Java.util.arrayList; Import Java.util.List; Import javax.servlet.servletexception; Import javax.servlet.http.httpservlet; javax.servlet.http.httpservletresponse; Import javax.servlet.http.httpsession; public class buyservletはhttpservletを拡張します{public void doget(httpservletrequest request(htttpservletresponse応答) book book = db.getall()。get(id); //ユーザーがhttpsession session = request.getSession()を購入したい本を取得します。リスト<book> list =(list)session.getAttribute( "list"); //ユーザーが使用しているコンテナを取得してすべての本を保存します(list == null){list = new arraylist <book>(); session.setattribute( "list"、list); } list.add(book); //応答。 encoderedirecturl(java.lang.string url)を使用して、sendredirectメソッド文字列url = response.encoderedirecturl(request.getContextPath()+"/servlet/listcartservlet"); System.out.println(url); Response.sendredirect(url); } public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}ListCartServlet
パッケージxdp.gacl.session; Import java.io.ioexception; Import java.io.printwriter; Import java.util.list; Import javax.servlet.servletexception; Import javax.servlet.http.httpservlet; Import javax.http.httpservletreqest; javax.servlet.http.httpservletresponse; Import javax.servlet.http.httpsession; public class listcartservletは、httpservlet {public void request(httpservletrequest request、httpservletrequest request、httpservletresponse応答)shows exexception、ioexexceptionを拡張します。 Response.setContentType( "text/html; charset = utf-8"); printwriter out = response.getWriter(); httpsession session = request.getSession();リスト<book> list =(list)session.getAttribute( "list"); if(list == null || list.size()== 0){out.write( "申し訳ありませんが、まだ製品を購入していません!!");戻る; } //ユーザーが購入した製品を表示します。 for(book book:list){out.write(book.getname() + "<br/>"); }} public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {doget(request、response); }}Cookieが無効になっているIE8の下での操作効果は次のとおりです。
デモ効果
IndexServletによって生成されたHTMLコードを見ると、以下に示すように、各ハイパーリンクにセッションIDが続くことがわかります。
//このウェブサイトには次の本があります:<br/> javaweb開発<a href = '/javaweb_session_study_20140720/servlet/jsessionid = 96bdfb9d87a08d5ab1eaaa2537cde2db2? href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2?id = 2'>購入</a> <br/> href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionid = 96bdfb9d87a08d5ab1eaa2537cde2db2?id = 3'>購入</a> <br/> // struts開発<a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2?id = 4'>購入</a> <br/> // ajax開発<a href = '/javaweb_session_study_20140720/servlet/buyservlet; jsessionId = 96bdfb9d87a08d5ab1eaa2537cde2db2?id = 5'>購入</a> <br/>
したがって、ブラウザがCookieを無効にすると、このソリューションをURLで書き換えて、セッションデータ共有の問題を解決できます。さらに、応答。 Encoderedirecturl(java.lang.string url)および応答。 encodeurl(java.lang.string url)は、2つの非常にスマートな方法です。ブラウザがCookieを無効にしないことが検出された場合、URL書き換えは実行されません。 Cookieを無効にすることなくFirefoxブラウザの下でアクセスします。効果は次のとおりです。
デモンストレーションアニメーションからわかるように、ブラウザが最初にアクセスすると、サーバーがセッションを作成し、セッションのIDをCookieの形でブラウザに送り返します。応答。 encodeurl(java.lang.string url)メソッドもURLを書き直しました。 2回目の訪問のためにリフレッシュボタンをクリックすると、FirefoxブラウザはCookieを無効にしないため、2回目の訪問でCookieをもたらします。この時点で、サーバーは現在のクライアントブラウザがCookieを無効にしないことを知ることができるため、応答に通知します。 URLを書き換える必要のないecodeurl(java.lang.string url)メソッド。
5。セッションオブジェクトの作成と破壊のタイミング
5.1。セッションオブジェクトの作成時間
Request.getSession()メソッドがプログラムで初めて呼び出されると、新しいセッションが作成されます。 ISNew()メソッドを使用して、セッションが新しく作成されているかどうかを判断できます。
例:セッションを作成します
//リクエストオブジェクトのgetSession()を使用してセッションを取得します。セッションが存在しない場合は、httpsession session = request.getsession(); // idstring sessionid = session.getid(); //セッションが新しく作成されているかどうかを判断します。 IS: "+sessionId);}
5.2。セッションオブジェクトの破壊タイミング
セッションオブジェクトはデフォルトで30分間使用されず、サーバーはセッションを自動的に破壊します。セッションの失敗時間は、Web.xmlファイルで手動で構成できます。たとえば、:
<?xml version = "1.0" encoding = "utf-8"?> <web-appバージョン= "2.5" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instcance" xsi:schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name> </display-name> <! - セッションの有効な時間を設定:数分で - > <Session-Config> <Session-TimeOut> 15 </SESSION-TIMEOUT> </SESSION-CONFIG> </web-App>
プログラムで失敗するようにセッションを手動で設定する必要がある場合、セッションを手動で呼び出すことができます。
1 httpsession session = request.getSession();
2 //セッションを手動で呼び出してセッションを破壊するためにvalidateメソッド
3 session.invalidate();
上記はこの記事に関するものです。誰もがセッションを学ぶのに役立つことを願っています。