方立勋_30天掌握JavaWeb_Session
Session
- 在WEB開發(fā)中,服務(wù)器可以為每個用戶瀏覽器創(chuàng)建一個會話對象(session對象),注意:一個瀏覽器獨(dú)占一個session對象(默認(rèn)情況下)。因此,在需要保存用戶數(shù)據(jù)時,服務(wù)器程序可以把用戶數(shù)據(jù)寫到用戶瀏覽器獨(dú)占的session中,當(dāng)用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數(shù)據(jù),為用戶服務(wù)。
- Session和Cookie的主要區(qū)別在于:
- Cookie是把用戶的數(shù)據(jù)寫給用戶的瀏覽器。
- Session技術(shù)把用戶的數(shù)據(jù)寫到用戶獨(dú)占的session中。
- Session對象由服務(wù)器創(chuàng)建,開發(fā)人員可以調(diào)用request對象的getSession方法得到session對象。
購買Servlet:
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; //購買servlet public class SessionDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); String sessionId = session.getId(); // 將回寫給瀏覽器的Cookie覆蓋,設(shè)置上有效期,那么這個session也就有有效期了 Cookie cookie = new Cookie("JSESSIONID", sessionId); cookie.setPath("/day07"); // 設(shè)置有效期為30分鐘 cookie.setMaxAge(60 * 30); response.addCookie(cookie); session.setAttribute("name", "洗衣機(jī)"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }結(jié)賬Servlet:
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; import javax.servlet.http.HttpSession; //結(jié)賬servelt public class SessionDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setHeader("Content-type", "text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); String product = (String) session.getAttribute("name"); out.print("您購買的商品是:" + product); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } // 第一次執(zhí)行g(shù)etSession創(chuàng)建Session // 關(guān)閉瀏覽器后sesson沒死,三十分鐘沒人用才死 // session也是服務(wù)器中的web資源,session的配置要在web.xml中配置 /* * 配置session60分鐘沒人用摧毀 <session-config> <session-timeout>60</session-timeout> * </session-config> */ // 程序中摧毀session session.invalidate(); /* * request.getSession(false);不創(chuàng)建session,只獲取session,性能稍微高點(diǎn),這個在購買的時候用,比如用戶購買用的request * .getSession();這個得到session * 但是到購物車查看就不要重新創(chuàng)建session了,直接request.getSession(false); * ,如果用request.getSession();的話,用戶直接點(diǎn)購物車也會創(chuàng)建session */ // session是基于cookie的。服務(wù)器為瀏覽器創(chuàng)建的session的id,會通過cookie回寫給瀏覽器,這個cookie是沒有設(shè)置有效期的,瀏覽器一關(guān)就失效了 // 設(shè)置session的有效期,就是設(shè)置回寫給瀏覽器的cookie的有效期。這個Cookie叫JSESSIONID // 沒有設(shè)置有效期的時候打開瀏覽器做一些session操作,然后重開一個瀏覽器 拿到的session是沒有原來的操作的 // 沒有設(shè)置有效期的session,也就是瀏覽器進(jìn)程的session,在瀏覽器中新開選項(xiàng)卡和基于本瀏覽器打開新的瀏覽器是一個窗口(根據(jù)不同瀏覽器而言是不同的IE7打開兩個窗口session的id是不同的,IE8打開兩個窗口session的id就相同) <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <a href="/day07/servlet/SessionDemo1">購買</a> <a href="/day07/servlet/SessionDemo2">結(jié)賬</a> </body> </html>session實(shí)現(xiàn)原理
IE禁用Cookie后的session處理
- 實(shí)驗(yàn)演示禁用Cookie后servlet共享數(shù)據(jù)導(dǎo)致的問題。
- 解決方案:URL重寫
- response. encodeRedirectURL(java.lang.String url)
用于對sendRedirect方法后的url地址進(jìn)行重寫。 - response. encodeURL(java.lang.String url)
用于對表單action和超鏈接的url地址進(jìn)行重寫
- response. encodeRedirectURL(java.lang.String url)
- 附加:
- Session的失效
- Web.xml文件配置session失效時間
session案例
1. 使用Session完成用戶登陸
2. 利用Session防止表單重復(fù)提交
3. 利用Session實(shí)現(xiàn)一次性驗(yàn)證碼
session防止表單重復(fù)提交
1.方法一
在前臺處理:在瀏覽器端用JavaScript代碼防止
2.方法二
在服務(wù)器端:用戶提交表單,服務(wù)器端給提交的表單帶唯一標(biāo)識的隨機(jī)數(shù)。
md5碼
base64
- 表單頁面由servlet程序生成,servlet為每次產(chǎn)生的表單頁面分配一個唯一的隨機(jī)標(biāo)識號,并在FORM表單的一個隱藏字段中設(shè)置這個標(biāo)識號,同時在當(dāng)前用戶的Session域中保存這個標(biāo)識號。
- 當(dāng)用戶提交FORM表單時,負(fù)責(zé)處理表單提交的serlvet得到表單提交的標(biāo)識號,并與session中存儲的標(biāo)識號比較,如果相同則處理表單提交,處理完后清除當(dāng)前用戶的Session域中存儲的標(biāo)識號。
- 在下列情況下,服務(wù)器程序?qū)⒕芙^用戶提交的表單請求:
- 存儲Session域中的表單標(biāo)識號與表單提交的標(biāo)識號不同
- 當(dāng)前用戶的Session中不存在表單標(biāo)識號
- 用戶提交的表單數(shù)據(jù)中沒有標(biāo)識號字段
- 編寫工具類生成表單標(biāo)識號:TokenProcessor
三個域?qū)ο蟮目偨Y(jié)
在什么情況下使用什么容器?
使用request:
程序產(chǎn)生數(shù)據(jù)之后,顯示完了就沒用了,使用request。eg:你這個程序找servlet,servlet產(chǎn)生數(shù)據(jù)帶給jsp,jsp顯示完數(shù)據(jù),數(shù)據(jù)就沒用了。
使用session:
我這個程序除了產(chǎn)生數(shù)據(jù),除了頁面顯示外,等一會兒還需要用到,這個時候需要session。例子1:圖片文字校驗(yàn),文字顯示了,但是在服務(wù)器端還需要用到,需要去校驗(yàn)。例子2:用戶登入,用戶登入這個狀態(tài)還需要用到。
使用ServletContent:
我這個程序產(chǎn)生了數(shù)據(jù),不僅是給自己用,等會兒還要給別人用。例子:聊天室。
問題?:
服務(wù)器是如何做到一個session為一個瀏覽器的多次請求而服務(wù)
- 服務(wù)器創(chuàng)建session出來后,會把 session的id號,以cookie的形式回寫給客戶機(jī),這樣,只要客戶機(jī)的瀏覽器不關(guān),再去訪問服務(wù)器時,都會帶著session 的id號去,服務(wù)器發(fā)現(xiàn)客戶機(jī)帶session id過來了,就會使用內(nèi)存中與之對應(yīng)的session為之服務(wù)
如何做到一個session為多個瀏覽器服務(wù)
- 服務(wù)器第一次創(chuàng)建session,程序員把session id號,手工以cookie的形式回送給瀏覽器,并設(shè)置cookie的有效期這樣,即使用戶的瀏覽器關(guān)了,開新瀏覽器時,還會帶著session id找服務(wù)器,服務(wù)器從而就可以用內(nèi)存中與之對應(yīng)的session為第二個瀏覽器窗口服務(wù)
如何做用戶禁用cookie后,session還能為多次請求而服務(wù)
- 把用戶可能點(diǎn)的每一個超鏈接后面,都跟上用戶的session id號
session對象的創(chuàng)建和銷毀時機(jī)
- 用戶第一次request.getSession時
- session對象默認(rèn)30分鐘沒有使用,則服務(wù)器會自動銷毀session
- 用戶在web.xml文件中手工配置session的失效時間
- 用戶可以手工調(diào)用session.invalidate方法,摧毀session
總結(jié)
以上是生活随笔為你收集整理的方立勋_30天掌握JavaWeb_Session的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat version 7.0 o
- 下一篇: 方立勋_30天掌握JavaWeb_div