前言:
如今我们对“当前登录失效请重新登录怎么回事”大体比较讲究,咱们都需要剖析一些“当前登录失效请重新登录怎么回事”的相关内容。那么小编在网络上网罗了一些有关“当前登录失效请重新登录怎么回事””的相关内容,希望你们能喜欢,咱们一起来了解一下吧!JWT 介绍
JWT是JSON Web Token 的缩写,是为了在网络应用环境间传递声明而执行的一种基于JSON 的开放标准((RFC 7519)。定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT 可以使用 HMAC 算法或者是 RSA 的公私秘钥对进行签名。
JWT流程
步骤说明:
用户使用账号和密码向服务端发起请求。服务器使用私钥根据JWT的规则生成一个token。服务器返回这个token给浏览器。浏览器将该token放在请求头中向服务器发送请求。服务器根据JWT规则验证该 token。服务器返回信息给浏览器。
JWT 数据结构
JWT由三部分构成,分别为头部(Header),负载(Payload)和签名(Signature)。头部包括签名算法、token类型,负载用来存放实际需要传递的有效信息。签名部分是对前两部分的签名,防止数据篡改。服务器端会指定一个密钥,这个密钥对客户端保密。使用 Header 里面指定的签名算法(默认是 HMAC SHA256)对头部和负载进行签名,然后把签名返回给客户端。对于客户端来讲,就是一段字符串,这里就不再过多讲解。
SpringBoot整合JWT
1.pom文件中引用依赖
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.8.2</version> </dependency>
2.用到的用户信息实体类
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
3.token的生成和认证
public class JwtUtil { private static final String SECRET = "0123456789"; private static final long EXPIRATION = 1800L; /** * 生成token */ public static String createToken(User user) { Date expireDate = new Date(System.currentTimeMillis() + EXPIRATION * 1000); Map<String, Object> map = new HashMap<>(); map.put("alg", "HS256"); map.put("typ", "JWT"); String token = JWT.create() .withHeader(map)// 添加头部 //可以将基本信息放到claims中, .withClaim("userName", user.getUsername()) .withClaim("password", user.getPassword()) .withExpiresAt(expireDate) //过期时间 .withIssuedAt(new Date()) //签发时间 .sign(Algorithm.HMAC256(SECRET)); //加密 return token; } /** * 解析token */ public static Map<String, Claim> verifyToken(String token) { DecodedJWT jwt = null; try { JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build(); jwt = verifier.verify(token); } catch (Exception e) { return null; } return jwt.getClaims(); }}
4.JWT过滤器,用于对token的统一验证
/* *在启动类上一定要加 @ServletComponentScan 注解,否则 urlPatterns 会不启作用 * urlPatterns配置要以“/”开始 */@WebFilter(filterName = "JwtFilter", urlPatterns = "/work/*")public class JwtFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { final HttpServletRequest request = (HttpServletRequest) req; final HttpServletResponse response = (HttpServletResponse) res; response.setCharacterEncoding("UTF-8"); final String token = request.getHeader("authorization"); if (token == null) { response.getWriter().write("没有token!"); return; } Map<String, Claim> userData = JwtUtil.verifyToken(token); if (userData == null) { response.getWriter().write("token失效,请重新登陆!"); return; } String userName = userData.get("userName").asString(); String password = userData.get("password").asString(); request.setAttribute("userName", userName); request.setAttribute("password", password); chain.doFilter(req, res); } @Override public void destroy() { }}
5.Controller代码,
@RestControllerpublic class JwtController { @RequestMapping("/login") public String login(User user) { String token = JwtUtil.createToken(user); return token; } @RequestMapping("/work/getUser") public String login(HttpServletRequest request) { String userName = request.getAttribute("userName").toString(); String password = request.getAttribute("password").toString(); return "当前用户信息:userName=" + userName + ",password=" + password; }}
6.执行login
返回登陆用户的token
7.执行/work/getUser。要把登陆后返回的token放到Header的Authorization参数中。
Token与Session比较token支持跨域,Session因需要cookie支持所以不能跨域token无状态,session有状态的token更适用于移动应用,Cookie不支持手机端访问的token能够预防CSRF攻击token对单点登陆友好token不能在服务端注销,不好解决劫持问题token比session更占用带宽
标签: #当前登录失效请重新登录怎么回事 #过滤器验证用户登录怎么弄 #token放到header #token放入header