当前位置: 首页 > news >正文

珠海市网站建设_网站建设公司_网站开发_seo优化

谁家网站用户体验做的好,天元建设集团有限公司第二公司,免费做app的网站有吗,php做的一个网站一#xff0c;jwt入门 1.1 是什么#xff1f; JWT#xff0c;全称为 JSON Web Token#xff0c;是一种用于在网络应用之间传递信息的标准方法。它是基于 JSON 格式定义的一种简洁且自包含的方式#xff0c;可以安全地在用户和服务之间传输声明信息 1.2 为什么要使用 ①简…一jwt入门 1.1 是什么 JWT全称为 JSON Web Token是一种用于在网络应用之间传递信息的标准方法。它是基于 JSON 格式定义的一种简洁且自包含的方式可以安全地在用户和服务之间传输声明信息 1.2 为什么要使用 ①简洁性JWT 的格式简洁且体积小可以方便地在网络请求的头部、参数或者正文中传输 ②自包含性JWT 内部包含了所有的认证信息因此服务端不需要针对每个请求都去查询数据库或者进行其他的操作来验证请求的合法性 ③跨平台支持由于 JWT 使用的是标准的 JSON 格式因此在不同平台的应用中都可以方便地使用 JWT的精髓在于“去中心化”数据是保存在客户端的 1.3 工作原理 ① 用户通过用户名和密码等方式进行登录认证 ② 服务端验证用户提供的凭据信息如果验证通过则在服务端生成一个 JWT ③ 服务端将生成的 JWT 返回给客户端 ④ 客户端在每次发送请求时都需要在请求头部或者其他地方添加生成的 JWT ⑤ 服务端接收到请求后验证 JWT 的合法性如果验证通过则处理请求否则返回未授权的错误信息 1.4 核心组成(三部分) 头部Header包含了 JWT 的类型“typ”和使用的签名算法“alg” 载荷Payload是 JWT 实际存放信息的地方包含了一些声明claims例如用户的身份信息、权限等 签名Signature由头部和载荷进行签名生成用于验证 JWT 的合法性 二jwt的工具类 2.1 JwtUtils package com.zking.ssm.jwt;import java.util.Date; import java.util.Map; import java.util.UUID;import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm;/*** JWT验证过滤器配置顺序 CorsFilte-JwtUtilsr--StrutsPrepareAndExecuteFilter**/ public class JwtUtils {/*** JWT_WEB_TTLWEBAPP应用中token的有效时间,默认30分钟*/public static final long JWT_WEB_TTL 30 * 60 * 1000;/*** 将jwt令牌保存到header中的key*/public static final String JWT_HEADER_KEY jwt;// 指定签名的时候使用的签名算法也就是header那部分jwt已经将这部分内容封装好了。private static final SignatureAlgorithm SIGNATURE_ALGORITHM SignatureAlgorithm.HS256;private static final String JWT_SECRET f356cdce935c42328ad2001d7e9552a3;// JWT密匙private static final SecretKey JWT_KEY;// 使用JWT密匙生成的加密keystatic {byte[] encodedKey Base64.decodeBase64(JWT_SECRET);JWT_KEY new SecretKeySpec(encodedKey, 0, encodedKey.length, AES);}private JwtUtils() {}/*** 解密jwt获得所有声明(包括标准和私有声明)* * param jwt* return* throws Exception*/public static Claims parseJwt(String jwt) {Claims claims Jwts.parser().setSigningKey(JWT_KEY).parseClaimsJws(jwt).getBody();return claims;}/*** 创建JWT令牌签发时间为当前时间* * param claims* 创建payload的私有声明根据特定的业务需要添加如果要拿这个做验证一般是需要和jwt的接收方提前沟通好验证方式的* param ttlMillis* JWT的有效时间(单位毫秒)当前时间有效时间过期时间* return jwt令牌*/public static String createJwt(MapString, Object claims, long ttlMillis) {// 生成JWT的时间即签发时间 2021-10-30 10:02:00 - 30 10:32:00long nowMillis System.currentTimeMillis();//链式语法// 下面就是在为payload添加各种标准声明和私有声明了// 这里其实就是new一个JwtBuilder设置jwt的bodyJwtBuilder builder Jwts.builder()// 如果有私有声明一定要先设置这个自己创建的私有的声明这个是给builder的claim赋值一旦写在标准的声明赋值之后就是覆盖了那些标准的声明的.setClaims(claims)// 设置jti(JWT ID)是JWT的唯一标识根据业务需要这个可以设置为一个不重复的值主要用来作为一次性token,从而回避重放攻击。// 可以在未登陆前作为身份标识使用.setId(UUID.randomUUID().toString().replace(-, ))// iss(Issuser)签发者写死.setIssuer(zking)// iat: jwt的签发时间.setIssuedAt(new Date(nowMillis))// 代表这个JWT的主体即它的所有人这个是一个json格式的字符串可放数据{uid:zs}。此处没放// .setSubject({})// 设置签名使用的签名算法和签名使用的秘钥.signWith(SIGNATURE_ALGORITHM, JWT_KEY)// 设置JWT的过期时间.setExpiration(new Date(nowMillis ttlMillis));return builder.compact();}/*** 复制jwt并重新设置签发时间(为当前时间)和失效时间* * param jwt* 被复制的jwt令牌* param ttlMillis* jwt的有效时间(单位毫秒)当前时间有效时间过期时间* return*/public static String copyJwt(String jwt, Long ttlMillis) {//解密JWT获取所有的声明私有和标准//oldClaims claims parseJwt(jwt);// 生成JWT的时间即签发时间long nowMillis System.currentTimeMillis();// 下面就是在为payload添加各种标准声明和私有声明了// 这里其实就是new一个JwtBuilder设置jwt的bodyJwtBuilder builder Jwts.builder()// 如果有私有声明一定要先设置这个自己创建的私有的声明这个是给builder的claim赋值一旦写在标准的声明赋值之后就是覆盖了那些标准的声明的.setClaims(claims)// 设置jti(JWT ID)是JWT的唯一标识根据业务需要这个可以设置为一个不重复的值主要用来作为一次性token,从而回避重放攻击。// 可以在未登陆前作为身份标识使用//.setId(UUID.randomUUID().toString().replace(-, ))// iss(Issuser)签发者写死// .setIssuer(zking)// iat: jwt的签发时间.setIssuedAt(new Date(nowMillis))// 代表这个JWT的主体即它的所有人这个是一个json格式的字符串可放数据{uid:zs}。此处没放// .setSubject({})// 设置签名使用的签名算法和签名使用的秘钥.signWith(SIGNATURE_ALGORITHM, JWT_KEY)// 设置JWT的过期时间.setExpiration(new Date(nowMillis ttlMillis));return builder.compact();} } 该工具类提供了以下几个方法         parseJwt(String jwt)解密JWT获得所有声明。         参数jwt - 要解密的JWT令牌。         返回值包含所有声明的Claims对象。  createJwt(MapString, Object claims, long ttlMillis)创建JWT令牌签发时间为当前时间。         参数claims - 创建payload的私有声明。 ttlMillis - JWT的有效时间单位毫秒。         返回值生成的JWT令牌。  copyJwt(String jwt, Long ttlMillis)复制JWT并重新设置签发时间和失效时间。         参数jwt - 被复制的JWT令牌。 ttlMillis - JWT的有效时间单位毫秒。         返回值生成的新的JWT令牌 2.1 生成JWT package com.zking.ssm.service.impl;import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map;import com.zking.ssm.jwt.JwtUtils; import io.jsonwebtoken.Claims; import org.junit.*;public class JwtDemo {private SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd HH:mm:ss.SSS);Testpublic void test1() {// 生成JWT//JWT TokenHeader.Payload.Signature//头部.载荷.签名//Payload标准声明私有声明公有声明//定义私有声明MapString, Object claims new HashMapString, Object();claims.put(username, zss);claims.put(age, 18);//TTL:Time To LiveString jwt JwtUtils.createJwt(claims, JwtUtils.JWT_WEB_TTL);System.out.println(jwt);//获取Payload包含标准和私有声明Claims parseJwt JwtUtils.parseJwt(jwt);for (Map.EntryString, Object entry : parseJwt.entrySet()) {System.out.println(entry.getKey() entry.getValue());}Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));}Testpublic void test2() {// 解析oldJwt//io.jsonwebtoken.ExpiredJwtExceptionJWT过期异常//io.jsonwebtoken.SignatureException签名异常//String oldJwteyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTA3MTg2NzcsImlhdCI6MTU5MDcxNjg3NywiYWdlIjoxOCwianRpIjoiNDFmZjFiZGFkYzkxNDA3OGE4ZGUyNGRkZDEwYjU4N2IiLCJ1c2VybmFtZSI6InpzcyJ9.DdPvioX6kuhV6lEfD9QAN2eQSk_mO3dYkmDmTQsqa78;//eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjE3MjcsImlhdCI6MTYzNTU1OTkyNywiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ9.dUR-9JUlyRdoYx-506SxXQ3gbHFCv0g5Zm8ZGzK1fzwString newJwteyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY2MjM0Njg3MSwiaWF0IjoxNjYyMzQ1MDcxLCJhZ2UiOjE4LCJqdGkiOiI4YjllNzc3YzFlMDM0MjViYThmMDVjNTFlMTU3NDQ1MiIsInVzZXJuYW1lIjoienNzIn0.UWpJxPxwJ09PKxE2SY5ME41W1Kv3jP5bZGKK-oNUDuM;String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjE3MjcsImlhdCI6MTYzNTU1OTkyNywiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ9.dUR-9JUlyRdoYx-506SxXQ3gbHFCv0g5Zm8ZGzK1fzw;Claims parseJwt JwtUtils.parseJwt(newJwt);for (Map.EntryString, Object entry : parseJwt.entrySet()) {System.out.println(entry.getKey() entry.getValue());}Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));}Testpublic void test3() {// 复制jwt并延时30分钟String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY2MjM0Njg3MSwiaWF0IjoxNjYyMzQ1MDcxLCJhZ2UiOjE4LCJqdGkiOiI4YjllNzc3YzFlMDM0MjViYThmMDVjNTFlMTU3NDQ1MiIsInVzZXJuYW1lIjoienNzIn0.UWpJxPxwJ09PKxE2SY5ME41W1Kv3jP5bZGKK-oNUDuM;//String newJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MDU3NTM2NTUsImlhdCI6MTYwNTc1MTg1NSwiYWdlIjoxOCwianRpIjoiYmNmN2Q1MzQ2YjE3NGU2MDk1MmIxYzQ3ZTlmMzQyZjgiLCJ1c2VybmFtZSI6InpzcyJ9.m1Qn84RxgbKCnsvrdbbAnj8l_5Jwovry8En0j4kCxhc;//String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjI5MDMzNjAsImlhdCI6MTU2MjkwMTU2MCwiYWdlIjoxOCwianRpIjoiZDVjMzE4Njg0MDcyNDgyZDg1MDE5ODVmMDY3OGQ4NjkiLCJ1c2VybmFtZSI6InpzcyJ9.XDDDRRq5jYq5EdEBHtPm7GcuBz4S0VhDTS1amRCdf48;String newJwt JwtUtils.copyJwt(oldJwt, JwtUtils.JWT_WEB_TTL);System.out.println(newJwt);Claims parseJwt JwtUtils.parseJwt(newJwt);for (Map.EntryString, Object entry : parseJwt.entrySet()) {System.out.println(entry.getKey() entry.getValue());}Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));}Testpublic void test4() {// 测试JWT的有效时间MapString, Object claims new HashMapString, Object();claims.put(username, zss);String jwt JwtUtils.createJwt(claims, 3 * 1000L);System.out.println(jwt);Claims parseJwt JwtUtils.parseJwt(jwt);Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));}Testpublic void test5() {// 三秒后再解析上面过期时间只有三秒的令牌因为过期则会报错io.jsonwebtoken.ExpiredJwtException//String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjMzODIsImlhdCI6MTYzNTU2MTU4MiwiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ1.F4pZFCjWP6wlq8v_udfhOkNCpErF5QlL7DXJdzXTHqE;String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY2MjM0Njg3MSwiaWF0IjoxNjYyMzQ1MDcxLCJhZ2UiOjE4LCJqdGkiOiI4YjllNzc3YzFlMDM0MjViYThmMDVjNTFlMTU3NDQ1MiIsInVzZXJuYW1lIjoienNzIn9.UWpJxPxwJ09PKxE2SY5ME41W1Kv3jP5bZGKK-oNUDuM;Claims parseJwt JwtUtils.parseJwt(oldJwt);// 过期后解析就报错了下面代码根本不会执行Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));} } 用于生成JWT。在该方法中定义了私有声明claims并设置了一些键值对例如用户名和年龄。然后调用了JwtUtils.createJwt()方法生成JWT并打印输出。 2.2 解析JWT 用test2()进行解析   用以上生成的JWT字符串进行解析 Testpublic void test2() {// 解析oldJwt//io.jsonwebtoken.ExpiredJwtExceptionJWT过期异常//io.jsonwebtoken.SignatureException签名异常//String oldJwteyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTA3MTg2NzcsImlhdCI6MTU5MDcxNjg3NywiYWdlIjoxOCwianRpIjoiNDFmZjFiZGFkYzkxNDA3OGE4ZGUyNGRkZDEwYjU4N2IiLCJ1c2VybmFtZSI6InpzcyJ9.DdPvioX6kuhV6lEfD9QAN2eQSk_mO3dYkmDmTQsqa78;//eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjE3MjcsImlhdCI6MTYzNTU1OTkyNywiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ9.dUR-9JUlyRdoYx-506SxXQ3gbHFCv0g5Zm8ZGzK1fzwString newJwteyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY2MjM0Njg3MSwiaWF0IjoxNjYyMzQ1MDcxLCJhZ2UiOjE4LCJqdGkiOiI4YjllNzc3YzFlMDM0MjViYThmMDVjNTFlMTU3NDQ1MiIsInVzZXJuYW1lIjoienNzIn0.UWpJxPxwJ09PKxE2SY5ME41W1Kv3jP5bZGKK-oNUDuM;String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjE3MjcsImlhdCI6MTYzNTU1OTkyNywiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ9.dUR-9JUlyRdoYx-506SxXQ3gbHFCv0g5Zm8ZGzK1fzw;Claims parseJwt JwtUtils.parseJwt(newJwt);for (Map.EntryString, Object entry : parseJwt.entrySet()) {System.out.println(entry.getKey() entry.getValue());}Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));}用于解析JWT。在该方法中使用JwtUtils.parseJwt()方法解析了一个旧的JWT并将解析结果打印输出。 2.3 复制JWT并延时30分钟 Testpublic void test3() {// 复制jwt并延时30分钟String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY5NzIwMzU4OCwiaWF0IjoxNjk3MjAxNzg4LCJhZ2UiOjE4LCJqdGkiOiI3YzU4YzNkMDk4OTA0YmE5OTMxMGJhZTRmYWFiMjU0NyIsInVzZXJuYW1lIjoienNzIn0.y7RS88Ionnt12k6WNbLm-6-qw61RtpYrYnUUMAyAWZg;//String newJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MDU3NTM2NTUsImlhdCI6MTYwNTc1MTg1NSwiYWdlIjoxOCwianRpIjoiYmNmN2Q1MzQ2YjE3NGU2MDk1MmIxYzQ3ZTlmMzQyZjgiLCJ1c2VybmFtZSI6InpzcyJ9.m1Qn84RxgbKCnsvrdbbAnj8l_5Jwovry8En0j4kCxhc;//String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NjI5MDMzNjAsImlhdCI6MTU2MjkwMTU2MCwiYWdlIjoxOCwianRpIjoiZDVjMzE4Njg0MDcyNDgyZDg1MDE5ODVmMDY3OGQ4NjkiLCJ1c2VybmFtZSI6InpzcyJ9.XDDDRRq5jYq5EdEBHtPm7GcuBz4S0VhDTS1amRCdf48;String newJwt JwtUtils.copyJwt(oldJwt, JwtUtils.JWT_WEB_TTL);System.out.println(newJwt);Claims parseJwt JwtUtils.parseJwt(newJwt);for (Map.EntryString, Object entry : parseJwt.entrySet()) {System.out.println(entry.getKey() entry.getValue());}Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));} 用于复制JWT并延时30分钟。在该方法中使用JwtUtils.copyJwt()方法复制了一个旧的JWT并设置了新的过期时间并将复制后的JWT打印输出 2.4 测试JWT的有效时间 Testpublic void test4() {// 测试JWT的有效时间MapString, Object claims new HashMapString, Object();claims.put(username, zss);String jwt JwtUtils.createJwt(claims, 3 * 1000L);System.out.println(jwt);Claims parseJwt JwtUtils.parseJwt(jwt);Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));} 用于测试JWT的有效时间。在该方法中创建了一个带有有效时间为3秒的JWT并将其打印输出 2.5 模拟过期JWT的解析 Testpublic void test5() {// 三秒后再解析上面过期时间只有三秒的令牌因为过期则会报错io.jsonwebtoken.ExpiredJwtException//String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjMzODIsImlhdCI6MTYzNTU2MTU4MiwiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ1.F4pZFCjWP6wlq8v_udfhOkNCpErF5QlL7DXJdzXTHqE;String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY5NzIwMzU4OCwiaWF0IjoxNjk3MjAxNzg4LCJhZ2UiOjE4LCJqdGkiOiI3YzU4YzNkMDk4OTA0YmE5OTMxMGJhZTRmYWFiMjU0NyIsInVzZXJuYW1lIjoienNzIn0.y7RS88Ionnt12k6WNbLm-6-qw61RtpYrYnUUMAyAWZg;Claims parseJwt JwtUtils.parseJwt(oldJwt);// 过期后解析就报错了下面代码根本不会执行Date d1 parseJwt.getIssuedAt();Date d2 parseJwt.getExpiration();System.out.println(令牌签发时间 sdf.format(d1));System.out.println(令牌过期时间 sdf.format(d2));} } 用于模拟过期JWT的解析。在该方法中尝试解析一个过期的JWT并会抛出io.jsonwebtoken.ExpiredJwtException异常。 三jwt前后端分离 1.user登录方法要放开用户信息生成jwt串保存到响应头中的代码 2.关闭jwtfilter中的off开关代表开启jwt验证 3.crosfilter中要允许jwt使用请求头及响应头换句话说web.xml要更换配置 后端user JwtFilter  package com.zking.ssm.jwt;import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import io.jsonwebtoken.Claims;/*** * JWT验证过滤器配置顺序 CorsFilter--JwtFilter--struts2中央控制器* * author Administrator**/public class JwtFilter implements Filter {// 排除的URL一般为登陆的URL(请改成自己登陆的URL)private static String EXCLUDE ^/user/userLogin?.*$;private static Pattern PATTERN Pattern.compile(EXCLUDE);private boolean OFF false;// true关闭jwt令牌验证功能Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void destroy() {}Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest req (HttpServletRequest) request;HttpServletResponse resp (HttpServletResponse) response;//获取当前请求路径。只有登录的请求路径不进行校验之外其他的URL请求路径必须进行JWT令牌校验//http://localhost:8080/ssh2/bookAction_queryBookPager.action//req.getServletPath()/bookAction_queryBookPager.actionString path req.getServletPath();if (OFF || isExcludeUrl(path)) {// 登陆直接放行chain.doFilter(request, response);return;}// 从客户端请求头中获得令牌并验证//token头.载荷.签名String jwt req.getHeader(JwtUtils.JWT_HEADER_KEY);Claims claims this.validateJwtToken(jwt);//在这里请各位大哥大姐从JWT令牌中提取payload中的声明部分//从声明部分中获取私有声明//获取私有声明中的User对象 - ModulesBoolean flagfalse;if (null claims) {// resp.setCharacterEncoding(UTF-8);resp.sendError(403, JWT令牌已过期或已失效);return;} else {//1.获取已经解析后的payload私有声明//2.从私有声明中当前用户所对应的权限集合ListString或者ListModule//3.循环权限(Module[id,url])// OK,放行请求 chain.doFilter(request, response);// NO,发送错误信息的JSON// ObjectMapper mappernew ObjectMapper()// mapper.writeValue(response.getOutputStream(),json)String newJwt JwtUtils.copyJwt(jwt, JwtUtils.JWT_WEB_TTL);resp.setHeader(JwtUtils.JWT_HEADER_KEY, newJwt);chain.doFilter(request, response);}}/*** 验证jwt令牌验证通过返回声明(包括公有和私有)返回null则表示验证失败*/private Claims validateJwtToken(String jwt) {Claims claims null;try {if (null ! jwt) {//该解析方法会验证1是否过期 2签名是否成功claims JwtUtils.parseJwt(jwt);}} catch (Exception e) {e.printStackTrace();}return claims;}/*** 是否为排除的URL* * param path* return*/private boolean isExcludeUrl(String path) {Matcher matcher PATTERN.matcher(path);return matcher.matches();}// public static void main(String[] args) {// String path /sys/userAction_doLogin.action?usernamezspassword123;// Matcher matcher PATTERN.matcher(path);// boolean b matcher.matches();// System.out.println(b);// }}运用之前我们就要问到我们的跨域问题了我们要运用这个跨域问题 CorsFilter  package com.zking.ssm.util;import java.io.IOException;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;/*** 配置tomcat允许跨域访问* * author Administrator**/ public class CorsFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {HttpServletResponse httpResponse (HttpServletResponse) servletResponse;HttpServletRequest req (HttpServletRequest) servletRequest;// Access-Control-Allow-Origin就是我们需要设置的域名// Access-Control-Allow-Headers跨域允许包含的头。// Access-Control-Allow-Methods是允许的请求方式httpResponse.setHeader(Access-Control-Allow-Origin, *);// *,任何域名httpResponse.setHeader(Access-Control-Allow-Methods, POST, GET, PUT, DELETE);//允许客户端发一个新的请求头jwthttpResponse.setHeader(Access-Control-Allow-Headers,responseType,Origin,X-Requested-With, Content-Type, Accept, jwt);//允许客户端处理一个新的响应头jwthttpResponse.setHeader(Access-Control-Expose-Headers, jwt,Content-Disposition);//httpResponse.setHeader(Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept);//httpResponse.setHeader(Access-Control-Allow-Methods, POST, GET, PUT, DELETE);// axios的ajax会发两次请求第一次提交方式为option直接返回即可if (OPTIONS.equals(req.getMethod())) {return;}filterChain.doFilter(servletRequest, servletResponse);}Overridepublic void destroy() {} } web.xml: !--CrosFilter跨域过滤器--filterfilter-namecorsFilter/filter-namefilter-classcom.zking.ssm.util.CorsFilter/filter-class/filterfilter-mappingfilter-namecorsFilter/filter-nameurl-pattern/*/url-pattern/filter-mappingstate.js export default{eduName:我不是打工人,jwt: } mutations.js: export default{setEduName:(state,payload){state.eduNamepayload.eduName},setJwt: (state, payload) {state.jwt payload.jwt;}} gettter.js export default{getEduName:(state){return state.eduName;},getJwt: (state) {return state.jwt;}} http.js: // 请求拦截器 axios.interceptors.request.use(function (config) {var jwt window.ss.$store.getters.getJwtif (jwt) {config.headers[jwt]jwt}return config; }, function (error) {return Promise.reject(error); });// 响应拦截器 axios.interceptors.response.use(function (response) {let jwt response.headers[jwt];if (jwt) {//将响应头中的jwt串放入state.js中window.ss.$store.commit(setJwt, {jwt: jwt})}return response; }, function (error) {return Promise.reject(error); }); mian.js /* eslint-disable no-new */ window.ssnew Vue({el: #app,router,store, //在main.js中导入store实例data(){return{Bus:new Vue()}},components: { App },template: App/ }) 效果图
http://www.lebaoying.cn/news/88747.html

相关文章:

  • 专业的企业智能建站价格便宜企业年报网上申报
  • 手机版做我女朋友网站logo免费制作生成
  • 哈尔滨网络公司网站建设网站维护包含哪些内容
  • 哪几个小说网站做网编拿的钱多苏州企业网站建设网络服务
  • 静态网站模板源码下载网站建设福州公司
  • 婚庆行业网站建设方案1网页在线制作网站源码
  • 网站模板下载之后如何修改佛山建设外贸网站公司吗
  • 制作线下交易平台网站建设用discuz做的网站
  • 珠海企业网站设计公司创意礼物网站建设与管理
  • 凡科做网站外国炫酷网站网址
  • 重庆专业网站建设公司简述微信营销的技巧
  • 飞速网站排名网站建设运营外包
  • 保山便宜的网站建设如何做哟个优惠券网站
  • 怎么在网站做推广和宣传wordpress用户中心汉化
  • php mysql 网站开发网站移动排名
  • 泉州网站制作哪个好微seo服务套餐
  • 网站建设自己能做吗wordpress 查询当月
  • 北京的电商平台网站制作手机的游戏
  • 网站空间排名北京到天津
  • c2c网站页面设计特点小程序定制开发和模板有什么区别
  • 利用小米路由器mini做网站北京app软件开发公司
  • 重庆建设工程交易信息网站攀枝花住房和城乡建设厅网站
  • wordpress类似网站模板西部数码网站建设助手
  • wordpress存档进一步优化供给推动消费平稳增长
  • 云南医疗seo整站优化互联在线app开发网站
  • 布吉网站建设哪家公司便宜点360建筑网 官方网站
  • 自助建站自媒体移动端应用开发
  • 谁有wap网站知彼网络网站建设
  • 住建部网站建设部做网站需要会什么软件
  • 企业网站查询系统官网制作 网站