來源:小木鏟 發(fā)布時間:2018-11-24 10:14:43 閱讀量:1195
會話:
什么是會話?
?會話可簡單理解為:用戶開一個瀏覽器,點擊多個超鏈接,訪問服務(wù)器多個web資源,然后關(guān)閉瀏覽器,整個過程稱之為一個會話。
會話過程中要解決的一些問題?
?每個用戶與服務(wù)器進(jìn)行交互的過程中,各自會有一些數(shù)據(jù),程序要想辦法保存每個用戶的數(shù)據(jù)。
?例如:用戶點擊超鏈接通過一個servlet購買了一個商品,程序應(yīng)該保存用戶購買的商品,以便于用戶點結(jié)帳servlet時,結(jié)帳servlet可以得到用戶商品為用戶結(jié)帳。
保存會話數(shù)據(jù)的兩種技術(shù):
Cookie
?Cookie是客戶端技術(shù),程序把每個用戶的數(shù)據(jù)以cookie的形式寫給用戶各自的瀏覽器。當(dāng)用戶使用瀏覽器再去訪問服務(wù)器中的web資源時,就會帶著各自的數(shù)據(jù)去。這樣,web資源處理的就是用戶各自的數(shù)據(jù)了。
?
Session
?Session是服務(wù)器端技術(shù),利用這個技術(shù),服務(wù)器在運行時可以為每一個用戶的瀏覽器創(chuàng)建一個其獨享的session對象,由于session為用戶瀏覽器獨享,所以用戶在訪問服務(wù)器的web資源時,可以把各自的數(shù)據(jù)放在各自的session中,當(dāng)用戶再去訪問服務(wù)器中的其它web資源時,其它web資源再從用戶各自的session中取出數(shù)據(jù)為用戶服務(wù)。
Cookie技術(shù):
Cookie快速入門:
?Cookie 是一個小的文本數(shù)據(jù),由服務(wù)器端生成,發(fā)送給客戶端瀏覽器,客戶端瀏覽器如果設(shè)置為啟用 Cookie,則會將這個小文本數(shù)據(jù)保存到某個目錄下的文本文件內(nèi)。
?下次登錄同一頁面,瀏覽器則會自動將Cookie傳回服務(wù)器端。
?Cookie 值的形式:key-value。
顯示用戶上次訪問時間
?判斷用戶是否是第一次訪問
?如果是第一次訪問,需要輸出歡迎,并且記錄當(dāng)前的時間,保存到cookie中,再回寫到瀏覽器端。
?如果不是第一次訪問,獲取cookie中的時間,輸出時間,并且記錄當(dāng)前的時間,保存到cookie中,再回寫到瀏覽器端。
Cookie相當(dāng)于一個證書
Cookie API:
javax.servlet.http.Cookie類用于創(chuàng)建一個Cookie,response接口也中定義了一個addCookie方法,它用于在其響應(yīng)頭中增加一個相應(yīng)的Set-Cookie頭字段。 同樣,request接口中也定義了一個getCookies方法,它用于獲取客戶端提交的Cookie。Cookie類的方法:
public Cookie(String name,String value)
setValue與getValue方法
setMaxAge與getMaxAge方法
setPath與getPath方法
setDomain與getDomain方法
getName方法
Cookie細(xì)節(jié):
一個Cookie只能標(biāo)識一種信息,它至少含有一個標(biāo)識該信息的名稱(NAME)和設(shè)置值(VALUE)。
一個WEB站點可以給一個WEB瀏覽器發(fā)送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie。
瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
如果創(chuàng)建了一個cookie,并將他發(fā)送到瀏覽器,默認(rèn)情況下它是一個會話級別的cookie(即存儲在瀏覽器的內(nèi)存中),用戶退出瀏覽器之后即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。
刪除持久cookie,可以將cookie最大時效設(shè)為0,注意,刪除cookie時,path必須一致,否則不會刪除
Cookie應(yīng)用:
?1.用戶驗證簡略化。將ID、密碼作為cookie信息發(fā)送給用戶,在以后的訪問中可以獲得到cookie,簡化輸入。
?2.網(wǎng)上購物等應(yīng)用。每將一個商品放入購物車,就會發(fā)送cookie給用戶。
?3.把握用戶訪問的時間。訪問時,將時間作為cookie發(fā)送給用戶,退出時將該cookie返回給web服務(wù)器,這樣可以掌握訪問該站點的時間長度。
?4.推薦系統(tǒng)與搜索引擎。
?5編寫商品信息列表,給每個商品起唯一的id值,通過id傳值。
?6判斷是否是第一次訪問
?7如果是第一次訪問,創(chuàng)建cookie,記錄商品id,回寫到瀏覽器
如果不是第一次訪問,獲取cookie中的商品信息,但是需要判斷cookie中是否已經(jīng)包含該商品,如果包含就不用處理,如果不包含,可以取出商品的id,累加操作。(可以編寫一個判斷是否包含的方法)
?9重定向到商品列表頁面,把商品循環(huán)到列表頁面
?10清除瀏覽記錄
顯示上次瀏覽商品的實現(xiàn)過程:
?Cookie 操作主要用到以下幾個方法:
? response.addCookie(Cookie c):將 Cookie 寫入客戶端
Cookie.setMaxAge(int second):設(shè)置 Cookie 有效時間
寫入Cookie的過程:
?步驟1:創(chuàng)建cookie對象。Cookie構(gòu)造函數(shù)(名稱、值),皆為字符串類型。
?步驟2:設(shè)置有效時間。sexMaxAge(),單位為s(秒)。
?步驟3:寫入Http響應(yīng)報文。通過response.addCookie完成。
Cookie 讀取操作:
?讀取客戶端 Cookie方法:
? Cookie[] request.getCookies():讀取客戶端所有 Cookie,以數(shù)組形式返回。然后再遍歷數(shù)組,根據(jù)名稱找到所需的Cookie.
從客戶端讀取cookie:
?步驟1:調(diào)用request.getCookies( )。
?步驟2:對數(shù)組進(jìn)行循環(huán),調(diào)用每個cookie的getName方法,直到找到感興趣的cookie位置。
Cookie的安全性:
?盜取的方法:
?利用跨站腳本技術(shù),將信息發(fā)給目標(biāo)服務(wù)器;為了隱藏 URL,甚至可以結(jié)合 Ajax(異步 Javascript 和 XML 技術(shù))在后臺竊取 Cookie
?通過某些軟件,竊取硬盤下的 Cookie。一般說來,當(dāng)用戶訪問完某站點后,Cookie文件會存在機器的某個文件夾下,因此可以通過某些盜取和分析軟件來盜取 Cookie。
?利用客戶端腳本盜取 Cookie。在 Javascript 中有很多 API 可以讀取客戶端 Cookie,可以將這些代碼隱藏在一個程序(如畫圖)中,很隱秘地得到 Cookie 的值
例子>顯示用戶訪問時間:
創(chuàng)建MyCookieUtil類,在里面寫一個判斷cookieshu的方法:
package cn.itcast.utils;
import javax.servlet.http.Cookie;
/**
* 操作cookie
* @author Administrator
*
*/
public class MyCookieUtil {
/**
* 通過cookie的名稱來獲取指定的cookie,如果找到返回cookie,如果找不到,返回null
* @param cookies
* @param cookieName
* @return
*/
public static Cookie getCookieByName(Cookie [] cookies,String cookieName){
// 如果cookies數(shù)組為空,返回null
if(cookies == null){
return null;
}else{
// 如果不為空,循環(huán)遍歷,拿到每一個cookie,和cookieName去判斷,如果匹配成功了,返回。
for (Cookie cookie : cookies) {
// 拿到每一個cookie,和cookieName去判斷,如果匹配成功了,返回。
// 獲取cookie的名稱
if(cookie.getName().equals(cookieName)){
// 匹配成功了
return cookie;
}
}
return null;
}
}
}
LasTimeServlet.java,在此類中調(diào)用MyCookieUtil類的getCookieByName方法:
package cn.itcast.cookie;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
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 cn.itcast.utils.MyCookieUtil;
/**
* 顯示用戶上次的訪問時間
* @author Administrator
*
*/
public class LatTimeServlet extends HttpServlet {
private static final long serialVersionUID = -6068764497514719951L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 1.先判斷是否是第一次訪問?因為:第一次訪問和第n次處理的業(yè)務(wù)是不同的。
* 2.如果是第一次訪問:先輸出一句歡迎,記錄當(dāng)前的時間,保存到cookie中,回寫到瀏覽器端。
* 3.如果不是第一次訪問,獲取cookie中的值(就是你上次的訪問的時間),把時間輸出到頁面上。記錄當(dāng)前的時間,保存到cookie中?;貙懙綖g覽器端。
*/
// 設(shè)置字符中文亂碼的問題
response.setContentType("text/html;charset=UTF-8");
// 先判斷是否是第一次訪問?先獲取所有的cookie數(shù)組,查找咱們定義的cookie。
// 如果找到咱們定義的cookie,說明不是第一次訪問。如果沒找到,那就是說明是第一次訪問。
// 獲取cookie的數(shù)組
Cookie [] cookies = request.getCookies();
// 查找自己定義的cookie,查找指定名稱的cookie。 (Cookie c = new Cookie("last","cookie的值"));
Cookie cookie = MyCookieUtil.getCookieByName(cookies, "last");
// 記錄當(dāng)前的時間
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 當(dāng)前的時間的字符串
String sDate = sdf.format(date);
// 如果cookie為null,說明是第一次訪問
if(cookie == null){
// 我是第一次訪問
// 輸出一句話
response.getWriter().print("<h3>親,帶錢再來哦!!</h3>");
// 記錄當(dāng)前的時間
// 把當(dāng)前的時間回保存cookie中
Cookie c = new Cookie("last", sDate);
// 設(shè)置有效時間
c.setMaxAge(60*60); // 1小時
c.setPath("/day11"); // 有效路徑就變成了/day11
// 回寫
response.addCookie(c);
}else{
// 獲取上次的訪問時間(從cookie中獲?。?/p>
String lasttime = cookie.getValue();
// 把上次的時間輸出到頁面上去
response.getWriter().print("<h3>親,您上次的訪問時間是"+lasttime+",下次快點來哦!!</h3>");
// 記錄當(dāng)前的時間
cookie.setValue(sDate);
// 設(shè)置有效時間
cookie.setMaxAge(60*60); // 1小時
cookie.setPath("/day11"); // 有效路徑就變成了/day11
// 回寫
response.addCookie(cookie);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
例子:商品的瀏覽記錄:
前臺程序:
productList.jsp
<%@page import="cn.itcast.utils.MyCookieUtil"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>商品的列表頁面</title>
<style type="text/css">
.img1{
width: 160px;
height: 140px;
}
.img2{
width: 80px;
height: 70px;
}
</style>
</head>
<body>
<img class="img1" src="/day11/img/1.jpg"><a href="/day11/product?id=1">手電筒</a>
<img class="img1" src="/day11/img/2.jpg"><a href="/day11/product?id=2">電話</a>
<img class="img1" src="/day11/img/3.jpg"><a href="/day11/product?id=3">電視</a>
<br/>
<img class="img1" src="/day11/img/4.jpg"><a href="/day11/product?id=4">冰箱</a>
<img class="img1" src="/day11/img/5.jpg"><a href="/day11/product?id=5">手表</a>
<img class="img1" src="/day11/img/6.jpg"><a href="/day11/product?id=6">電腦</a>
<h3>商品的瀏覽器記錄</h3>
<h4><a href="/day11/removeProduct">清除瀏覽記錄</a></h4>
<%
// 獲取到cookie的內(nèi)容 可以把cookie的內(nèi)容動態(tài)的顯示到頁面上
Cookie [] cookies = request.getCookies();
// 通過指定名稱來獲取cookie
Cookie cookie = MyCookieUtil.getCookieByName(cookies, "product");
// 判斷cookie不為空
if(cookie != null){
// 獲取cookie的值
String longid = cookie.getValue(); // product=1,2,3
// 切割
String [] ids = longid.split(",");
// 循環(huán)遍歷
for(String id : ids){
%>
<img class="img2" src="/day11/img/<%= id %>.jpg">++++"/day11/img/<%= id %>.jpg"
<%
}
}
%>
</body>
</html>
后臺程序:
ProdcutServlet.java
package cn.itcast.cookie;
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 cn.itcast.utils.MyCookieUtil;
/**
* 商品瀏覽記錄的后臺
* @author Administrator
*
*/
public class ProductServlet extends HttpServlet {
private static final long serialVersionUID = -5747737695587699577L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 0.獲取傳過來id值
* 1.判斷是否是第一次訪問?(獲取指定名稱的cookie如果為null,說明是第一次訪問)
* * 如果是第一次訪問,把商品的id保存到cookie中,回寫cookie。
* * 如果不是第一次訪問
* * 先獲取cookie中的內(nèi)容,進(jìn)行判斷(判斷cookie中是否包含當(dāng)前點擊的商品)
* * 如果cookie中已經(jīng)包含了該商品,那么就不用處理了
* * 如果不包含,在cookie中追加該商品 product=1 product=1,2
* 2.重定向商品的列表頁面
* 3.需要在商品的列表頁面中獲取cookie的中內(nèi)容,把內(nèi)容顯示到頁面上。
*/
// 先獲取商品的id
String id = request.getParameter("id");
// 獲取cookie的數(shù)組
Cookie [] cookies = request.getCookies();
// 查找指定名稱的cookie
Cookie cookie = MyCookieUtil.getCookieByName(cookies, "product");
// 如果cookie為null,說明是第一次訪問,把商品的id保存到cookie中,回寫
if(cookie == null){
// 是第一次
Cookie c = new Cookie("product",id);
// 設(shè)置有效時間
c.setMaxAge(60*60*24);
// 設(shè)置有效的路徑
c.setPath("/day11");
// 回寫
response.addCookie(c);
}else{
// 說明cookie不為空
// 先獲取cookie的內(nèi)容(拿出來做判斷),cookie有可能包含當(dāng)前的商品
String longid = cookie.getValue(); // product=1,2,3 假如說當(dāng)前點擊的是4 product=4,1,2,3
// 判斷字符串ids是否包含當(dāng)前的id
// 把ids字符串切割成數(shù)組
String [] ids = longid.split(",");
if(!checkId(ids,id)){
// 說明不包含該商品
cookie.setValue(id+","+longid);
cookie.setMaxAge(60*60*24);
// 設(shè)置有效的路徑
cookie.setPath("/day11");
// 回寫cookie
response.addCookie(cookie);
}
}
// 重定向或者轉(zhuǎn)發(fā)(使用request域存儲內(nèi)容,必須是轉(zhuǎn)發(fā))request.getContextPath()獲取虛擬路徑,默認(rèn)和項目名稱相同
response.sendRedirect(request.getContextPath()+"/cookie/productList.jsp");
}
/**
* 判斷ids的數(shù)組中是否包含id的值
* @param ids
* @param id
* @return
*/
private boolean checkId(String[] ids, String id) {
for (String s : ids) {
// 獲取s和id匹配
if(s.equals(id)){
// 包含
return true;
}
}
// 不包含
return false;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
session:
在WEB開發(fā)中,服務(wù)器可以為每個用戶瀏覽器創(chuàng)建一個會話對象(session對象),注意:一個瀏覽器獨占一個session對象(默認(rèn)情況下)。因此,在需要保存用戶數(shù)據(jù)時,服務(wù)器程序可以把用戶數(shù)據(jù)寫到用戶瀏覽器獨占的session中,當(dāng)用戶使用瀏覽器訪問其它程序時,其它程序可以從用戶的session中取出該用戶的數(shù)據(jù),為用戶服務(wù)。
Session和Cookie的主要區(qū)別在于:
?Cookie是把用戶的數(shù)據(jù)寫給用戶的瀏覽器。
?Session技術(shù)把用戶的數(shù)據(jù)寫到用戶獨占的session中(服務(wù)器端)。
Session對象由服務(wù)器創(chuàng)建,開發(fā)人員可以調(diào)用request對象的getSession方法得到session對象。
session為每個瀏覽器保存數(shù)據(jù):
session實現(xiàn)原理:
session案例:
使用Session完成簡單的購物車功能
?接收傳過來的商品id
?使用Map集合代碼購物車(key商品名稱,value商品數(shù)量)
?從session中獲取購物車
?如果獲取不到,是第一次,創(chuàng)建Map,存入商品和數(shù)量
?如果獲取到,不是第一次,拿到Map,判斷Map中是否包含商品,如果包含取出數(shù)量+1,如果不存在,直接存入。
?把購物車存入到session中
前臺:
cartlist.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>手電筒<a href="/day11/cart?id=1">加入購物車</a></h3>
<h3>電視<a href="/day11/cart?id=2">加入購物車</a></h3>
<h3>冰箱<a href="/day11/cart?id=3">加入購物車</a></h3>
<h3>洗衣機<a href="/day11/cart?id=4">加入購物車</a></h3>
<h3>電話<a href="/day11/cart?id=5">加入購物車</a></h3>
<h3>電腦<a href="/day11/cart?id=6">加入購物車</a></h3>
</body>
</html>
后臺程序:
Carservlet.java:
package cn.itcast.session;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 購物車的后臺
* @author Administrator
*
*/
public class CartServlet extends HttpServlet {
private static final long serialVersionUID = -4944571720622706932L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 0.Map<String,Integer> cart 車?yán)锩娣派唐返拿Q和數(shù)量。
* 1.接收參數(shù),接收的id值。把id值轉(zhuǎn)換成相應(yīng)的商品。
* 2.判斷是否是第一次購買(從session中獲取車,如果車是null,肯定是第一次購買)
* * 如果是一次購買,創(chuàng)建一個購物車,把該商品和數(shù)量存入到車中,再把車存入到session中。
* * 如果不是第一次購買
* * 先判斷車中是否包含該商品,因為如果包含該商品了,數(shù)量+1
* * 如果不包含該商品,直接把該商品存入車中。
* 3.轉(zhuǎn)發(fā)或者重定向到繼續(xù)購物或者結(jié)算頁面
* 4.去結(jié)算的頁面(把商品的名稱和數(shù)量顯示到頁面上)
*/
// 先獲取請求的參數(shù)
String id = request.getParameter("id");
// 想id轉(zhuǎn)換成響應(yīng)的商品名稱
String [] names = new String []{"手電筒","電視","冰箱","洗衣機","電話","電腦"};
// 轉(zhuǎn)換成int類想
int index = Integer.parseInt(id);
// 當(dāng)前的商品名稱
String productName = names[index - 1];
// 先獲取session
HttpSession session = request.getSession();
// 從session來獲取車
Map<String, Integer> cart = (Map<String, Integer>)session.getAttribute("cart");
// 如果cart是null
if(cart == null){
// 第一次
// 把購買的商品存入到車中
cart = new HashMap<String, Integer>();
// 把商品放入車中
cart.put(productName, 1);
// 把車放入session中
session.setAttribute("cart", cart);
}else{
// 先獲取車中的內(nèi)容,和當(dāng)前購買的商品進(jìn)行判斷
if(cart.containsKey(productName)){
// 先獲取商品的數(shù)量
Integer count = cart.get(productName);
// 數(shù)量+1
count++;
// 在把商品存入車中
cart.put(productName, count);
// 存入到session中
session.setAttribute("cart", cart);
}else{
// 直接存入到車中
cart.put(productName, 1);
// 存入到session中
session.setAttribute("cart", cart);
}
}
// 重定向到繼續(xù)購物或者去結(jié)算的頁面
response.sendRedirect(request.getContextPath()+"/session/gopay.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
繼續(xù)購物:
gopay.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3><a href="/day11/session/cartlist.jsp">繼續(xù)購物</a>|<a href="/day11/session/pay.jsp">去結(jié)算</a></h3>
</body>
</html>
付款:
pay.jsp:
<%@page import="java.util.Set"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>商品的信息</h4>
<%
// 獲取車
Map<String,Integer> cart = (Map<String,Integer>)request.getSession().getAttribute("cart");
// 購物車不為空
if(cart != null){
// 獲取車的商品名稱和數(shù)量
Set<String> names = cart.keySet();
// 循環(huán)set集合,商品的名稱
for(String name : names){
%>
<h3>親,您購買了<%= name %>,數(shù)量是<%= cart.get(name) %></h3>
<%
}
}else{
%>
<h3>親,您還沒有<a href="/day11/session/cartlist.jsp">敗家</a>,請您快去敗家</h3>
<%
}
%>
</body>
</html>
瀏覽器禁用Cookie后的session處理:
實驗演示禁用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)行重寫
session創(chuàng)建和銷毀:
session的創(chuàng)建
?服務(wù)器啟動,第一次訪問調(diào)用getSession()方法時,創(chuàng)建session。
Session的銷毀
?服務(wù)器非正常關(guān)閉(正常關(guān)閉不會銷毀,會序列化到work目錄)
?Session過期
?調(diào)用session的invalidate()方法銷毀
session案例:
利用Session實現(xiàn)一次性驗證碼用戶登陸
?在生成的驗證碼的servlet中使用session存入生成的驗證碼(使用StringBuffer拼接字符)
?在校驗的servlet中獲取表單輸入的驗證碼和session中保存的驗證碼
?獲取到兩個不同來源的驗證碼后做對比
session案例一次性校驗碼:
一次性驗證碼的主要目的就是為了限制人們利用工具軟件來暴力猜測密碼。
服務(wù)器程序接收到表單數(shù)據(jù)后,首先判斷用戶是否填寫了正確的驗證碼,只有該驗證碼與服務(wù)器端保存的驗證碼匹配時,服務(wù)器程序才開始正常的表單處理流程。
密碼猜測工具要逐一嘗試每個密碼的前題條件是先輸入正確的驗證碼,而驗證碼是一次性有效的,這樣基本上就阻斷了密碼猜測工具的自動地處理過程。
Servlet的數(shù)據(jù)訪問范圍:
application Scope servletContext (數(shù)據(jù)庫連接池,配置, 線程池, 站點訪問次數(shù))
?每一個Web應(yīng)用對應(yīng)一個ServletContext
?存放所有用戶都可以訪問的數(shù)據(jù)
session Scope HttpSession (存放與用戶相關(guān)數(shù)據(jù))
?存放每個用戶自己會話過程中的數(shù)據(jù)
request Scope HttpServletRequest
(Servlet處理結(jié)果,JSP顯示)
?數(shù)據(jù)存放在request對象中
?生成新的請求時,原request存放數(shù)據(jù)丟失
Cookie 和 Session 的比較:
?Cookie是存放在客戶端的。Session對象是存放在服務(wù)器端,但通常需要借助Cookie來存放個JSESSIONID號。
?Cookie只能存放文本信息,而且大小受限。Session對象中可以存放任何類型信息。
?Cookie可以長時間保存在客戶端。Session對象在瀏覽器關(guān)閉后就失效了。Session數(shù)據(jù)存放在服務(wù)器內(nèi)存。
---------------------