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

网站建设万禾wordpress付费发布

网站建设万禾,wordpress付费发布,河北远策网站建设,福建住房和城乡建设网站目录 概念 JWT Token在项目中使用 概念 有状态和无状态服务是两种不同的服务架构#xff0c;两者的不同之处在于对于服务状态的处理。 1、有状态服务 是指程序在执行过程中生成的中间数据#xff0c;服务器端一般都要保存请求的相关信息#xff0c;每个请求可以默认地使…目录 概念 JWT Token在项目中使用 概念 有状态和无状态服务是两种不同的服务架构两者的不同之处在于对于服务状态的处理。 1、有状态服务 是指程序在执行过程中生成的中间数据服务器端一般都要保存请求的相关信息每个请求可以默认地使用以前的请求信息。示意图如下 上图中浏览器客户端请求后台数据通过nginx负载均衡到3个tomcat服务器上并且将Session信息保存在redis中下一次客户端发送请求时服务器检查session信息是否存在、是否有效、是否过期检查无问题后接受客户端请求并返回数据到客户端。此种情况为有状态即服务端保存了客户信息session中的信息。 2、无状态服务。 是指容器在运行时不在容器中保存任何数据而将数据统一保存在容器外部。服务器端所能够处理的过程必须全部来自于请求所携带的信息以及其他服务器端自身所保存的、并且可以被所有请求所使用的公共信息。 上图中浏览器客户端请求后台数据时携带了token信息nginx负载均衡到tomcat服务器上服务器通过解密token判断用户的请求是否有效用户是否登录是否过期token是否伪造对真实有效的token服务端接受客户端请求并返回数据到客户端。此种情况为无状态即服务端没有保存客户信息。 3、有状态、无状态比较 特点有状态无状态优点 服务端控制状态方便处理 比如设置Session过期时间 强制设置Session下线 无存储简单方便 去中心化有状态下session集中存放Redis) 缺点服务端存储了客户信息增加服务器压力                        服务器控制能力弱 技术趋势新架构的项目往往采用无状态模式 JWT JSON Web TokenJWT是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。一个 JWT 实际上就是一个字符串它由三部分组成头部、载荷与签名。前两部分需要经过 Base64 编码后一部分通过前两部分 Base64 编码后再加密而成。 JWT组成:Header  Payload  Signature Header:头部用于描述关于该 JWT 的最基本的信息例如其类型以及签名所用的算法等如{type:JWT,alg:HS256}Base64 加密header后的字符串为JWT官网 可以验证eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 Payload一般添加用户的相关信息或其他业务需要的必要信息但不建议添加敏感信息因为该部分在客户端可解密。如{id:1,name:张三,sex:male}Base64 加密Payload后的字符串为JWT官网 可以验证eyJpZCI6IjEiLCJuYW1lIjoi5byg5LiJIiwic2V4IjoibWFsZSJ9 Signature这个部分需要 Base64 加密后的 header 和 Base64 加密后的 payload 使用 “.” 连接组成的字符串然后通过 header 中声明的加密方式进行加盐 salt组合加密然后就构成了 jwt 的第三部分。如salt设置为abcSignature字符串为mZKsezNd5e5Q0Gi4vdeyEH3-ilxG_qEHkZp0gn7ayr0 综上公式如下 Token Base64(Header).Base64(Payload).Base64(Signature) Signature Header指定的签名算法(Base64(header).Base64(payload),秘钥) 生成后的token信息为eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJuYW1lIjoi5byg5LiJIiwic2V4IjoibWFsZSJ9.mZKsezNd5e5Q0Gi4vdeyEH3-ilxG_qEHkZp0gn7ayr0 Token在项目中使用 使用场景在实际开发中用户登录成功后后端生成 jwt 返回给前端之后前端与后端交互时携带 jwt 信息让后端验证 jwt 的合法性。使用步骤如下: 1、添加依赖pom.xml 主要依赖jsonwebtoken ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.6/versionrelativePath//parentgroupIdcom.gingko/groupIdartifactIdspringboot/artifactIdversion0.0.1-SNAPSHOT/versionnamespringboot/namedependencies!-- 依赖spring-web--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- springboot默认数据源HikariCP)--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependency!-- mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.16/version/dependency!-- 整合MyBatis --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.2/version/dependency!-- SpringBoot 的AOP实现 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependency!-- junit 依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependency!-- SpringBoot 健康检查 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!-- lombok --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.0/versionscopeprovided/scope/dependency!-- jwt token --dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-api/artifactIdversion0.10.7/version/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-impl/artifactIdversion0.10.7/versionscoperuntime/scope/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-jackson/artifactIdversion0.10.7/versionscoperuntime/scope/dependency!-- fastjson --dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.83/version/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.1/versionconfigurationsource${maven.compiler.source}/sourcetarget${maven.compiler.target}/targetencoding${project.build.sourceEncoding}/encoding/configuration/plugin/plugins/build/project2、token生成工具类【JWTUtils】 属性密钥secret、token过期时间秒expireTimeSeconds 来自配置文件application.yml package com.gingko.common;import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.codec.binary.Base64; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;import javax.crypto.SecretKey; import java.util.Date; import java.util.HashMap; import java.util.Map;Slf4j RequiredArgsConstructor Component public class JWTUtils {/*** 秘钥*/Value(${JWT.secret})private String secret;/*** 有效期单位秒* - 默认2周*/Value(${JWT.expireTimeSeconds})private Long expireTimeSeconds;/*** 从token中获取claim** param token token* return claim*/public Claims getClaimsFromToken(String token) {try {return Jwts.parser().setSigningKey(this.secret.getBytes()).parseClaimsJws(token).getBody();} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | IllegalArgumentException e) {log.error(token解析错误, e);throw new IllegalArgumentException(Token invalided.);}}/*** 获取token的过期时间** param token token* return 过期时间*/public Date getExpirationDateFromToken(String token) {return getClaimsFromToken(token).getExpiration();}/*** 判断token是否过期** param token token* return 已过期返回true未过期返回false*/private Boolean isTokenExpired(String token) {Date expiration getExpirationDateFromToken(token);return expiration.before(new Date());}/*** 计算token的过期时间** return 过期时间*/private Date getExpirationTime() {return new Date(System.currentTimeMillis() this.expireTimeSeconds * 1000);}/*** 为指定用户生成token** param claims 用户信息* return token*/public String generateToken(MapString, Object claims) {Date createdTime new Date();Date expirationTime this.getExpirationTime();byte[] keyBytes secret.getBytes();SecretKey key Keys.hmacShaKeyFor(keyBytes);return Jwts.builder().setClaims(claims).setIssuedAt(createdTime).setExpiration(expirationTime).signWith(key, SignatureAlgorithm.HS256).compact();}/*** 判断token是否非法** param token token* return 未过期返回true否则返回false*/public Boolean validateToken(String token) {return !isTokenExpired(token);}/*** 测试类* param args*/public static void main(String[] args) {// 1. 初始化JWTUtils jwtUtils new JWTUtils();jwtUtils.expireTimeSeconds 1209600L;jwtUtils.secret abcdefghijklmnopqrstuvwxyzgingkoabcdefghijklmnopqrstuvwxyz;// 2.设置用户信息HashMapString, Object objectObjectHashMap new HashMap();objectObjectHashMap.put(id, 1);objectObjectHashMap.put(name, 张三);// 测试1: 生成tokenString token jwtUtils.generateToken(objectObjectHashMap);// 会生成类似该字符串的内容:eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5byg5LiJIiwiaWQiOiIxIiwiaWF0IjoxNzI4MDE1NzkzLCJleHAiOjE3MjkyMjUzOTN9.2aLCkg0LpoPZXMyK_VfmGHuDcZB3oLQdFQOg6nfOAnASystem.out.println(token: token);// 测试2: token合法且未过期返回true,上面生成的tokenString someToken eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5byg5LiJIiwiaWQiOiIxIiwiaWF0IjoxNzI4MDE1NzkzLCJleHAiOjE3MjkyMjUzOTN9.2aLCkg0LpoPZXMyK_VfmGHuDcZB3oLQdFQOg6nfOAnA;Boolean validateToken jwtUtils.validateToken(someToken);System.out.println(token是否合法 validateToken);// 测试3: 获取用户信息Claims claims jwtUtils.getClaimsFromToken(someToken);System.out.println(用户信息: claims);// 测试4: 解密Headertoken的第一段以.为边界String encodedHeader eyJhbGciOiJIUzI1NiJ9;byte[] header Base64.decodeBase64(encodedHeader.getBytes());System.out.println(header: new String(header));// 测试5: 解密Payload,token的第二段以.为边界String encodedPayload eyJuYW1lIjoi5byg5LiJIiwiaWQiOiIxIiwiaWF0IjoxNzI4MDE1NzkzLCJleHAiOjE3MjkyMjUzOTN9;byte[] payload Base64.decodeBase64(encodedPayload.getBytes());System.out.println(payload: new String(payload));// 测试6: 这是一个被篡改的token因此会报异常说明JWT是安全的boolean tokenValidFlag jwtUtils.validateToken(eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoi5byg5LiJIiwiaWQiOiIxIiwiaWF0IjoxNzI4MDE1NzkzLCJleHAiOjE3MjkyMjUzOTN9.C2aLCkg0LpoPZXMyK_VfmGHuDcZB3oLQdFQOg6nfOAnA);System.out.println(token被修改验证是否有效: tokenValidFlag);} }3、登录请求/toLogin 代码说明登录成功后返回前台token信息前台可以保存token信息发送其他请求时在请求的header带上token package com.gingko.controller;import com.gingko.common.GenericWebResult; import com.gingko.common.JWTUtils; import com.gingko.entity.User; import com.gingko.service.UserService; import com.gingko.vo.req.UserLoginReq; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*;import javax.annotation.Resource; import java.util.HashMap; import java.util.Map;RestController RequestMapping(user) Slf4j public class UserController {Resourceprivate UserService userService;Resourceprivate JWTUtils jwtUtils;PostMapping(/toLogin)public GenericWebResult toLogin(RequestBody UserLoginReq userLoginReq) {GenericWebResult result null;String userId userLoginReq.getUserId();String userPassword userLoginReq.getUserPassword();User userFromDB this.userService.getByUserId(userId);if(userFromDB ! null) {if(!userPassword.equals(userFromDB.getUserPassword())) {result GenericWebResult.error(用户名或密码不正确);}}else {result GenericWebResult.error(用户名或密码不正确);}//生成token并返回到前台MapString, Object claims new HashMap();claims.put(userId,userLoginReq.getUserId());String token jwtUtils.generateToken(claims);result GenericWebResult.ok(登录成功,token);return result;} }4、配置登录拦截器 配置登录拦截器并注册到webConfig中拦截除登录之外的所有请求拦截器中校验请求header中是否存在token及校验token是否合法 package com.gingko.config;import com.gingko.interceptor.LogInterceptor; import com.gingko.interceptor.LoginInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.annotation.Resource;/*** web配置类配置拦截器*/ Configuration public class WebConfig implements WebMvcConfigurer {Resourceprivate LogInterceptor logInterceptor;//日志拦截器Resourceprivate LoginInterceptor loginInterceptor;//登录拦截器Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(logInterceptor).addPathPatterns(/**).excludePathPatterns(/test/*);//测试相关的不用日志拦截registry.addInterceptor(loginInterceptor).addPathPatterns(/**).excludePathPatterns(/user/toLogin);//登录不用拦截} }package com.gingko.interceptor;import com.alibaba.fastjson.JSON; import com.gingko.common.GenericWebResult; import com.gingko.common.JWTUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor;import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;//登录拦截器校验token是否合法 Component Slf4j public class LoginInterceptor implements HandlerInterceptor {Resourceprivate JWTUtils jwtUtils;/*** 校验token是否合法* param request* param response* param handler* return* throws Exception*/Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token request.getHeader(token);response.setContentType(application/json);response.setCharacterEncoding(UTF-8);log.info(登录校验开始token{}, token);if (token null || token.isEmpty()) {log.info(token为空请求被拦截);response.setStatus(HttpStatus.UNAUTHORIZED.value());GenericWebResult genericWebResult GenericWebResult.error(token为空请求被拦截);String resultStr JSON.toJSONString(genericWebResult);response.getWriter().write(resultStr);return false;}Boolean validateToken null;try {validateToken jwtUtils.validateToken(token);}catch (Exception e) {log.warn( token无效请求被拦截 );GenericWebResult genericWebResult GenericWebResult.error(token无效请求被拦截);String resultStr JSON.toJSONString(genericWebResult);response.getWriter().write(resultStr);return false;}if(!validateToken) {log.warn( token无效请求被拦截 );GenericWebResult genericWebResult GenericWebResult.error(token无效请求被拦截);String resultStr JSON.toJSONString(genericWebResult);response.getWriter().write(resultStr);return false;}return true;} }5、postman方式测试接口 假设数据库user表存在userIdthunder、密码为123456的记录 模拟其他请求前台带上正确的token: 模拟其他请求前台带上伪造的token:
http://www.hkea.cn/news/14565589/

相关文章:

  • 杭州企业网站建站模板专业医疗网站建设
  • 网站开发资料做电影网站一年赚多少
  • 网站关键词被百度屏蔽怎么办微信网站开发教程视频教程
  • 深圳网站开发antnwwordpress 写作主题
  • 长沙 php企业网站系统wordpress自定义主题
  • wordpress 赞 插件郑州众志seo
  • 企业网站建设需要什么网站程序是什么意思
  • asp.net网站设计分工s001网站建设
  • 做网站字号多大把自己做的网站传到网上
  • 重庆 网站建设手工网站怎样做三角包
  • 请别人做网站需要注意什么问题vs2015做网站的后端
  • 域名网站怎么做的建个外国网站
  • 黔东南网站建设gzklyy天水市建设路第二小学网站
  • 网站建设和网络营销区别南京室内设计学校
  • 网站引用优酷站长网站后台
  • 网站建设在淘宝上以后让还让发布吗网站如何做快照
  • 电子商务网站的类型海口企业自助建站
  • 如何做自己的网站赚钱办公室装修费用会计分录
  • 58同城哈尔滨网站建设烟台网站建设哪家服务好
  • 北仑网站网页建设wordpress 主题制作 functions.php
  • 中国建设银行移动门户网站外贸网站做开关行业的哪个好
  • 推荐广州手机网站定制阿里云备案网站名称
  • 做神马网站优实训网站开发目的
  • 建被采集的网站长沙麓谷网站建设
  • 网站建设与维护合同wordpress 自定义头像
  • 高端医院网站建设广东东莞最新消息通知
  • 京东网上商城官网优化网站和网站建设
  • 音乐网站开发与需求wordpress 调用 api接口
  • 省建设厅网站安徽网络培训学习心得
  • 那个网站系统好怎么上传网站数据库