1. 程式人生 > >會話跟蹤技術:HttpSession和Cookie

會話跟蹤技術:HttpSession和Cookie

1.3 Cookie與HTTP頭

Cookie是通過HTTP請求和響應頭在客戶端和伺服器端傳遞的:

l  Cookie:請求頭,客戶端傳送給伺服器端;

格式:Cookie: a=A; b=B; c=C。即多個Cookie用分號離開;

l  Set-Cookie:響應頭,伺服器端傳送給客戶端;

一個Cookie對應一個Set-Cookie:

Set-Cookie: a=A

Set-Cookie: b=B

Set-Cookie: c=C

1.4 Cookie的覆蓋

  如果伺服器端傳送重複的Cookie那麼會覆蓋原有的Cookie,例如客戶端的第一個請求伺服器端傳送的Cookie是:Set-Cookie: a=A;第二請求伺服器端傳送的是:Set-Cookie:a=AA,那麼客戶端只留下一個Cookie,即:a=AA。

1.5 Cookie第一例

我們這個案例是,客戶端訪問AServlet,AServlet在響應中新增Cookie,瀏覽器會自動儲存Cookie。然後客戶端訪問BServlet,這時瀏覽器會自動在請求中帶上Cookie,BServlet獲取請求中的Cookie打印出來。

package cn.itcast.servlet;

import java.io.IOException;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 給客戶端傳送Cookie
 * @author Administrator
 *
 */
public class AServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
String id = UUID.randomUUID().toString();//生成一個隨機字串 Cookie cookie = new Cookie("id", id);//建立Cookie物件,指定名字和值 response.addCookie(cookie);//在響應中新增Cookie物件 response.getWriter().print("已經給你傳送了ID"); } }

package cn.itcast.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;

/**
 * 獲取客戶端請求中的Cookie
 * @author Administrator
 *
 */
public class BServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
		Cookie[] cs = request.getCookies();//獲取請求中的Cookie
if(cs != null) {//如果請求中存在Cookie for(Cookie c : cs) {//遍歷所有Cookie if(c.getName().equals("id")) {//獲取Cookie名字,如果Cookie名字是id response.getWriter().print("您的ID是:" + c.getValue());//列印Cookie值 } } } } }

2 Cookie的生命

2.1 什麼是Cookie的生命

  Cookie不只是有name和value,Cookie還是生命。所謂生命就是Cookie在客戶端的有效時間,可以通過setMaxAge(int)來設定Cookie的有效時間。

l  cookie.setMaxAge(-1):cookie的maxAge屬性的預設值就是-1,表示只在瀏覽器記憶體中存活。一旦關閉瀏覽器視窗,那麼cookie就會消失。

l  cookie.setMaxAge(60*60):表示cookie物件可存活1小時。當生命大於0時,瀏覽器會把Cookie儲存到硬碟上,就算關閉瀏覽器,就算重啟客戶端電腦,cookie也會存活1小時;

l  cookie.setMaxAge(0):cookie生命等於0是一個特殊的值,它表示cookie被作廢!也就是說,如果原來瀏覽器已經儲存了這個Cookie,那麼可以通過Cookie的setMaxAge(0)來刪除這個Cookie。無論是在瀏覽器記憶體中,還是在客戶端硬碟上都會刪除這個Cookie。

2.3 案例:顯示上次訪問時間

l  建立Cookie,名為lasttime,值為當前時間,新增到response中;

l  在AServlet中獲取請求中名為lasttime的Cookie;

l  如果不存在輸出“您是第一次訪問本站”,如果存在輸出“您上一次訪問本站的時間是xxx”;

AServlet.java:

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		
		Cookie cookie = new Cookie("lasttime", new Date().toString()); 
		cookie.setMaxAge(60 * 60); 
		response.addCookie(cookie); 
		
		Cookie[] cs = request.getCookies(); 
		String s = "您是首次訪問本站!";
		if(cs != null) { 
			for(Cookie c : cs) { 
				if(c.getName().equals("lasttime")) { 
					s = "您上次的訪問時間是:" + c.getValue(); 
				}
			}
		}
		
		response.getWriter().print(s); 
	}

3 Cookie的path

3.1 什麼是Cookie的路徑

現在有WEB應用A,向客戶端傳送了10個Cookie,這就說明客戶端無論訪問應用A的哪個Servlet都會把這10個Cookie包含在請求中!但是也許只有AServlet需要讀取請求中的Cookie,而其他Servlet根本就不會獲取請求中的Cookie。這說明客戶端瀏覽器有時傳送這些Cookie是多餘的!

可以通過設定Cookie的path來指定,瀏覽器在訪問什麼樣的路徑時,包含什麼樣的Cookie。


3.2 Cookie路徑與請求路徑的關係

下面我們來看看Cookie路徑的作用:

下面是客戶端瀏覽器儲存的3個Cookie的路徑:

a: /cookietest;

b: /cookietest/servlet;

c: /cookietest/jsp;

下面是瀏覽器請求的URL:

A: http://localhost:8080/cookietest/AServlet;

B: http://localhost:8080/cookietest/servlet/BServlet;

C: http://localhost:8080/cookietest/jsp/CServlet;

l  請求A時,會在請求中包含a;

l  請求B時,會在請求中包含a、b;

l  請求C時,會在請求中包含a、c;

也就是說,請求路徑如果包含了Cookie路徑,那麼會在請求中包含這個Cookie,否則不會請求中不會包含這個Cookie。

l  A請求的URL包含了“/cookietest”,所以會在請求中包含路徑為“/cookietest”的Cookie;

l  B請求的URL包含了“/cookietest”,以及“/cookietest/servlet”,所以請求中包含路徑為“/cookietest”和“/cookietest/servlet”兩個Cookie;

l  B請求的URL包含了“/cookietest”,以及“/cookietest/jsp”,所以請求中包含路徑為“/cookietest”和“/cookietest/jsp”兩個Cookie;

3.3 設定Cookie的路徑

設定Cookie的路徑需要使用setPath()方法,例如:

cookie.setPath(“/cookietest/servlet”);

 (注意:並不是設定cookie在客戶端的儲存路徑,僅僅是設定Cookie的path的屬性的值)

如果沒有設定Cookie的路徑,那麼Cookie路徑的預設值當前訪問資源所在路徑,例如:

l  訪問http://localhost:8080/cookietest/AServlet時新增的Cookie預設路徑為/cookietest;

l  訪問http://localhost:8080/cookietest/servlet/BServlet時新增的Cookie預設路徑為/cookietest/servlet;

l  訪問http://localhost:8080/cookietest/jsp/BServlet時新增的Cookie預設路徑為/cookietest/jsp;


4 Cookie中儲存中文

Cookie的name和value都不能使用中文,如果希望在Cookie中使用中文,那麼需要先對中文進行URL編碼,

然後把編碼後的字串放到Cookie中。

 向客戶端響應中新增Cookie:

	String name = URLEncoder.encode("姓名", "UTF-8");//使用URL編碼
	String value = URLEncoder.encode("張三", "UTF-8");//使用URL編碼

 	Cookie c = new Cookie(name, value); 
	c.setMaxAge(3600);
	response.addCookie(c);

    從客戶端請求中獲取Cookie:

	response.setContentType("text/html;charset=utf-8");
		Cookie[] cs = request.getCookies();
		if(cs != null) {
			for(Cookie c : cs) {
				String name = URLDecoder.decode(c.getName(), "UTF-8");//使用URL解碼
				String value = URLDecoder.decode(c.getValue(), "UTF-8");//使用URL解碼
 				String s = name + ": " + value + "<br/>";
				response.getWriter().print(s);
			}
		}

5 案例:顯示曾經瀏覽過的商品

index.jsp

<body>
    <h1>商品列表</h1>
    <a href="/day06_3/GoodServlet?name=ThinkPad">ThinkPad</a><br/>
    <a href="/day06_3/GoodServlet?name=Lenovo">Lenovo</a><br/>
    <a href="/day06_3/GoodServlet?name=Apple">Apple</a><br/>
    <a href="/day06_3/GoodServlet?name=HP">HP</a><br/>
    <a href="/day06_3/GoodServlet?name=SONY">SONY</a><br/>
    <a href="/day06_3/GoodServlet?name=ACER">ACER</a><br/>
    <a href="/day06_3/GoodServlet?name=DELL">DELL</a><br/>
    
    <hr/>
    您瀏覽過的商品:
    <%
    	Cookie[] cs = request.getCookies();
    	if(cs != null) {
    		for(Cookie c : cs) {
    			if(c.getName().equals("goods")) {
    				out.print(c.getValue());
    			}
    		}
    	}
    %>
  </body>

GoodServlet

public class GoodServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String goodName = request.getParameter("name");
		String goods = CookieUtils.getCookValue(request, "goods");
		
		if(goods != null) {
			String[] arr = goods.split(", ");
			Set<String> goodSet = new LinkedHashSet(Arrays.asList(arr));
			goodSet.add(goodName);
			goods = goodSet.toString();
			goods = goods.substring(1, goods.length() - 1);
		} else {
			goods = goodName;
		}
		Cookie cookie = new Cookie("goods", goods);
		cookie.setMaxAge(1 * 60 * 60 * 24);
		response.addCookie(cookie);
		
		response.sendRedirect("/day06_3/index.jsp");
	}
}
CookieUtils
public class CookieUtils {
	public static String getCookValue(HttpServletRequest request, String name) {
		Cookie[] cs = request.getCookies();
		if(cs == null) {
			return null;
		}
		for(Cookie c : cs) {
			if(c.getName().equals(name)) {
				return c.getValue();
			}
		}
		return null;
	}
}

三、HttpSession

1       HttpSession概述

1.1 什麼是HttpSesssion

javax.servlet.http.HttpSession介面表示一個會話,我們可以把一個會話內需要共享的資料儲存到HttSession物件中!

1.2 獲取HttpSession物件

l  HttpSession request.getSesssion():如果當前會話已經有了session物件那麼直接返回,如果當前會話還不存在會話,那麼建立session並返回;

l  HttpSession request.getSession(boolean):當引數為true時,與requeset.getSession()相同。如果引數為false,那麼如果當前會話中存在session則返回,不存在返回null;

1.3 HttpSession是域物件

我們已經學習過HttpServletRequest、ServletContext,它們都是域物件,現在我們又學習了一個HttpSession,它也是域物件。它們三個是Servlet中可以使用的域物件,而JSP中可以多使用一個域物件,明天我們再講解JSP的第四個域物件。

HttpServletRequest:一個請求建立一個request物件,所以在同一個請求中可以共享request,例如一個請求從AServlet轉發到BServlet,那麼AServlet和BServlet可以共享request域中的資料;

ServletContext:一個應用只建立一個ServletContext物件,所以在ServletContext中的資料可以在整個應用中共享,只要不重啟伺服器,那麼ServletContext中的資料就可以共享;

HttpSession:一個會話建立一個HttpSession物件,同一會話中的多個請求中可以共享session中的資料;

下面是session的域方法:

l  void setAttribute(String name, Object value):用來儲存一個物件,也可以稱之為儲存一個域屬性,例如:session.setAttribute(“xxx”, “XXX”),在session中儲存了一個域屬性,域屬性名稱為xxx,域屬性的值為XXX。請注意,如果多次呼叫該方法,並且使用相同的name,那麼會覆蓋上一次的值,這一特性與Map相同;

l  Object getAttribute(String name):用來獲取session中的資料,當前在獲取之前需要先去儲存才行,例如:String value = (String) session.getAttribute(“xxx”);,獲取名為xxx的域屬性;

l  void removeAttribute(String name):用來移除HttpSession中的域屬性,如果引數name指定的域屬性不存在,那麼本方法什麼都不做;

l  Enumeration getAttributeNames():獲取所有域屬性的名稱;

2 登入案例

需要的頁面:

l  login.jsp:登入頁面,提供登入表單;

l  index1.jsp:主頁,顯示當前使用者名稱稱,如果沒有登入,顯示您還沒登入;

l  index2.jsp:主頁,顯示當前使用者名稱稱,如果沒有登入,顯示您還沒登入;

Servlet:

l  LoginServlet:在login.jsp頁面提交表單時,請求本Servlet。在本Servlet中獲取使用者名稱、密碼進行校驗,如果使用者名稱、密碼錯誤,顯示“使用者名稱或密碼錯誤”,如果正確儲存使用者名稱session中,然後重定向到index1.jsp;

  當用戶沒有登入時訪問index1.jsp或index2.jsp,顯示“您還沒有登入”。如果使用者在login.jsp登入成功後到達index1.jsp頁面會顯示當前使用者名稱,而且不用再次登入去訪問index2.jsp也會顯示使用者名稱。因為多次請求在一個會話範圍,index1.jsp和index2.jsp都會到session中獲取使用者名稱,session物件在一個會話中是相同的,所以都可以獲取到使用者名稱!

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>login.jsp</title>
  </head>
  
  <body>
    <h1>login.jsp</h1>
    <hr/>
    <form action="/day06_4/LoginServlet" method="post">
    	使用者名稱:<input type="text" name="username" /><br/>
        <input type="submit" value="Submit"/>
    </form>
  </body>
</html>

index1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>index1.jsp</title>
  </head>
  
  <body>
<h1>index1.jsp</h1>
<%
	String username = (String)session.getAttribute("username"); 
	if(username == null) {
		out.print("您還沒有登入!"); 
	} else {
		out.print("使用者名稱:" + username); 
	}
%>
<hr/>
<a href="/day06_4/index2.jsp">index2</a>
  </body>
</html>

index2.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>index2.jsp</title>
  </head>
  
  <body>
<h1>index2.jsp</h1>
<%
	String username = (String)session.getAttribute("username");
	if(username == null) {
		out.print("您還沒有登入!");
	} else {
		out.print("使用者名稱:" + username);
	}
%>
<hr/>
<a href="/day06_4/index1.jsp">index1</a>
  </body>
</html>

LoginServlet

public class LoginServlet extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		String username = request.getParameter("username"); 
		
		if(username.equalsIgnoreCase("itcast") ) {
			response.getWriter().print("使用者名稱或密碼錯誤!");
		} else {
			HttpSession session = request.getSession(); 
			session.setAttribute("username", username); 
			response.sendRedirect("/day06_4/index1.jsp"); 
		}
	}
}

3 session的實現原理

session底層是依賴Cookie的!我們來理解一下session的原理吧!

當我首次去銀行時,因為還沒有賬號,所以需要開一個賬號,我獲得的是銀行卡,而銀行這邊的資料庫中留下了我的賬號,我的錢是儲存在銀行的賬號中,而我帶走的是我的卡號。

當我再次去銀行時,只需要帶上我的卡,而無需再次開一個賬號了。只要帶上我的卡,那麼我在銀行操作的一定是我的賬號!

當首次使用session時,伺服器端要建立session,session是儲存在伺服器端,而給客戶端的session的id(一個cookie中儲存了sessionId)。客戶端帶走的是sessionId,而資料是儲存在session中。

當客戶端再次訪問伺服器時,在請求中會帶上sessionId,而伺服器會通過sessionId找到對應的session,而無需再建立新的session。



4 session與瀏覽器

session儲存在伺服器,而sessionId通過Cookie傳送給客戶端,但這個Cookie的生命週期為-1,即只在瀏覽器記憶體中存在,也就是說如果使用者關閉了瀏覽器,那麼這個Cookie就丟失了

當用戶再次開啟瀏覽器訪問伺服器時,就不會有sessionId傳送給伺服器,那麼伺服器會認為你沒有session,所以伺服器會建立一個session,並在響應中把sessionId中到Cookie中傳送給客戶端。     

你可能會說,那原來的session物件會怎樣?當一個session長時間沒人使用的話,伺服器會把session刪除了!這個時長在Tomcat中配置是30分鐘,可以在${CATALANA}/conf/web.xml找到這個配置,當然你也可以在自己的web.xml中覆蓋這個配置!

web.xml

    <session-config>

        <session-timeout>30</session-timeout>

    </session-config>

session失效時間也說明一個問題!如果你開啟網站的一個頁面開始長時間不動,超出了30分鐘後,再去點選連結或提交表單時你會發現,你的session已經丟失了!


5 session其他常用API

l  String getId():獲取sessionId;

l  int getMaxInactiveInterval():獲取session可以的最大不活動時間(秒),預設為30分鐘。當session在30分鐘內沒有使用,那麼Tomcat會在session池中移除這個session;

l  void setMaxInactiveInterval(int interval):設定session允許的最大不活動時間(秒),如果設定為1秒,那麼只要session在1秒內不被使用,那麼session就會被移除;

l  long getCreationTime():返回session的建立時間,返回值為當前時間的毫秒值;

l  long getLastAccessedTime():返回session的最後活動時間,返回值為當前時間的毫秒值;

l  void invalidate():讓session失效!呼叫這個方法會被session失效,當session失效後,客戶端再次請求,伺服器會給客戶端建立一個新的session,並在響應中給客戶端新session的sessionId;

l  boolean isNew():檢視session是否為新。當客戶端第一次請求時,伺服器為客戶端建立session,但這時伺服器還沒有響應客戶端,也就是還沒有把sessionId響應給客戶端時,這時session的狀態為新。


6 URL重寫

我們知道session依賴Cookie,那麼session為什麼依賴Cookie呢?因為伺服器需要在每次請求中獲取sessionId,然後找到客戶端的session物件。那麼如果客戶端瀏覽器關閉了Cookie呢?那麼session是不是就會不存在了呢?

其實還有一種方法讓伺服器收到的每個請求中都帶有sessioinId,那就是URL重寫!在每個頁面中的每個連結和表單中都新增名為jSessionId的引數,值為當前sessionid。當用戶點選連結或提交表單時也伺服器可以通過獲取jSessionId這個引數來得到客戶端的sessionId,找到sessoin物件。

index.jsp

<body>
<h1>URL重寫</h1>
<a href='/day06_5/index.jsp;jsessionid=<%=session.getId() %>'  >主頁</a>

<form action='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' method="post">
	<input type="submit" value="提交"/>
</form>
</body>

請求注意,在index.jsp後面使用的是分號,而不是問號,這是伺服器對jsessionid這個引數的特殊要求。


也可以使用response.encodeURL()對每個請求的URL處理,這個方法會自動追加jsessionid引數,與上面我們手動新增是一樣的效果。

<a href='<%=response.encodeURL("/day06_5/index.jsp") %>' >主頁</a>

<form action='<%=response.encodeURL("/day06_5/index.jsp") %>' method="post">
	<input type="submit" value="提交"/>
</form>

使用response.encodeURL()更加“智慧”,它會判斷客戶端瀏覽器是否禁用了Cookie,如果禁用了,那麼這個方法在URL後面追加jsessionid,否則不會追加。


四、案例:一次性圖片驗證碼

1 驗證碼有啥用

在我們註冊時,如果沒有驗證碼的話,我們可以使用URLConnection來寫一段程式碼發出註冊請求。甚至可以使用while(true)來註冊!那麼伺服器就廢了!

驗證碼可以去識別發出請求的是人還是程式!當然,如果聰明的程式可以去分析驗證碼圖片!但分析圖片也不是一件容易的事,因為一般驗證碼圖片都會帶有干擾線,人都看不清,那麼程式一定分析不出來。

2 VerifyCode類

現在我們已經有了cn.itcast.utils.VerifyCode類,這個類可以生成驗證碼圖片和圖片上的文字!下面來看一個小例子。

public void fun1() throws IOException {
		// 建立驗證碼類
		VerifyCode vc = new VerifyCode();
		// 1、獲取隨機圖片
		BufferedImage image = vc.getImage();
		// 2、獲取剛剛生成的隨機圖片上的文字
		String text = vc.getText() ;
		//System.out.println(text);
		// 儲存圖片
		FileOutputStream out = new FileOutputStream("F:/xxx.jpg");
		VerifyCode.output(image, out); //把image圖片儲存到out流中!

}

3 在頁面中顯示動態圖片

我們需要寫一個VerifyCodeServlet,在這個Servlet中我們生成動態圖片,然後它圖片寫入到response.getOutputStream()流中!然後讓頁面的<img>元素指定這個VerifyCodServlet即可。

VerifyCodeServlet

public class VerifyCodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		VerifyCode vc = new VerifyCode();
		BufferedImage image = vc.getImage();
		String text = vc.getText();
		System.out.println("text:" + text);
		VerifyCode.output(image, response.getOutputStream());
	}
}

index.jsp

<script type="text/javascript">
    	function _change() {
    		var imgEle = document.getElementById("vCode"); 
    		imgEle.src = "/day06_6/VerifyCodeServlet?" + new Date().getTime(); 
    	}
    </script>
...  
  <body>
    <h1>驗證碼</h1>
    <img id="vCode" src="/day06_6/VerifyCodeServlet"/>
    <a href="javascript:_change()">看不清,換一張</a> 
  </body>

4 在註冊頁面中使用驗證碼

    <form action="/day06_6/RegistServlet " method="post">
    	使用者名稱:<input type="text" name="username"/><br/>
    	驗證碼:<input type="text" name="code" size="3"/>
    	<img id="vCode" src="/day06_6/VerifyCodeServlet"/>
    	<a href="javascript:_change()">看不清,換一張</a>
    	<br/>
        <input type="submit" value="Submit"/>
    </form>

5 RegistServlet

修改VerifyCodeServlet

public class VerifyCodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		VerifyCode vc = new VerifyCode();
		BufferedImage image = vc.getImage();
		request.getSession().setAttribute("vCode", vc.getText());//在session中儲存驗證碼文字
		VerifyCode.output(image, response.getOutputStream());
	}
}

RegistServlet

public class RegistServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		String username = request.getParameter("username");
		String vCode = request.getParameter("code"); //獲取表單中的驗證碼,這是使用者在表單中填寫的。
/*
獲取session中的驗證碼,這是在生成驗證碼圖片後,儲存在session中的正確的驗證碼文字
*/
		String sessionVerifyCode = (String)request.getSession().getAttribute("vCode"); 
		
		if(vCode.equalsIgnoreCase(sessionVerifyCode) ) {  //比較使用者輸入的與真正的是否相同。
			response.getWriter().print(username + ", 恭喜!註冊成功!");
		} else {
			response.getWriter().print("驗證碼錯誤!");
		}
	}
}

6 總結驗證碼案例

l  VerifyCodeServlet:

Ø  生成驗證碼:VerifyCode vc = new VerifyCode(); BufferedImage image =vc.getImage();

Ø  在session中儲存驗證碼文字:request.getSession.getAttribute(“vCode”,vc.getText());

Ø  把驗證碼輸出到頁面:VerifyCode.output(image, response.getOutputStream);

l  regist.jsp:

Ø  表單中包含username和code欄位;

Ø  在表單中給出<img>指向VerifyCodeServlet,用來在頁面中顯示驗證碼圖片;

Ø  提供“看不清,換一張”連結,指向_change()函式;

Ø  提交到RegistServlet;

l  RegistServlet:

Ø  獲取表單中的username和code;

Ø  獲取session中的vCode;

Ø  比較code和vCode是否相同;

Ø  相同說明使用者輸入的驗證碼正確,否則輸入驗證碼錯誤。







相關推薦

會話跟蹤技術HttpSessionCookie

1.3 Cookie與HTTP頭 Cookie是通過HTTP請求和響應頭在客戶端和伺服器端傳遞的: l  Cookie:請求頭,客戶端傳送給伺服器端; 格式:Cookie: a=A; b=B; c=C。即多個Cookie用分號離開; l  Set-Cookie:響應頭,伺服器端傳送給客戶端; 一個Cooki

JavaEE基礎(04)會話跟蹤技術,SessionCookie詳解

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、會話跟蹤 1、場景描述 比如登入某個購物網站,身份識別成功後,在網站下單,支付 等操作,這些操作中當前登入使用者資訊必須是共享的,這樣這些操作結果才能和登入使用者做關聯。 2、概念簡介 可以把會話理解為客戶端與伺服器之間的一次互動,在一次互動

HTML5入門教程 Cookie會話跟蹤技術~

會話跟蹤 嵌入 網絡 影響 自動 img 更改 txt文件 發送 1. Cookie會話跟蹤技術介紹 會話跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,可以在客戶端保存臨

07.會話跟蹤技術cookie與session

one 就會 獨立 () efault ssi 技術 style 用戶 會話跟蹤技術cookie與session 01.會話跟蹤:會話路徑技術使用Cookie或session完成:   我們知道HTTP協議是無狀態協議,也就是說每個請求都是獨立的!   無法記錄前一次請求的

四種會話跟蹤技術,JSP的四種範圍

都是 java 內部 inf hidden 可能 jsp 作用 服務 這兩個問題在網上搜答案是一樣的,但是我的寶典裏標明這是兩個問題,有不同的答案,所以在這裏註釋一下。 四種會話跟蹤技術 cookie,url重寫,session,隱藏域 Cookie:服務器在一個應答首部

8、Django實戰第8天sessioncookie自動登錄機制

src exp 密碼登錄 spa 一個 實現 服務器 技術 狀態 因為http是無狀態協議,因此,並不會記錄用戶的登錄狀態。在早期,是直接把用戶名和密碼等信息存儲在瀏覽器的cookie來實現記錄用戶密碼登錄。 但是這樣存在安全隱患,只要別人登錄你的電腦cookie信息,就

單點登錄與權限管理本質sessioncookie介紹

單點登錄 cookie 介紹 本篇開始寫「單點登錄與權限管理」系列的第一部分:單點登錄與權限管理本質,這部分主要介紹相關的知識概念、抽象的處理過程、常見的實現框架。通過這部分的介紹,能夠對單點登錄與權限管理有整體上的了解,對其相關概念、處理流程、常見實現有個基本的認識。 本篇文章介紹下sessio

Filter過濾器與Session會話跟蹤技術

用戶訪問 所有 ets SQ div pub 機制 net row Filter過濾器 適用場景 1.為web應用程序的新功能建立模型(可被添加到web應用程序中或者從web應用程序中刪除而不需要重寫基層應用程序代碼)2.用戶授權Filter:負責檢查用戶請求,根據請求過濾

java 會話跟蹤技術

生命周期 參考 宋體 size 信息 發送請求 url family 會話 1.session用來表示用戶會話,session對象在服務端維護,一般tomcat設定session生命周期為30分鐘,超時將失效,也可以主動設置無效; 2.cookie存放在客戶端,可

Django - session 會話跟蹤技術

1、session簡介 |session 英 /'seʃ(ə)n/ 美 /'sɛʃən/  基於cookies開發,將值存到服務端 寫session 讀session Session是伺服器端技術,利用這個技術,伺服器在執行時可以 為每一個使用者的瀏

Django - cookies 會話跟蹤技術

一、HTTP協議的無狀態儲存 兩次請求之間沒有關聯 會話理解為客戶端與伺服器之間的一次會晤,在一次會晤中可能會包含多次請求和響應 2、會話路徑技術使用Cookie或session完成  我們知道HTTP協議是無狀態協議,也就是說每個請求都是獨立的!無法記錄前一次請求的狀態。 但HTTP

在WEB開發中會話跟蹤技術的實現

Cookies       Cookies是使用最廣泛的會話跟蹤機制,Cookies是有伺服器建立,並把Cookies資訊儲存在使用者機器上的硬碟上,下次使用者再次訪問該站點服 務器的時候,儲存在使用者機器上硬碟的Cookies資訊就被送回給伺服器。一般Cookies一般不多於4KB,

小記常見的會話跟蹤技術

xxxxx spa 進行 ttr pan attr 結果 跟蹤 表單 常見的會話跟蹤技術 使用Cookie 向客戶端發送Cookie Cookie c =new Cookie("name","value"); //創建Cookie c.se

Java Web 開發必須掌握的三個技術Token、Cookie、Session

雞蛋 51cto tro oss 情況下 令牌 就是 數據返回 客戶端信息 在Web應用中,HTTP請求是無狀態的。即:用戶第一次發起請求,與服務器建立連接並登錄成功後,為了避免每次打開一個頁面都需要登錄一下,就出現了cookie,Session。 Cookie Cooki

前端進階技術JavaScript CSS 常用工具方法封裝教程!

www splay replace hasclass flow none oot ngs 蘋果手機 因為工作中經常用到這些方法,所有便把這些方法進行了總結,希望能對大家有幫助。提醒大家一點,學習前端,基礎真的很重要,切勿急於求成! JavaScript type 類型判

會話技術cookiesession

ron 不能 max 壓力 println 狀態 空間 ets 對象 2018-05-10  21:43:16 會話   從打開一個瀏覽器的某個站點到關閉這個瀏覽器的整個過程,叫做一次會話。會話技術用於記錄這次會話中客戶端的數據和狀態,它又分為cookie和session。

會話控制技術session cookie

HTTP是無狀態協議,沒有內建機制維護兩個事物之間的狀態,同一個使用者在請求同一個頁面兩次的時候,HTTP協議不會認為這兩次請求都認為是同一使用者的請求,會當做兩次請求的獨立。會把兩次請求隔離開,會認為兩次請求是不同的兩個人進行請求或訪問。如果使用者進行了登入操作,再次請求頁面,HTTP協議不會認為該使用者之

一文詳解計算機視覺五大技術影象分類、物件檢測、目標跟蹤、語義分割例項分割

【 導讀】目前,計算機視覺是深度學習領域最熱門的研究領域之一。計算機視覺實際上是一個跨領域的交叉學科,包括電腦科學(圖形、演算法、理論、系統、體系結構),數學(資訊檢索、機器學習),工程學(機器人、語音、自然語言處理、影象處理),物理學(光學 ),生物學(神經科學)和心理學(認知科學)等等。許

實現會話跟蹤技術有哪些?

第一次 就會 left 沒有 隱式 自己 添加 參數 三種 由於HTTP協議本身是無狀態的,服務器為了區分不同的用戶,就需要對用戶會話進行跟蹤,簡單的說就是為用戶進行登記,為用戶分配唯一的ID,下一次用戶在請求中包含此ID,服務器據此判斷到底是哪一個用戶。 ①URL 重寫: