Cookie和Session

无状态HTTP协议

无状态:前一次请求和后一次请求之间没有关联(数据不能共享)

会话:客户端与服务端的多次请求和响应的一个过程称为一次会话,一次会话可以有多个请求

会话跟踪技术:

​ 在一次会话的不同请求之间共享数据的技术

​ 常见的会话跟踪技术:

​ Cookie:将数据保存在客户端浏览器

​ Session:将数据保存在服务器端,依赖Cookie的

Cookie

​ 将一小段文本信息保存在客户端浏览器中的一种会话跟踪技术

​ 原理:

​ 1.当浏览器第一次发送请求服务器

​ 2.遇到服务器端创建Cookie的代码,就会用set-Cookie的方法将Cookie的数据传回给浏览器

​ 3.浏览器默认保存在内存中

​ 4.只要浏览器没有关闭过,当第二次请求时,浏览器会自动将Cookie的数据以Cookie的方式传回给服务器

package com.wz.controller;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/system")
public class TestController {
      
	
	/**
	 * 
	 * @author: 
	 * @date: 2020年12月15日
	 * @version: V1.0
	 * @param: @param resp
	 * @param: @throws IOException   
	 * @return: void  
	 * @Description: 设置cookie
	 *
	 */
	@RequestMapping("/add")
	public void test(HttpServletResponse resp) throws IOException{
     
		Cookie cookie = new Cookie("id", "1");
		/** cookie存在时间 */
		/** 立即结束 */
		cookie.setMaxAge(0);
		
		Cookie cookie1 = new Cookie("name", "hanhan");
		
		/** 重新赋值 */
		Cookie cookie3 = new Cookie("name", "XYY");
		
		/** 设置cookide获取路径 */
		cookie3.setPath("/");
		
		Cookie cookie2 = new Cookie("address", URLEncoder.encode("青青草原", "utf-8"));
		
		/** cookie存在时间 */
		/** 隔一段时间结束 */
		cookie2.setMaxAge(15);
		
		resp.addCookie(cookie);
		resp.addCookie(cookie1);
		resp.addCookie(cookie3);
		resp.addCookie(cookie2);
		
		
		resp.getWriter().print("success");
	}
	
	/**
	 * 
	 * @author: 
	 * @date: 2020年12月15日
	 * @version: V1.0
	 * @param: @param req   
	 * @return: void  
	 * @throws UnsupportedEncodingException 
	 * @Description: 获取cookie
	 *
	 */
	@RequestMapping("/get")
	public void getCookie(HttpServletRequest req) throws UnsupportedEncodingException{
     
		Cookie[] cookies = req.getCookies();
		
		for (Cookie cookie : cookies) {
     
			String name = cookie.getName();
			String value = cookie.getValue();
			System.out.println(name + ":" + URLDecoder.decode(value, "UTF-8"));
		}
	}
}

中文乱码

//value如果是中文需要编码:
URLEncoder.encode("中文","UTF-8")
    
//解码:
URLDecoder.decode(c.getValue(),"UTF-8")

生命周期

默认请求下:浏览器会将Cookie保存在内存中,只有浏览器不关闭,数据都在。直到浏览器关闭,数据消失

setMaxAge(int n)
    
//n<0:默认状态,保存在内存中,关闭浏览器数据失效
//n=0:立即删除
//n>0:保存在硬盘中,持续n秒(这时跟浏览器关不关闭无关)

Cookie不能跨路径获取

优点:

​ 减轻了服务器压力

缺点:

​ 1.数据保存在浏览器中容易丢失,不安全

​ 2.保存数据有限

​ 3.保存的数据大小有限

Session

将数据保存在服务器端的会话跟踪技术

原理

​ 1.当浏览器第一次发送请求服务器

​ 2.遇到服务器端创建Session的代码,就会创建一个Session对象,然后为该Session对象分配一个id即为jsessionId,并以set-Cookie的方式将该id传回给浏览器,浏览器保存起来

​ 3.只要浏览器没有关闭过,当第二次请求时,会自动将jsessionId以Cookie的方式传回给服务器,服务器根据该jsessionId去服务器查询

生命周期:

创建session对象到销毁session对象

优点:

​ 安全性相对较高

​ 保存数据的大小理论上没有限制

​ 数据类型没有限制

缺点:

​ 一定程度上会影响服务器性能

你可能感兴趣的:(java,session,cookie)