JavaWeb 会话技术( Cookie和Session)

153 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路 @toc

什么是会话

用户打开一个浏览器,访问服务器端的多个web资源,然后关闭浏览器,从打开到关闭的整个过程称之为一个会话。会话技术多用于数据的存取。

如何来保存会话过程中产生的数据

每个用户在使用浏览器和服务器进行会话过程中,不可避免的会产生一些数据,这些数据有时候需要保存下来的,比如用户登录过后,应该保存一个用户的状态,会话结束钱(关掉浏览器前)表明用户一直是登录状态,并且不用的用户之间的登录状态应该互不影响,也有是需要在浏览器端永久保存一些数据。

已经学习的可以存储数据的两个域对象:

  • request

request域太小,request表示一次请求,可以在一次请求中实现资源的共享,但是在多次请求中,每次请求都是新的,request存储的数据就实现不了资源的共享。

  • ServletContext

ServletContext域太大,所在的所用用户都操作这个域,太混乱了。

会话技术包含Cookie技术和Session技术

Cookie技术

1)Cookie的概述

Cookie的原理是通过set-Cookie响应头和Cookie请求头将 会话中产生的数据保存在浏览器端。 浏览器端请求服务器,服务器会将需要保存的数据通过set-cookie响应头发送给浏览器端,浏览器端接收到数据会保存在浏览器的内部; 当浏览器再次请求服务器时,通过Cookie请求头将上次保存的数据在带给服务器端,服务器端通过Cookie请求头来获取数据。 通过这种方式可以保存在会话过程中产生的数据。 Cookie技术是将需要保存的数据保存在了浏览器端,是一种浏览器端的会话技术,每个浏览器端各自保存各自的数据,再次访问服务器时会带着自己的数据来访问服务器端,每个浏览器端都持有自己的数据,因此数据在存取的时候也不会混乱。

2)Cookie的常用方法

①创建Cookie

name和value是需要往Cookie存储的数据

Cookie c=new Cookie(String name,String value);

②添加Cookie

向响应中添加一个Cookie,可以在一次响应中添加多个Cookie

response.addCookie(c);

③设置Cookie存活时间

 setMaxAge(时间)   单位是秒

如果不设置,默认情况下Cookie会将数据保存在浏览器内存中,一旦关闭浏览器,Cookie也会随着浏览器内存的释放而销毁; 通过setMaxAge()方法设置的Cookie存活时间以后,Cookie会以文件的形式保存在浏览器端,在指定的时间来到之间,即使多次关闭浏览器,Cookie信息也会一直存在。

④设置Cookie的路径

  setPath(String path)

设置浏览器在访问哪个地址及其子地址时,带着Cookie信息过来,如果没有设置setPath,那么默认的路径是当前web应用的路径 -- /web应用

⑤获取Cookie

获取所有的Cookie中存储的数据,这些数据放到数组中

Cookie[] cs=request.getCookies();
package cookie;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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的语法演示
public class CookieDemo1 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//创建Cookie,存储a=1数据
		Cookie c1=new Cookie("a","1");
		Cookie c2=new Cookie("b","2");
		Cookie c3=new Cookie("c",URLEncoder.encode("土豆丝", "utf-8"));
		
		//设置Cookie的最大存活时间
		c1.setMaxAge(3000);   //存活300秒
		c2.setMaxAge(3000);    //存活10秒
		
		//设置Cookie的路径
		//如果不使用setPath设置Cookie路径,默认是/web应用这个路径
		//默认路径是/servlet,可以在servletweb应用下共享Cookie
		c1.setPath("/servlet/test1/a1");
		//c2还是默认路径:/servlet
		
		
		//添加Cookie
		response.addCookie(c1);
		response.addCookie(c2);
		response.addCookie(c3);
		//获取所有的Cookie
		Cookie[] cs=request.getCookies();
		//使用循环将数组cs中的内容依次取出
		for(int i=0;i<cs.length;i++){
			Cookie c=cs[i];
			System.out.println(c.getName()+","+URLDecoder.decode(c.getValue(),"utf-8"));
		}
	}

}

⑥Cookie的销毁

没有提供直接删除Cookie的方法 如果想删除一个Cookie,可以向浏览器发送一个同名、同Path的Cookie,只需要将Cookie的maxAge设置为0即可。

package cookie;

import java.io.IOException;
import java.io.PrintWriter;

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
//在没有关闭浏览器(会话)和最大存活时间没有到的情况下,代码手动删除Cookie
public class CookieDemo3 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//删除Cookie,同名、同path,设置存活时间为0
		//删除Cookie中存储的a的值
		//1、创建一个同名的Cookie    要和删除的Cookie存储的名字一致
		Cookie c=new Cookie("a","");
		//2、设置和要删除的Cookie一样的path
		c.setPath("/servlet");
		//3、设置Cookie的最大存活时间为0
		c.setMaxAge(0);
		//添加Cookie
		response.addCookie(c);
	}
}

Session技术

1)概念

Session也是一种会话技术,Session是将会话中产生的数据保存在了服务器端,是服务端的一种会话技术。 浏览器访问服务器端,服务器会为每一个浏览器单独创建一个Session对象,该对象有一个ID属性,是唯一的,一般称之为SessionId,并且服务器会将这个SessionId使用Cookie的方式保存在浏览器端,当浏览器再次访问服务器时,会将SessionId发送给服务器,服务器可以根据SessionId查找响应的Session对象。

2)Session技术中常用的方法:

①获取Session对象

 HttpSession session=request.getSession();
package session;

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;
//演示Session的使用
public class SessionDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//Session是在服务器端使用的一种技术
		//Session是在服务器端创建的,也是在服务器端存储的数据
		//获取Session对象
		HttpSession session=request.getSession();
		//往Session对象中存数据
		session.setAttribute("a", 1);
		session.setAttribute("name", "张三");
	
	}
}

②Session对象可以存取数据

 session.setAttribute(String name, String value)
 session.getAttribute(String name) --> value
package session;

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;
//获取Session中的数据
public class SessionDemo2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取Session对象
		HttpSession session=request.getSession();
		Integer itgA=(Integer)session.getAttribute("a");
		String strName=(String)session.getAttribute("name");
		//设置网页的格式和编码
		response.setContentType("text/html;charset=utf-8");
		//将获取的值输出在网页上
		PrintWriter pw=response.getWriter();
		pw.println("Session中a的值为:"+itgA);
		pw.println("Session中name的值为:"+strName);
	}

}

③设置Session的有效时间

如果不设置,Session默认是30分钟的有效时间 在web.xml文件中配置Session的有效时间

④销毁Session对象

  session.invalidate()  //立刻马上销毁session
package session;

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;
//销毁Session对象
public class SessionDemo3 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
         //1、获取Session对象
		HttpSession session=request.getSession();
		
		//2、调用方法进行销毁
		session.invalidate();

	}

}

Session中存储的数据几点说明

  • 1)重启,重新部署等,服务器端使用Session存储的数据依然有效
  • 2)关闭浏览器,相当于结束会话。 重新打开浏览器去访问服务器端Session存储的数据,是访问不到的。
  • 3)Session的有效时间如果过期了,Session中存储的数据也就获取不到了

Cookie和Session的比较

①Cookie是将会话中产生的数据保存在浏览器端(客户端), 是客户端的技术。 ②Session是将会话中产生的数据保存在服务器端,是服务器端 的技术。 ③Cookie保存的信息的时间比较长,但是安全性不高,可能随 着用户的操作,Cookie会被清空,所以Cookie存储数据的 稳定性比较差。 因此Cookie适合存放要保存时间较长,但安全性不高的信息 ④Session通常保存信息的时间比较有限,但是安全性较高。 因为数据是保存在服务器端,不会随着用户的操作而导致 Session中的数据意外丢失。 因此Session适合存放安全性比较高,但是不需要长时间保存 的数据。