目录
一、Jwt了解
jwt是什么?
JSON Web Token (JWT),它是目前最流行的跨域身份验证解决方案
为什么使用它?
JWT的精髓在于:“去中心化”,数据是保存在客户端的。
由什么组成?
一个JWT实际上就是一个字符串,它由三部分组成:头部(Header)、载荷(Payload)与签名(signature)
JWT运用原理、机制:(面试题)
1.第一次发送登录请求,必然会携带用户信息uname和pwd。
2.通过用户信息uname和pwd登录成功,会将用户信息通过jwt工具生成一个加密的字符串。
3.加密字符串,会以response header响应头形式响应至前端。
4.前端服务器会有响应拦截器拦截,截取到响应头承载的jwt串,又会放到vuex中。
5.当第二次请求,前端服务器中有一个请求拦截器,会将vuex的jwt串放入request header 请求头中。
6.当请求通过跨域的方式到达后台服务器,后台服务器中又有一个过滤器,会截取的jwt串中。
7.jwt工具类会对jwt串进行解析,解析成用户信息,最终进行校验。
二、jwt实现
后台代码
useraction
package com.zking.vue.web;
import java.util.HashMap;
import java.util.Map;import com.fasterxml.jackson.databind.ObjectMapper;
import com.opensymphony.xwork2.ModelDriven;
import com.zking.base.web.BaseAction;
import com.zking.vue.biz.UserBiz;
import com.zking.vue.entity.User;
import com.zking.vue.util.JsonData;
import com.zking.vue.util.JwtUtils;
import com.zking.vue.util.PageBean;
import com.zking.vue.util.ResponseUtil;
import com.zking.vue.util.StringUtils;public class UserAction extends BaseAction implements ModelDriven<User>{
private UserBiz userBiz;
private User user = new User();public UserBiz getUserBiz() {
return userBiz;
}public void setUserBiz(UserBiz userBiz) {
this.userBiz = userBiz;
}
public String login() {
ObjectMapper om = new ObjectMapper();
JsonData jsonData = null;
try {
if(StringUtils.isBlank(user.getUname()) || StringUtils.isBlank(user.getPwd())) {
jsonData = new JsonData(0, "用户或者密码为空", user);
}else {
User u = this.userBiz.login(user);
Map<String, Object> claims = new HashMap<String, Object>();
claims.put("uname",user.getUname());
claims.put("pwd", user.getPwd());
String jwt = JwtUtils.createJwt(claims, JwtUtils.JWT_WEB_TTL);
response.setHeader(JwtUtils.JWT_HEADER_KEY, jwt);
jsonData = new JsonData(1, "登录成功", u);
}
} catch (Exception e) {
e.printStackTrace();
jsonData = new JsonData(0, "用户或者密码错误", user);
}finally {
try {
ResponseUtil.write(response, om.writeValueAsString(jsonData));
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
public String getAsyncData() {
ObjectMapper om = new ObjectMapper();
try {
Thread.sleep(6000);