日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

方立勋_30天掌握JavaWeb_Session

發(fā)布時(shí)間:2023/12/20 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 方立勋_30天掌握JavaWeb_Session 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Session

  • 在WEB開(kāi)發(fā)中,服務(wù)器可以為每個(gè)用戶瀏覽器創(chuàng)建一個(gè)會(huì)話對(duì)象(session對(duì)象),注意:一個(gè)瀏覽器獨(dú)占一個(gè)session對(duì)象(默認(rèn)情況下)。因此,在需要保存用戶數(shù)據(jù)時(shí),服務(wù)器程序可以把用戶數(shù)據(jù)寫(xiě)到用戶瀏覽器獨(dú)占的session中,當(dāng)用戶使用瀏覽器訪問(wèn)其它程序時(shí),其它程序可以從用戶的session中取出該用戶的數(shù)據(jù),為用戶服務(wù)。
  • Session和Cookie的主要區(qū)別在于:
    • Cookie是把用戶的數(shù)據(jù)寫(xiě)給用戶的瀏覽器。
    • Session技術(shù)把用戶的數(shù)據(jù)寫(xiě)到用戶獨(dú)占的session中。
  • Session對(duì)象由服務(wù)器創(chuàng)建,開(kāi)發(fā)人員可以調(diào)用request對(duì)象的getSession方法得到session對(duì)象。

購(gòu)買(mǎi)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; //購(gòu)買(mǎi)servlet public class SessionDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); String sessionId = session.getId(); // 將回寫(xiě)給瀏覽器的Cookie覆蓋,設(shè)置上有效期,那么這個(gè)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("您購(gòu)買(mǎi)的商品是:" + product); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } // 第一次執(zhí)行g(shù)etSession創(chuàng)建Session // 關(guān)閉瀏覽器后sesson沒(méi)死,三十分鐘沒(méi)人用才死 // session也是服務(wù)器中的web資源,session的配置要在web.xml中配置 /* * 配置session60分鐘沒(méi)人用摧毀 <session-config> <session-timeout>60</session-timeout> * </session-config> */ // 程序中摧毀session session.invalidate(); /* * request.getSession(false);不創(chuàng)建session,只獲取session,性能稍微高點(diǎn),這個(gè)在購(gòu)買(mǎi)的時(shí)候用,比如用戶購(gòu)買(mǎi)用的request * .getSession();這個(gè)得到session * 但是到購(gòu)物車查看就不要重新創(chuàng)建session了,直接request.getSession(false); * ,如果用request.getSession();的話,用戶直接點(diǎn)購(gòu)物車也會(huì)創(chuàng)建session */ // session是基于cookie的。服務(wù)器為瀏覽器創(chuàng)建的session的id,會(huì)通過(guò)cookie回寫(xiě)給瀏覽器,這個(gè)cookie是沒(méi)有設(shè)置有效期的,瀏覽器一關(guān)就失效了 // 設(shè)置session的有效期,就是設(shè)置回寫(xiě)給瀏覽器的cookie的有效期。這個(gè)Cookie叫JSESSIONID // 沒(méi)有設(shè)置有效期的時(shí)候打開(kāi)瀏覽器做一些session操作,然后重開(kāi)一個(gè)瀏覽器 拿到的session是沒(méi)有原來(lái)的操作的 // 沒(méi)有設(shè)置有效期的session,也就是瀏覽器進(jìn)程的session,在瀏覽器中新開(kāi)選項(xiàng)卡和基于本瀏覽器打開(kāi)新的瀏覽器是一個(gè)窗口(根據(jù)不同瀏覽器而言是不同的IE7打開(kāi)兩個(gè)窗口session的id是不同的,IE8打開(kāi)兩個(gè)窗口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">購(gòu)買(mǎi)</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)致的問(wèn)題。
  • 解決方案:URL重寫(xiě)
    • response. encodeRedirectURL(java.lang.String url)
      用于對(duì)sendRedirect方法后的url地址進(jìn)行重寫(xiě)。
    • response. encodeURL(java.lang.String url)
      用于對(duì)表單action和超鏈接的url地址進(jìn)行重寫(xiě)
  • 附加:
    • Session的失效
    • Web.xml文件配置session失效時(shí)間

session案例
1. 使用Session完成用戶登陸
2. 利用Session防止表單重復(fù)提交
3. 利用Session實(shí)現(xiàn)一次性驗(yàn)證碼

session防止表單重復(fù)提交

1.方法一
在前臺(tái)處理:在瀏覽器端用JavaScript代碼防止

<script type="text/javascript">var isCommited = false;function checkPost(){if(!isCommited){//document.getElementById("sub").disabled = true;isCommited = true;return true;}else{alert("不能重復(fù)提交");return false;}}</script>

2.方法二
在服務(wù)器端:用戶提交表單,服務(wù)器端給提交的表單帶唯一標(biāo)識(shí)的隨機(jī)數(shù)。
md5碼
base64

  • 表單頁(yè)面由servlet程序生成,servlet為每次產(chǎn)生的表單頁(yè)面分配一個(gè)唯一的隨機(jī)標(biāo)識(shí)號(hào),并在FORM表單的一個(gè)隱藏字段中設(shè)置這個(gè)標(biāo)識(shí)號(hào),同時(shí)在當(dāng)前用戶的Session域中保存這個(gè)標(biāo)識(shí)號(hào)。
  • 當(dāng)用戶提交FORM表單時(shí),負(fù)責(zé)處理表單提交的serlvet得到表單提交的標(biāo)識(shí)號(hào),并與session中存儲(chǔ)的標(biāo)識(shí)號(hào)比較,如果相同則處理表單提交,處理完后清除當(dāng)前用戶的Session域中存儲(chǔ)的標(biāo)識(shí)號(hào)。
  • 在下列情況下,服務(wù)器程序?qū)⒕芙^用戶提交的表單請(qǐng)求:
    • 存儲(chǔ)Session域中的表單標(biāo)識(shí)號(hào)與表單提交的標(biāo)識(shí)號(hào)不同
    • 當(dāng)前用戶的Session中不存在表單標(biāo)識(shí)號(hào)
    • 用戶提交的表單數(shù)據(jù)中沒(méi)有標(biāo)識(shí)號(hào)字段
  • 編寫(xiě)工具類生成表單標(biāo)識(shí)號(hào):TokenProcessor

三個(gè)域?qū)ο蟮目偨Y(jié)

在什么情況下使用什么容器?

使用request:
程序產(chǎn)生數(shù)據(jù)之后,顯示完了就沒(méi)用了,使用request。eg:你這個(gè)程序找servlet,servlet產(chǎn)生數(shù)據(jù)帶給jsp,jsp顯示完數(shù)據(jù),數(shù)據(jù)就沒(méi)用了。

使用session:
我這個(gè)程序除了產(chǎn)生數(shù)據(jù),除了頁(yè)面顯示外,等一會(huì)兒還需要用到,這個(gè)時(shí)候需要session。例子1:圖片文字校驗(yàn),文字顯示了,但是在服務(wù)器端還需要用到,需要去校驗(yàn)。例子2:用戶登入,用戶登入這個(gè)狀態(tài)還需要用到。

使用ServletContent:
我這個(gè)程序產(chǎn)生了數(shù)據(jù),不僅是給自己用,等會(huì)兒還要給別人用。例子:聊天室。

問(wèn)題?:

  • 服務(wù)器是如何做到一個(gè)session為一個(gè)瀏覽器的多次請(qǐng)求而服務(wù)

    • 服務(wù)器創(chuàng)建session出來(lái)后,會(huì)把 session的id號(hào),以cookie的形式回寫(xiě)給客戶機(jī),這樣,只要客戶機(jī)的瀏覽器不關(guān),再去訪問(wèn)服務(wù)器時(shí),都會(huì)帶著session 的id號(hào)去,服務(wù)器發(fā)現(xiàn)客戶機(jī)帶session id過(guò)來(lái)了,就會(huì)使用內(nèi)存中與之對(duì)應(yīng)的session為之服務(wù)
  • 如何做到一個(gè)session為多個(gè)瀏覽器服務(wù)

    • 服務(wù)器第一次創(chuàng)建session,程序員把session id號(hào),手工以cookie的形式回送給瀏覽器,并設(shè)置cookie的有效期這樣,即使用戶的瀏覽器關(guān)了,開(kāi)新瀏覽器時(shí),還會(huì)帶著session id找服務(wù)器,服務(wù)器從而就可以用內(nèi)存中與之對(duì)應(yīng)的session為第二個(gè)瀏覽器窗口服務(wù)
  • 如何做用戶禁用cookie后,session還能為多次請(qǐng)求而服務(wù)

    • 把用戶可能點(diǎn)的每一個(gè)超鏈接后面,都跟上用戶的session id號(hào)
  • session對(duì)象的創(chuàng)建和銷毀時(shí)機(jī)

    • 用戶第一次request.getSession時(shí)
    • session對(duì)象默認(rèn)30分鐘沒(méi)有使用,則服務(wù)器會(huì)自動(dòng)銷毀session
      • 用戶在web.xml文件中手工配置session的失效時(shí)間
      • 用戶可以手工調(diào)用session.invalidate方法,摧毀session
  • 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的方立勋_30天掌握JavaWeb_Session的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。