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

安康市汉滨区新闻seo推广教程seo高级教程

安康市汉滨区新闻,seo推广教程seo高级教程,可以自己买个服务器做网站吗,wordpress公司主页前言#xff1a; 定义#xff1a;JSON Web Token#xff08;缩写 JWT#xff09;是目前最流行的跨域认证解决方案 JWT官网 由于HTTP协议是无状态的#xff0c;这意味着如果我们想判定一个接口是否被认证后访问#xff0c;就需要借助cookie或者session会话机制进行判定 定义JSON Web Token缩写 JWT是目前最流行的跨域认证解决方案 JWT官网 由于HTTP协议是无状态的这意味着如果我们想判定一个接口是否被认证后访问就需要借助cookie或者session会话机制进行判定但是由于现在的系统架构大部分都不止一台服务器此时又要借助数据库或者全局缓存 做存储这种方案显然受限太多。 那么我们可不可以让认证令牌的发布者自己去识别这个令牌是不是我曾经发布的令牌呢JWT核心思想这是JWT最大的优点也是最大的缺点优点是简单快捷、不需要依赖任何第三方操作就能实现身份认证缺点就是对于任何拥有用户发布令牌的请求都会认证通过。 1.  JWT是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519)它定义了一种紧凑的、自包含的方式用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任因为它是数字签名的。 2. 什么时候你应该用JWT 下列场景中使用JSON Web Token是很有用的 Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录后续每个请求都将包含JWT允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性因为它的开销很小并且可以轻松地跨域使用。Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名例如用公钥/私钥对你可以确定发送人就是它们所说的那个人。另外由于签名是使用头和有效负载计算的您还可以验证内容没有被篡改。 3. JWT的结构是什么样的 JSON Web Token由三部分组成它们之间用圆点(.)连接。这三部分分别是 HeaderPayloadSignature 因此一个典型的JWT看起来是这个样子的 Header.Payload.Signature 接下来具体看一下每一部分 Header header典型的由两部分组成token的类型“JWT”和算法名称比如HMAC SHA256或者RSA等等。 例如 然后用Base64对这个JSON编码就得到JWT的第一部分 Payload JWT的第二部分是payload它包含声明要求。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型: registered, public 和 private。 Registered claims : 这里有一组预定义的声明它们不是强制的但是推荐。比如iss (issuer), exp (expiration time), sub (subject), aud (audience)等。Public claims : 可以随意定义。Private claims : 用于在同意使用它们的各方之间共享信息并且不是注册的或公开的声明。 Payload 部分也是一个 JSON 对象用来存放实际需要传递的数据。JWT 规定了7个官方字段供选用。 iss (issuer)签发人exp (expiration time)过期时间sub (subject)主题aud (audience)受众nbf (Not Before)生效时间iat (Issued At)签发时间jti (JWT ID)编号 除了官方字段你还可以在这个部分定义私有字段下面就是一个例子。 对payload进行Base64编码就得到JWT的第二部分 注意不要在JWT的payload或header中放置敏感信息除非它们是加密的。 Signature 为了得到签名部分你必须有编码过的header、编码过的payload、一个秘钥签名算法是header中指定的那个然对它们签名即可。 例如 HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload), secret) 签名是用于验证消息在传递过程中有没有被更改并且对于使用私钥签名的token它还可以验证JWT的发送方是否为它所称的发送方。 看一张官网的图就明白了 4. JWT是如何工作的 在认证的时候当用户用他们的凭证成功登录以后一个JSON Web Token将会被返回。此后token就是用户凭证了你必须非常小心以防止出现安全问题。一般而言你保存令牌的时候不应该超过你所需要它的时间。 无论何时用户想要访问受保护的路由或者资源的时候用户代理通常是浏览器都应该带上JWT典型的通常放在Authorization header中用Bearer schema。 header应该看起来是这样的 Authorization: Bearer token 服务器上的受保护的路由将会检查Authorization header中的JWT是否有效如果有效则用户可以访问受保护的资源。如果JWT包含足够多的必需的数据那么就可以减少对某些操作的数据库查询的需要尽管可能并不总是如此。 如果token是在授权头Authorization header中发送的那么跨源资源共享(CORS)将不会成为问题因为它不使用cookie。 下面这张图显示了如何获取JWT以及使用它来访问APIs或者资源 应用或者客户端想授权服务器请求授权。例如如果用授权码流程的话就是/oauth/authorize当授权被许可以后授权服务器返回一个access token给应用应用使用access token访问受保护的资源比如API 4.1JWT原理 JWT全称JSON Web Token。当服务器认证成功后会生成一个Token这个token包含了header、payload、signature三部分信息。其中payload的内容有过期时间、签发时间、还有自定义的字段。自定义字段往往用来存放用户信息比如UserIdUserName等等信息。当客户端收到这个token后存储在Cookielocalstorage或者别的什么地方并且以后每次请求都带上token。服务端对请求所携带的token进行解析判断是否过期是否合法。 ​ 以上简单的描述了下JWT的工作原理因为jwt的payload携带了过期时间、用户信息等所以JWT有别于传统Session方案的一个最大不同就是JWT是无状态的JWT不用在内存或DB里维持session的状态直接拿到token解析就可以了。 原理图 ​ 4.2 JWT 的几个特点 1JWT 默认是不加密但也是可以加密的。生成原始 Token 以后可以用密钥再加密一次。 2JWT 不加密的情况下不能将秘密数据写入 JWT。 3JWT 不仅可以用于认证也可以用于交换信息。有效使用 JWT可以降低服务器查询数据库的次数。 4JWT 的最大缺点是由于服务器不保存 session 状态因此无法在使用过程中废止某个 token或者更改 token 的权限。也就是说一旦 JWT 签发了在到期之前就会始终有效除非服务器部署额外的逻辑。 5JWT 本身包含了认证信息一旦泄露任何人都可以获得该令牌的所有权限。为了减少盗用JWT 的有效期应该设置得比较短。对于一些比较重要的权限使用时应该再次对用户进行认证。 6为了减少盗用JWT 不应该使用 HTTP 协议明码传输要使用 HTTPS 协议传输。 4.3 JWT常见问题 ① JWT 安全吗? Base64编码方式是可逆的也就是透过编码后发放的Token内容是可以被解析的。一般而言我们都不建议在有效载荷内放敏感讯息比如使用者的密码。 ② JWT Payload 內容可以被伪造吗 JWT其中的一个组成内容为Signature可以防止通过Base64可逆方法回推有效载荷内容并将其修改。因为Signature是经由Header跟Payload一起Base64组成的。 ③ 如果我的 Cookie 被窃取了那不就表示第三方可以做 CSRF 攻击? 是的Cookie丢失就表示身份就可以被伪造。故官方建议的使用方式是存放在LocalStorage中并放在请求头中发送。 ④ 空间及长度问题 JWT Token通常长度不会太小特别是Stateless JWT Token把所有的数据都编在Token里很快的就会超过Cookie的大小4K或者是URL长度限制。 ⑤ Token失效问题 无状态JWT令牌Stateless JWT Token发放出去之后不能通过服务器端让令牌失效必须等到过期时间过才会失去效用。假设在这之间Token被拦截或者有权限管理身份的差异造成授权Scope修改都不能阻止发出去的Token失效并要求使用者重新请求新的Token。 JWT 有个问题导致很多开发团队放弃使用它那就是一旦颁发一个 JWT 令牌服务端就没办法废弃掉它除非等到它自身过期。有很多应用默认只允许最新登录的一个客户端正常使用不允许多端登录JWT 就没办法做到因为颁发了新令牌但是老的令牌在过期前仍然可用。这种情况下就需要服务端增加相应的逻辑。 4.4 使用方式 了解了 JWT 的结构和算法后那怎么使用呢假设我这儿有个网站。 1、在用户登录网站的时候需要输入用户名、密码或者短信验证的方式登录登录请求到达服务端的时候服务端对账号、密码进行验证然后计算出 JWT 字符串返回给客户端。 2、客户端拿到这个 JWT 字符串后存储到 cookie 或者 浏览器的 LocalStorage 中。 3、再次发送请求比如请求用户设置页面的时候在 HTTP 请求头中加入 JWT 字符串或者直接放到请求主体中。 4、服务端拿到这串 JWT 字符串后使用 base64的头部和 base64 的载荷部分通过HMACSHA256算法计算签名部分比较计算结果和传来的签名部分是否一致如果一致说明此次请求没有问题如果不一致说明请求过期或者是非法请求。 ​ ​ 4.5 常用的 JWT 库 JWT 官网列出了各种语言对应的库其中 Java 的如下几个。 ​ 5. JWT的工具类的使用 1. 依赖 在后端项目中导入依赖: properties配置 jwt.version0.9.1/jwt.version java.jwt.version3.4.0/java.jwt.version 在dependencies配置标签中  dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion${jwt.version}/version /dependency dependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion${java.jwt.version}/version /dependency 2. 后台工具类 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() {} } 3. 过滤器 在后台创建过滤器 : JwtFilter    JwtUtils 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 true;// 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);// }}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();} } 4. 控制器 UserController RequestMapping(/userLogin)ResponseBodypublic JsonResponseBody? userLogin(UserVo userVo, HttpServletResponse response){if(userVo.getUsername().equals(admin)userVo.getPassword().equals(123)){//私有要求claimMapString,Object jsonnew HashMapString,Object();json.put(username, userVo.getUsername());//生成JWT并设置到response响应头中String jwtJwtUtils.createJwt(json, JwtUtils.JWT_WEB_TTL);response.setHeader(JwtUtils.JWT_HEADER_KEY, jwt);return new JsonResponseBody(用户登陆成功,true,0,null);}else{return new JsonResponseBody(用户名或密码错误,false,0,null);}} 5. web.xml配置 !--CrosFilter跨域过滤器--filterfilter-namecorsFilter/filter-namefilter-classcom.zking.ssm.util.CorsFilter/filter-class/filterfilter-mappingfilter-namecorsFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--JwtFilter--filterfilter-namejwtFilter/filter-namefilter-classcom.zking.ssm.jwt.JwtFilter/filter-class/filterfilter-mappingfilter-namejwtFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping 6. 测试类 生成JWT  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));} 解析JWT public void test2() {// 解析oldJwt//io.jsonwebtoken.ExpiredJwtExceptionJWT过期异常//io.jsonwebtoken.SignatureException签名异常//String oldJwteyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1OTA3MTg2NzcsImlhdCI6MTU5MDcxNjg3NywiYWdlIjoxOCwianRpIjoiNDFmZjFiZGFkYzkxNDA3OGE4ZGUyNGRkZDEwYjU4N2IiLCJ1c2VybmFtZSI6InpzcyJ9.DdPvioX6kuhV6lEfD9QAN2eQSk_mO3dYkmDmTQsqa78;//eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzU1NjE3MjcsImlhdCI6MTYzNTU1OTkyNywiYWdlIjoxOCwianRpIjoiN2RlYmIzM2JiZTg3NDBmODgzNDI5Njk0ZWE4NzcyMTgiLCJ1c2VybmFtZSI6InpzcyJ9.dUR-9JUlyRdoYx-506SxXQ3gbHFCv0g5Zm8ZGzK1fzwString newJwteyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY5NzIwODE1OCwiaWF0IjoxNjk3MjA2MzU4LCJhZ2UiOjE4LCJqdGkiOiJjZjA4YjYxZjQxMDY0MTA3YTkyNTc2NGI5ZGIwMTAyZSIsInVzZXJuYW1lIjoienNzIn0.tIIb3wQizd6GkfivNc4XDLE09hyuaW1jLTLtHpnwJ2Q;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并延时30分钟 Testpublic void test3() {// 复制jwt并延时30分钟String oldJwt eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ6a2luZyIsImV4cCI6MTY5NzIwODE1OCwiaWF0IjoxNjk3MjA2MzU4LCJhZ2UiOjE4LCJqdGkiOiJjZjA4YjYxZjQxMDY0MTA3YTkyNTc2NGI5ZGIwMTAyZSIsInVzZXJuYW1lIjoienNzIn0.tIIb3wQizd6GkfivNc4XDLE09hyuaW1jLTLtHpnwJ2Q;//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的有效时间 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的解析 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));} 7. JWT集成spa项目 state.js export default {eduName: ar.小白,jwt: } getters.js export default {getEduName: (state) {return state.eduName;},getJwt: (state) {return state.jwt;} } mutations.js export default {// type(事件类型) 其值为setEduName// payload官方给它还取了一个高大上的名字载荷其实就是一个保存要传递参数的容器setEduName: (state, payload) {state.eduName payload.eduName;},setJwt: (state, payload) {state.jwt payload.jwt;} } main.js /* eslint-disable no-new */ window.mm new Vue({el: #app,router,store,data() {return {bus: new Vue()}},components: {App},template: App/ }) http.js // 请求拦截器 axios.interceptors.request.use(function(config) {let jwt window.mm.$store.getters.getJwt;if(jwt){config.headers[jwt] jwt;}return config; }, function(error) {return Promise.reject(error); });// 响应拦截器 axios.interceptors.response.use(function(response) {//将响应头中的jwt字符串放入state.js中let jwt response.headers[jwt];if (jwt) {window.mm.$store.commit(setJwt, {jwt: jwt});}return response; }, function(error) {return Promise.reject(error); });
http://www.sadfv.cn/news/53442/

相关文章:

  • 遨翔网站建设wordpress网站生成app
  • 网站推广计划书范文500字泰州整站优化
  • 做网站郑州网站运营主要是做什么
  • js网站源码下载网站空间格式asp
  • 河北建设厅安监站官方网站页框 wordpress插件
  • 济南网站建设小程序开发怎样开始学做自媒体
  • 做一份seo网站诊断wordpress苏醒主题
  • 上云网站做等保人力资源公司加盟合作
  • 网站开发 理念怎么写佛山新网站制作
  • 网站全站开发长春网站建设致电吉网传媒优
  • 网站建设的栏目策划怎么做好网络营销推广
  • 怎么创建网站根目录浏览器直接进入网站的注意事项
  • 网站开发和app开发的区别宁波制作网站企业有哪些
  • 长沙做网站找哪家好构建网站需要会什么意思
  • 怎样获得做网站的客户国内做轮胎网站哪家好
  • 优惠券网站要怎么做推广贾汪城乡建设局网站
  • 如何建设红色旅游网站河南省城乡和住房建设厅网站首页
  • 网站如何提交关键词wordpress插件太多
  • iis做网站之vps企业用什么做网站
  • 环保设备网站建设方案腾讯云网站建设教程视频
  • 企业网站模板源码有哪些做外贸不能访问国外网站怎么办
  • 容桂低价网站建设WordPress主题在线生成
  • 珠海市网站开发公司电话中国建设传媒网官网
  • 优化网站要怎么做wordpress 存储空间
  • 佛山网站建设网站建设商业网络
  • 天津网站建设企业系统网站改版的宣传词
  • 网站建设linux网站建设市场多大
  • 网站项目建设措施小礼品网络定制
  • 高州市荷花镇网站建设河池市城乡住房建设厅网站
  • 哪个网站做团购要求低点北京住房及城乡建设部网站