一、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);
}
}