JavaWeb笔记之Cookie&Session会话技术

Cookie&Session

	会话:
	是指一个客户端/浏览器与web服务器之间连续发生的一系列请求和响应的过程,会话技术也可以说成服务器跟踪用户信息的技术
	客户端/浏览器会话技术:Cookie
	服务器端会话技术:Session

什么是Cookie

Cookie是一种会话技术,用于将会话过程中的数据保存在用户的浏览器中,方便浏览器和服务器更好的进行数据交互

​ 当你(客户端)去理发店(服务器端)理发时,理发店让你办一张会员卡,这个会员卡(Cookie)会记录的你的一些数据比如姓名手机号,存入卡片金额等,你接收了这张卡片,以后再来理发直接使用这张会员卡。这样就直接简化了你的操作
​ 会员卡由理发店产生,经理发店发送到用户手里,以后用户访问理发店带着会员卡
​ 同样,客户端/浏览器发送请求到服务器,与服务器建立会话,服务器会生成Cookie返回给客户端,当用户第二次访问服务器时,浏览器会携带Cookie(存在于请求头中)发送到服务器,方便服务器做出正确响应。

JavaWeb笔记之Cookie&Session会话技术_第1张图片

Cookie的一些方法

Cookie类的构造方法

/*
	name用于指定Cookie的名称,value用于指定Cookie的值
	Cookie一但创建name不可更改,value可以更改
*/
public Cookie(String name, String value){
		validation.validate(name);
        this.name = name;
        this.value = value;
}

Cookie的常用方法

方法声明 功能描述
String getName() 返回Cookie的名称
void setValue(String newValue) 用于为Cookie设置新的值
String getValue() 返回Cookie的值
void setMaxAge(int expiry) 设置Cookie在浏览器的存活秒数
int getMaxAge() 返回Cookie在浏览器的存活秒数
void setPath(String uri) 设置该Cookie项的有效目录路径
String getPath() 返回该Cookie项的有效目录路径
void setDomain(String pattern) 设置Cookie项的有效域
String getDomain() 返回Cookie项的有效域
  • void setMaxAge(int expiry) 注意:

      		当设置的值为正数时代表Cookie会被持久化到本地的硬盘上,
      		在设置的时间内,重启浏览器依然保持有效,超过这个秒数,cookie会自动删除;
      		当设置的值为负数时代表关闭浏览器Cookie会被自动删除,默认的也是这个;
      		当设置的值为0时,表示通知浏览器立即删除这个Cookie
    
  • void setPath(String uri):设置cookie的有效目录路径

      		一个服务器中部署了多个web项目,那么在这些web项目中cookie能不能共享?
      		默认情况下cookie不能共享,仅对当前虚拟路径及其子目录子目录有效
      		如果需要共享,将uri设置为"/"
    
  • void setDomain(String pattern):设置Cookie项的有效域

      		不同的tomcat服务器间cookie共享问题?
      		如果设置一级域名相同,那么多个服务器之间cookie可以共享
      		默认情况下,domain的属性值为当前主机名,domain的属性值不区分大小写;
      		设置domain的属性值必须以"."开头
      		setDomain(".baidu.com"),那么在tupian.baidu.com和zhidao.baidu.com中cookie可以共享
    
  • 使用Cookie的步骤

      		1. 创建Cookie对象,绑定数据
      		 new Cookie(String name, String value)
      		2. 发送Cookie对象
      			 response.addCookie(Cookie cookie)
      		3. 获取Cookie,拿到数据
      			Cookie[]  request.getCookies()
    

案例:显示用户上次的访问时间

注意: 在tomcat8之后,Cookie可以设置中文数据,但是不支持特殊字符, yyyy年MM月dd日 HH:mm:ss中有一个空格,需要进行URL编码, 否则会报异常或者500的状态码, 取出value(时间)后, 再进行URL解码即可

	package com.ligong.cookie;
	
	import javax.servlet.ServletException;
	import javax.servlet.annotation.WebServlet;
	import javax.servlet.http.Cookie;
	import javax.servlet.http.HttpServlet;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import java.io.IOException;
	import java.net.URLDecoder;
	import java.net.URLEncoder;
	import java.text.SimpleDateFormat;
	import java.util.Date;
	
	@WebServlet("/cookieTest")
	public class CookieTest3 extends HttpServlet {
	    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	        this.doPost(request, response);
	    }
	
	    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	        //设置服务器输出内容的编码方式为UTF-8,防止乱码
	        response.setContentType("text/html;charset=utf-8");
	        String value = null;
	        //获取所有Cookie
	          Cookie[] cookies = request.getCookies();
	        if (cookies!=null && cookies.length>0) {
	            for (Cookie cookie : cookies) {
	            //如果找到lastTime就把他取出来进行URL解码
	                if ("lastTime".equals(cookie.getName())){
	                    value = cookie.getValue();
	                    value = URLDecoder.decode(value,"utf-8");
	                    break;
	                }
	            }
	        }
	        //有没有值,有值说明取出来了,没值就第一次
	        if (value==null) {
	            response.getWriter().print("

欢迎您首次访问本站

"); } else { response.getWriter().print("

您上次访问本站的时间是:" + value + "

"); } //创建cookie,将当前时间作为cookie的值发送给客户端 String newTime = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date()); newTime = URLEncoder.encode(newTime, "utf-8");//进行URL编码,否则日期和时间有个空格,Cookie无法存储特殊字符 Cookie cookie = new Cookie("lastTime", newTime);//设置Cookie的名字为lastTime,值为编码后的时间 cookie.setMaxAge(60 * 60);//设置存活时间为1个小时,超过这个时间Cookie就凉了 response.addCookie(cookie);//将Cookie放在响应头里 } }

什么是Session

概念:一种服务器端会话技术,将数据保存在服务器端的对象中(HttpSession),用于一次会话的多次请求间共享数据.
Session就好像人们(浏览器)访问医院时,医院(服务器端)生成一张排队票,票上有唯一的卡号(id),医院根据这个id便可以查询到该病人的病例

当浏览器访问服务器时,Servlet容器会创建一个Session对象和ID属性,Session对象相当于病例信息,ID相当于卡号,客户从浏览器访问服务器时,将SessionID传递给服务器,服务器就能判断是那个客户端发出的,从而选择对应的Session对象为其服务

Session借助Cookie技术来传送ID属性,就是SessionID被储存在Cookie中响应给浏览器,在响应头可以看到Set-Cookie:JSESSION=11111;当浏览器访问服务器时,会在请求头中将Cookie(Cookie:JSESSION=11111)发送给服务器,服务器根据ID找到对象的Session对象

Session工作流程
JavaWeb笔记之Cookie&Session会话技术_第2张图片

Session方法

HttpServletRequest定义了获取Session对象的getSession方法

//带参构造方法中如果传递的参数为true,则在相关的HttpSession对象不存在时创建新的HttpSession对象,为false,就不创建新的Session对象,返回null值
public HttpSession getSession(booblean create)
//空参构造方法通带参的true,没有相关的HttpSession对象时就创建新的对象
public HttpSession getSession()

仅介绍HttpSession的几个常用方法

方法声明 方法描述
Object getAttribute(String name) 通过name获取指定的属性对象
void setAttribute(String name, Object value) 设置指定name的属性对象
void removeAttribute(String name) 删除指定名称的属性
String getId() 返回HttpSession对象相关联的SessionID值
long getCreationTime() 返回Session创建的时间距1970年1月1日00:00:00相差的毫秒值
void invalidate() 用于强制使Session对象无效
boolean isNew() 判断当前HttpSession对象是否是新创建的
ServletContext getServletContext 返回所属的ServletContext对象

Session超时管理

	在http协议中无法判断客户端与服务器什么时候断开连接,无法检测浏览器是否关闭,为了防止服务器保留的HttpSession对象积累的过多导致内存耗尽,web服务器采用超时限制,当客户端在指定的时间内没有访问服务器,服务器就会认为客户端已经结束请求,与该客户端的会话对应的HttpSession对象就会变成垃圾对象,从内存中被清除掉,超时后再次请求,就会创建新的Session对象,并分配新的SessionID
在tomcat安装目录\conf\web.xml文件中可修改超时管理时间,默认时间为30分钟,如果设置成负数或0表示会话永不超时
    <session-congig>
        <session-timeout>30session-timeout>
    session-congig>

Session的生命周期

  • 服务器关闭时会自动调用invalidate()方法,HttpSession对象会被销毁

  • 超过超时管理时间,HttpSession对象会被销毁

  • 手动调用invalidate()方法,HttpSession对象会被销毁

注意:如果没有指定Cookie的存活时间,当重启浏览器时原来的Cookie就会被销毁,其存储的SessionID也会消失,这时再次访问服务器会产生新的会话,以及新的HttpSession对象,无法再使用以前对象所拥有的属性

你可能感兴趣的:(JavaWeb)