JavaWeb中Session對象的進修筆記。本站提示廣大學習愛好者:(JavaWeb中Session對象的進修筆記)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaWeb中Session對象的進修筆記正文
1、Session簡略引見
在WEB開辟中,辦事器可認為每一個用戶閱讀器創立一個會話對象(session對象),留意:一個閱讀器獨有一個session對象(默許情形下)。是以,在須要保留用戶數據時,辦事器法式可以把用戶數據寫到用戶閱讀器獨有的session中,當用戶應用閱讀器拜訪其它法式時,其它法式可以從用戶的session中掏出該用戶的數據,為用戶辦事。
2、Session和Cookie的重要差別
Cookie是把用戶的數據寫給用戶的閱讀器。
Session技巧把用戶的數據寫到用戶獨有的session中。
Session對象由辦事器創立,開辟人員可以挪用request對象的getSession辦法獲得session對象。
3、session完成道理
3.1、辦事器是若何完成一個session為一個用戶閱讀器辦事的?
辦事器創立session出來後,會把session的id號,以cookie的情勢回寫給客戶機,如許,只需客戶機的閱讀器不關,再去拜訪辦事器時,都邑帶著session的id號去,辦事器發明客戶機閱讀器帶session id過去了,就會應用內存中與之對應的session為之辦事。可以用以下的代碼證實:
package 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.HttpServletResponse; import javax.servlet.http.HttpSession; public class SessionDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF=8"); response.setContentType("text/html;charset=UTF-8"); //應用request對象的getSession()獲得session,假如session不存在則創立一個 HttpSession session = request.getSession(); //將數據存儲到session中 session.setAttribute("data", "孤獨蒼狼"); //獲得session的Id String sessionId = session.getId(); //斷定session是否是新創立的 if (session.isNew()) { response.getWriter().print("session創立勝利,session的id是:"+sessionId); }else { response.getWriter().print("辦事器曾經存在該session了,session的id是:"+sessionId); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
第一次拜訪時,辦事器會創立一個新的sesion,而且把session的Id以cookie的情勢發送給客戶端閱讀器,以下圖所示:
點擊刷新按鈕,再次要求辦事器,此時便可以看到閱讀器再要求辦事器時,會把存儲到cookie中的session的Id一路傳遞到辦事器端了,以下圖所示:
我料想request.getSession()辦法外部新創立了Session以後必定是做了以下的處置
//獲得session的Id String sessionId = session.getId(); //將session的Id存儲到名字為JSESSIONID的cookie中 Cookie cookie = new Cookie("JSESSIONID", sessionId); //設置cookie的有用途徑 cookie.setPath(request.getContextPath()); response.addCookie(cookie);
4、閱讀器禁用Cookie後的session處置
4.1、IE8禁用cookie
對象->internet選項->隱私->設置->將滑軸拉到最頂上(阻攔一切cookies)
4.2、處理計劃:URL重寫
response.encodeRedirectURL(java.lang.String url) 用於對sendRedirect辦法後的url地址停止重寫。
response.encodeURL(java.lang.String url)用於對表單action和超鏈接的url地址停止重寫
4.3、典范:禁用Cookie後servlet同享Session中的數據
IndexServlet
package 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.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //首頁:列出一切書 public class IndexServlet 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(); 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(); //response. encodeURL(java.lang.String url)用於對表單action和超鏈接的url地址停止重寫 url = response.encodeURL(url);//將超鏈接的url地址停止重寫 out.println(book.getName() + " <a href='"+url+"'>購置</a><br/>"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws 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開辟")); map.put("2", new Book("2","spring開辟")); map.put("3", new Book("3","hibernate開辟")); map.put("4", new Book("4","struts開辟")); map.put("5", new Book("5","ajax開辟")); } public static Map<String,Book> getAll(){ return map; } } class Book{ private String id; private String name; 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
package xdp.gacl.session; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class BuyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); Book book = DB.getAll().get(id); //獲得用戶想買的書 HttpSession session = request.getSession(); List<Book> list = (List) session.getAttribute("list"); //獲得用戶用於保留一切書的容器 if(list==null){ list = new ArrayList<Book>(); session.setAttribute("list", list); } list.add(book); //response. encodeRedirectURL(java.lang.String url)用於對sendRedirect辦法後的url地址停止重寫 String url = response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCartServlet"); System.out.println(url); response.sendRedirect(url); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
ListCartServlet
package 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.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class ListCartServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 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("對不起,您還沒有購置任何商品!!"); return; } //顯示用戶買過的商品 out.write("您買過以下商品:<br>"); for(Book book : list){ out.write(book.getName() + "<br/>"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
在禁用了cookie的IE8下的運轉後果以下:
演示後果
經由過程檢查IndexServlet生成的html代碼可以看到,每個超鏈接前面都帶上了session的Id,以下所示
//本網站有以下書: <br/>javaweb開辟 <a href='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=1'>購置</a><br/> //spring開辟 <a href='/JavaWeb_Session_Study_20140720/servlet/BuyServlet;jsessionid=96BDFB9D87A08D5AB1EAA2537CDE2DB2?id=2'>購置</a><br/> // hibernate開辟 <a 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重寫這類處理計劃處理Session數據同享成績。並且response. encodeRedirectURL(java.lang.String url) 和response. encodeURL(java.lang.String url)是兩個異常智能的辦法,當檢測到閱讀器沒有禁用cookie時,那末就不停止URL重寫了。我們在沒有禁用cookie的火狐閱讀器下拜訪,後果以下:
從演示動畫中可以看到,閱讀器第一次拜訪時,辦事器創立Session,然後將Session的Id以Cookie的情勢發送回給閱讀器,response. encodeURL(java.lang.String url)辦法也將URL停止了重寫,當點擊刷新按鈕第二次拜訪,因為火狐閱讀器沒有禁用cookie,所以第二次拜訪時帶上了cookie,此時辦事器便可以曉得以後的客戶端閱讀器並沒有禁用cookie,那末就告訴response. encodeURL(java.lang.String url)辦法不消將URL停止重寫了。
5、session對象的創立和燒毀機會
5.1、session對象的創立機會
在法式中第一次挪用request.getSession()辦法時就會創立一個新的Session,可以用isNew()辦法來斷定Session是否是新創立的
典范:創立session
//應用request對象的getSession()獲得session,假如session不存在則創立一個 HttpSession session = request.getSession(); //獲得session的Id String sessionId = session.getId(); //斷定session是否是新創立的 if (session.isNew()) { response.getWriter().print("session創立勝利,session的id是:"+sessionId); }else { response.getWriter().print("辦事器曾經存在session,session的id是:"+sessionId); }
5.2、session對象的燒毀機會
session對象默許30分鐘沒有應用,則辦事器會主動燒毀session,在web.xml文件中可以手工設置裝備擺設session的掉效時光,例如:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/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.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 設置Session的有用時光:以分鐘為單元--> <session-config> <session-timeout>15</session-timeout> </session-config> </web-app>
當須要在法式中手動設置Session掉效時,可以手工挪用session.invalidate辦法,摧毀session。
1 HttpSession session = request.getSession();
2 //手工挪用session.invalidate辦法,摧毀session
3 session.invalidate();
以上就是本文的全體內容,願望對年夜家進修session有所贊助。