【Cookie、Session、Token】与【Request、Response】

一、Request、Response简单介绍

Request是浏览器请求头,请求头有什么信息,Request就有什么信息。
Response是浏览器响应头,响应头有什么信息,Response就有什么信息。

二、cookie、session、token的流程

1. cookie的流程

(数据保存在浏览器)
在这里插入图片描述

2. session的流程

(数据保存在服务器,sessionID保存在浏览器)
在这里插入图片描述
在这里插入图片描述

3. token流程

(数据跟token经过加密在浏览器,服务器保存加密的密钥)
在这里插入图片描述

三、cookie、session、token的使用

1. cookie的简单使用示例

服务器将Cookie添加到浏览器

// 设置Cookie的key-value
Cookie cookie1 = new Cookie("username","Adam");
// 设置Cookie的有效时间,以秒为单位
cookie1.setMaxAge(60 * 60 * 24);
// 设置路径:cookie.setPath(“/项目名/路径”),这样设置只有访问“/项目名/路径”下的的资源才会携带 Cookie
cookie1.setPath(getServletContext().getContextPath() + "/");
// 通过response响应,在浏览器中添加的Cookie
response.addCookie(cookie1);

服务器读取浏览器发来的Cookie

// 从request中获取所有cookie
Cookie[] cookies = request.getCookies();
// 遍历Cookie
for(Cookie c : cookies){
    
    
	// 获取cookie的键值对
	String cookieKey = c.getName();
	String cookieValue = c.getValue();
	System.out.println("CookieKey:" + cookieKey + ",CookieValue:" + cookieValue);
}

2. session的简单使用示例

// 在请求头中根据sessionID获取对应的session
HttpSession session = request.getSession();
// 向session中添加键值对key-value
session.setAttribute("username", username);
// 从session中得到key对应的属性值
String username1 = session.getAttribute("username");
// 设置最长访问间隔时间
session.setMaxInactiveInterval(60*60*24);
// 删除session中对应的属性
session.removeAttribute("username");
// 获取sessionID
String id = session.getId();
// 使session立即无效
session.invalidate();

3. token的简单使用示例

token的工具类

public class TokenUtil{
    
    

	// 根据传进来的user的属性来生成Token
	public String generateToken(User user){
    
    
		// 获取现在的时间
		Date start = new Date();
		// 设置一小时有效时间
		long currentTime = System.currentTimeMillis() + 60 * 60 * 1000;		
		Date end = new Date(currentTime);
		
		// 生成token
		String token = "";
		token = JWT.create()
                .withAudience(user.getId().toString())
                .withAudience(user.getUsername())
                .withIssuedAt(start)
                .withExpiresAt(end)
                .sign(Algorithm.HMAC256(user.getPassword()));
         
        // 返回token
       	return token;
	}

	// 获取制定token中某个属性值
    public static String get(String token, String key) {
    
    
        List<String> list= JWT.decode(token).getAudience();
        String userId = JWT.decode(token).getAudience().get(0);
        return userId;
    }

	// 获取token
    public String getToken(HttpServletRequest request) {
    
    
        Cookie[] cookies = request.getCookies();
        for (Cookie c :
                cookies) {
    
    
            if (c.getName().equals("token")) {
    
    
                return c.getValue();
            }
        }
        return null;
    }
}

服务器生成Token并添加到浏览器的Cookie中

public class UserServiceImpl implements UserService{
    
    
	@Autowired
	private UserMapper userMapper;
	
	@Autowired
	TokenUtil tokenUtil;

	public R loginCheck(User user, HttpServletResponse response){
    
    
		User user2 = userMapper.selectByName(user.getUsername());
		if(user2 == null){
    
    
			return R.error().message("该用户不存在!");
		}
		if(!user2.getPassword().equals(user.getPassword())){
    
    
			return R.error().message("密码错误!");
		}

		// 获取token
		String token = tokenUtil.generateToken(user2);
		// 将token放在Cookie中
		Cookie cookie = new Cookie("token", token);
		// 将token的Cookie保存到浏览器中
		response.addCookie(cookie);
	}	
}

猜你喜欢

转载自blog.csdn.net/m0_46638350/article/details/130131395
今日推荐