1. 세션에 대한 간단한 소개
웹 개발에서 서버는 각 사용자의 브라우저에 대한 세션 객체 (세션 객체)를 만들 수 있습니다. 참고 : 브라우저는 세션 객체를 독점적으로 소유합니다 (기본적으로). 따라서 사용자 데이터를 저장 해야하는 경우 서버 프로그램은 사용자 데이터를 사용자의 브라우저 전용 세션에 쓸 수 있습니다. 사용자가 브라우저를 사용하여 다른 프로그램에 액세스 할 때 다른 프로그램은 사용자 세션에서 사용자의 데이터를 검색하여 사용자에게 서비스를 제공 할 수 있습니다.
2. 세션과 쿠키의 주요 차이점
쿠키는 사용자에게 사용자의 데이터를 작성하는 브라우저입니다.
세션 기술은 사용자 데이터를 사용자 소유 세션에 씁니다.
세션 객체는 서버에서 생성되며 개발자는 요청 객체의 getsession 메소드를 호출하여 세션 객체를 가져올 수 있습니다.
3. 세션 구현 원리
3.1. 서버는 사용자의 브라우저에 서비스를 제공하기 위해 세션을 어떻게 구현합니까?
서버가 세션을 생성하면 쿠키 형태로 세션 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.servlet.http.httpervletrpronge; javax.servlet.http.httpsession; import javax.servlet.http.httpsession; import javax.servlet.http.httpsession; public class sessiondemo1 확장 httpservlet {public void doget (httpservletrequest, httpservercone 응답) servlecection elsporection elscown {httpservlection elscue). 응답 .SetchAracterEncoding ( "utf = 8"); Response.setContentType ( "Text/Html; charset = utf-8"); // 요청 객체의 getsession ()을 사용하여 세션을 가져옵니다. 세션이 존재하지 않으면 httpsession session = request.getSession ()을 작성하십시오. // 세션 세션에서 데이터를 스토리지. // 세션의 ID를 가져옵니다. string sessionId = session.getId (); // if (session.isnew ()) {response.getWriter (). print ( "세션은 성공적으로 생성되었고, 세션 ID는"+sessionId); } else {response.getWriter (). print ( "세션은 서버에 이미 존재하고 세션의 ID는 다음과 같습니다."+sessionId); }} public void dopost (httpservletrequest 요청, httpservletreponse 응답) servletexception, ioexception {doget (요청, 응답); }}처음으로 액세스 할 때 서버는 새 세션을 생성하고 아래 그림과 같이 쿠키 형식으로 세션 ID를 클라이언트 브라우저로 보냅니다.
새로 고침 버튼을 클릭하고 서버를 다시 요청하십시오. 이 시점에서 브라우저가 서버를 다시 요청하면 쿠키에 저장된 세션 ID가 아래 그림과 같이 서버쪽으로 함께 전달됩니다.
요청 .getSession () 메소드는 새로 생성 된 세션 후에 다음 처리를 수행해야한다고 생각합니다.
// Session idstring sessionId = session.getId (); // 쿠키에서 쿠키에 세션 ID를 저장하여 JSSESSIONID 쿠키 쿠키 = 새 쿠키 ( "jssessionId", sessionId); // 쿠키 쿠키의 유효한 경로를 설정합니다 (request.getContextPath ()); 응답 .addcookie (쿠키);
4. 브라우저 후 세션 처리가 쿠키를 비활성화합니다.
4.1. IE8 쿠키를 비활성화합니다
도구 -> 인터넷 옵션 -> 개인 정보 -> 설정 -> 슬라이더를 상단으로 당기십시오 (모든 쿠키 차단)
4.2. 해결책 : URL 재 작성
response.encoderedirecturl (java.lang.string url)은 SendRedirect 메소드 후에 URL 주소를 다시 작성하는 데 사용됩니다.
response.encodeurl (java.lang.string url)은 양식 조치 및 하이퍼 링크의 URL 주소를 다시 작성하는 데 사용됩니다.
4.3. 예 : 쿠키를 비활성화 한 후 서블릿은 세션에서 데이터를 공유합니다.
인덱스 서비스
패키지 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.servlet.httpervlet; javax.servlet.http.http.httpervletrequest; import javax.servlet.http.htttp.httpervletrequest; import javax.servlet.http.htttp.htttp.httptp.httpervletrepsonse; // 홈페이지 : All All All Books Public ClassServlet {public void doget void void doget (htpervletrequest void void). httpservletResponse 응답) servletexception, ioexception {response.setContentType ( "text/html; charset = utf-8"); printwriter out = response.getwriter (); // 세션을 작성합니다. getSession (); out.write ( "이 웹 사이트에는 다음과 같은 책이 있습니다 : <br/>"); set <map.entry <string, book >> set = db.getall (). entryset (); for (map.entry <string, book> me : set) {book book = me.getValue (); 문자열 url = request.getContextPath () + "/servlet/buyservlet? id =" + book.getId (); //응답. EncodeUrl (java.lang.string url)은 HyperLink url = response.encodeUrl (url)의 양식 조치 및 URL 주소를 다시 작성하는 데 사용됩니다. // HyperLink Out.println의 URL 주소를 다시 작성합니다 (book.getName ()+"<a href = '+url+"'> 구매 </a> <br/> "); }} public void dopost (httpservletrequest 요청, httpservletreponse 응답) servletexception, ioexception {doget (요청, 응답); }}/*** @author gacl* 데이터베이스 시뮬레이션*/클래스 DB {private static map <string, book> map = new LinkedHashMap <String, book> (); static {map.put ( "1", 새 책 ( "1", "Javaweb Development")); map.put ( "2", 새 책 ( "2", "Spring Development")); map.put ( "3", 새 책 ( "3", "최대 절자 개발")); map.put ( "4", 새 책 ( "4", "Struts Development")); map.put ( "5", 새 책 ( "5", "Ajax Development")); } public static map <string, book> getall () {return map; }} 클래스 북 {개인 문자열 ID; 개인 문자열 이름; public book () {super (); } public book (문자열 ID, 문자열 이름) {super (); this.id = id; this.name = 이름; } public String getId () {return id; } public void setId (String id) {this.id = id; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; }}구입자
패키지 xdp.gacl.session; import java.io.ioexception; import java.util.arraylist; import java.util.list; import javax.servlet.servletexception; import javax.servlet.http.httpervlet; import javax.servlet.httplet.httpepest.httpepest.httpepert. javax.servlet.http.http.httervletresponse; import javax.servlet.http.httpsession; public class buysesvlet는 httpservlet {public void doget (httpservletrequest 요청), servletexception, ioexception (httpservletrequest request)을 확장합니다. 책서 = db.getall (). get (id); // 사용자가 httpsession session = request.getSession ()을 구매하려는 책을받습니다. List <book> list = (list) session.getAttribute ( "List"); // 사용자가 사용한 컨테이너를 모든 책을 저장하는 데 사용됩니다. session.setAttribute ( "목록", 목록); } list.add (책); //응답. encoderedirecturl (java.lang.string url)은 sendRedirect method string url = response.encoderEdirectUrl (request.getContextPath ()+"/servlet/listCartServlet")를 다시 작성하는 데 사용됩니다. System.out.println (URL); Response.SendRedirect (URL); } public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {doget (요청, 응답); }}ListCartServlet
패키지 xdp.gacl.session; import java.io.ioexception; import java.io.printwriter; import java.util.list; import javax.servlet.servletexception; import javax.servlet.http.httpervax.servlet.http.httpepest.httpepest.; javax.servlet.http.httpervletresponse; import javax.servlet.http.httpsession; public class listcartservlet 확장 httpservlet {public void doget (httpservletrequest 요청, httpservletresponse 응답) servletexception, ioexection, ioexection, ioexection { Response.setContentType ( "Text/Html; charset = utf-8"); printwriter out = response.getwriter (); httpsession session = request.getSession (); List <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 요청, httpservletreponse 응답) servletexception, ioexception {doget (요청, 응답); }}쿠키가 비활성화 된 IE8 하의 작동 효과는 다음과 같습니다.
데모 효과
IndexServlet에서 생성 된 HTML 코드를 살펴보면 각 하이퍼 링크에 세션 ID와 다음과 같이 세션 ID가 있음을 알 수 있습니다.
//이 웹 사이트는 다음과 같은 책이 있습니다. <br/> javaweb 개발 <a href = '/javaweb_session_study_20140720/servlet/buyservlet; href = '/javaweb_session_study_20140720/servlet/buyservlet; href = '/javaweb_session_study_20140720/servlet/buyservlet; href = '/javaweb_session_study_20140720/servlet/buyservlet; href = '/javaweb_session_study_20140720/servlet/buyservlet;
따라서 브라우저가 쿠키를 비활성화하면 세션 데이터 공유 문제를 해결하기 위해이 솔루션을 URL로 다시 작성할 수 있습니다. 또한 응답. encoderedirecturl (java.lang.string url) 및 응답. Encodeurl (java.lang.string url)은 두 가지 매우 현명한 방법입니다. 브라우저가 쿠키를 비활성화하지 않는 것으로 감지되면 URL 재 작성이 수행되지 않습니다. 쿠키를 비활성화하지 않고 Firefox 브라우저에서 액세스 할 수 있습니다. 효과는 다음과 같습니다.
데모 애니메이션에서 볼 수 있듯이 브라우저가 처음 액세스 할 때 서버는 세션을 생성 한 다음 쿠키 형태로 세션의 ID를 브라우저로 다시 보냅니다. 응답. encodeurl (java.lang.string url) 메소드도 URL을 다시 작성했습니다. 두 번째 방문을 위해 새로 고침 버튼을 클릭하면 Firefox 브라우저가 쿠키를 비활성화하지 않으므로 두 번째 방문시 쿠키가 제공됩니다. 현재 서버는 현재 클라이언트 브라우저가 쿠키를 비활성화하지 않으므로 응답을 알 수 있습니다. URL을 다시 작성할 필요가없는 EncodeUrl (java.lang.string url) 메소드.
5. 세션 객체를 만들고 파괴하는 타이밍
5.1. 세션 객체의 생성 시간
요청 .getSession () 메소드가 프로그램에서 처음으로 요구 될 때 새 세션이 작성됩니다. isnew () 메소드를 사용하여 세션이 새로 생성되었는지 여부를 결정할 수 있습니다.
예 : 세션을 만듭니다
// 요청 객체의 getsession ()을 사용하여 세션을 가져옵니다. 세션이 존재하지 않는 경우, httpsession 세션 = requestsession (); // idstring sessionid = session.getid (); // get get the idstring sessionid = session.getid (); // 세션이 새로 생성되었는지 판단합니다. IS : "+sessionId);}
5.2. 세션 객체의 파괴 타이밍
세션 객체는 기본적으로 30 분 동안 사용되지 않으며 서버는 세션을 자동으로 파괴합니다. 세션 실패 시간은 Web.xml 파일에서 수동으로 구성 될 수 있습니다.
<? xml version = "1.0"encoding = "utf-8"?> <web-app version = "2.5"xmlns = "http://java.sun.com/xml/xml/ns/javaee"xmlns : xsi = "http://www.w3.org/2001/xmlschema-instance. xsi : schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5_5.xsd"> <display-name> </display-name> <!-세션의 유효한 시간 설정 : 몇 분 안에-> <세션-코피지> <세션-타임 아웃> 15 </session-timeout> </session-config> </web-app>
프로그램에서 실패하도록 세션을 수동으로 설정 해야하는 경우 세션을 수동으로 호출하여 세션을 파괴 할 수 있습니다.
1 httpsession session = request.getSession ();
2 // 세션을 수동으로 호출합니다.
3 session.invalidate ();
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람들이 세션을 배우는 것이 도움이되기를 바랍니다.