天天看點

java_web:session與cookie的差別

session的特點

a.session存儲在伺服器

b.session是在同一個使用者(客戶)請求時共享

c.session實作機制

第一次客戶請求時,産生一個sessionid并且複制給cookiedejssionid

然後,發送給用戶端,

最終,通過session的sessionid與cookie的jsessionid實作一一對應的關系

d.同一次會話共享session

session與cookie的差別

a.session儲存的位置在服務端,cookie儲存的位置在用戶端

b.session較安全,cookie較不安全

c.session儲存的内容為Object,cookie儲存的内容為string

cookie補充說明*

a.服務端在第一次響應用戶端時,若服務端發現此請求沒有JSESSIONID,

則會自動建立并傳回一個name=JSESSIONID的cookie

b.cookie不是内置對象,要使用,必須new

應用案例:建立login.jsp頁面送出資料到check.jsp頁面(作為服務端産生cookie),再由該頁面跳轉到welcome.jsp頁面。另建立一個a.jsp頁面來檢視session産生的cookie與JSESIONID

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="check.jsp" method="post">
		使用者名:<input type="text" name="uname"><br>
		密碼:<input type="password" name="upwd"><br>
		<input type="submit" value="登入"><br>
	</form>
</body>
</html>
           

check.jsp

<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		request.setCharacterEncoding("utf-8");
		String name=request.getParameter("uname");
		String pwd=request.getParameter("upwd");
		if(name.equals("zs")&&pwd.equals("abc")){
			//登入成功的話将其值賦給session對象
			//隻有登入成功,session中才會存在uname/upwd
			session.setAttribute("uname", name);
			session.setAttribute("upwd", pwd);
			
			//将sessionId列印到控制台
			System.out.println("SESSIONID-----"+session.getId());
			
			//服務端産生cookie
			//Cookie cookie=new Cookie("uname",name);
			//response.addCookie(cookie);
			
			//服務端在第一次響應用戶端時,會自動發送一個JSESSIONID的cookie
			
			//設定最大有效非活動時間(10s)
			//session.setMaxInactiveInterval(10);
			request.getRequestDispatcher("welcome.jsp").forward(request, response);
		}
		else{
			//登入失敗則重新登入
			response.sendRedirect("login.jsp");
		}
	%>
</body>
</html>
           

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
歡迎您:
	<%
		//将object轉成string對象
		String name=(String)session.getAttribute("uname");
		//優化
		//如果沒有登入,則跳轉到登入頁面
		if(name!=null){
			out.print(name);
		
			//
			
		//java代碼中嵌套html代碼
		//加一個超連結實作session的登出
	%>
		<a href="invalidate.jsp" target="_blank" rel="external nofollow" >登出</a>
	<%
		}else{
			response.sendRedirect("login.jsp");
		}
		
	%>
</body>
</html>
           

a.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//同一次會話共享session 
		//實作登出後,無法通路該(uname)字段
	%>
	<%
		out.print(session.getAttribute("uname"));
		Cookie[] cookies=request.getCookies();
		for(Cookie cookie:cookies){
			if(cookie.getName().equals("JSESSIONID")){
				System.out.println("JSESSIONID-----"+cookie.getValue());
			}
		}
	%>
</body>
</html>
           

invlidate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		//實作seission的登出
		session.invalidate();
		response.sendRedirect("login.jsp");
		//指定失效字段(一般不推薦)
		//session.removeAttribute("uname");
	%>
</body>
</html>