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

建站中心江苏省住房与城乡建设部网站

建站中心,江苏省住房与城乡建设部网站,传媒宣传片制作,成都建站平台1、功能概述#xff1f; 1、当用户登录的时候#xff0c;将用户的信息通过JWT进行加密和签名#xff0c;并将JWT产生了token信息保存到当前浏览器的localStoragee中,即本地存储中。 2、当用户登录成功后#xff0c;访问其他资源的时候#xff0c;程序从localStorage中获…1、功能概述 1、当用户登录的时候将用户的信息通过JWT进行加密和签名并将JWT产生了token信息保存到当前浏览器的localStoragee中,即本地存储中。 2、当用户登录成功后访问其他资源的时候程序从localStorage中获取token的信息并将token的信息存入到请求头中。 3、拦截器拦截当前的请求并从请求中获取到token的值使用JWT进行验证如果验证表示当前用户合法就放行如果验证不通过表示不合法不放行。 2、JWT概述 1、JSON WebToken(JWT)是一种紧凑、自包含方式的、遵循RFC 7519开放标准是一种协议。 2、JWT中的声明(如何用户名/编号等信息)被编译成JSON对象并且这些信息会经过数字签名信息可以进行验证和信任。 3、JWT支持以下签名和验证算法: HMAC、RSA 或 ECDSA。 4、JSON WebToken是常用的跨域身份验证方案。 5、JWT生成的token内容可以被解析因为采用的是base64算法但是使用了签名所以数据不能被篡改敏感信息不能放入其中如密码放置信息泄露。 2.1、JWT优点 1、以json行书传输数据量小传输速度快且JWT是跨语言的。 2、适用于分布式和微服务架构因为信息的保存不依赖于session或者cookie. 3、使用cookie不适合移动端、但是JWT既不依赖session也不依赖cookie,单点登录实现容易。 4、因此无论是单体结构还是分布式都可以使用JWT进行身份认证。 2.2、JWT的组成结构 我们可以使用官网https://github.com/auth0/java-jwt学习JWT相关的结构 JWT主要有三部分组成标头(Header)有效载荷(Payload)签名(Signature) 格式通常为Header.Payload.Signature 【第一部分Header】 由令牌类型和签名算法组成 【第二部分Payload】 有效负载通常定义用户自定义信息这部分构成JWT的第二部分数据是推荐使用的而非强制。主要包括 iss发行人或签发者 exp到期时间 sub主题 aud用户/jwt接收方 nbf在此之前不可用 iat发布时间/签发时间 jti: jwt的唯一身份标识主要用来作为一次性token,从而回避重放攻击    【第三部分Signature】 由于Header和Payload都是使用Base64进行编码是可逆的因此信息可以被解析出来为了放置信息被篡改加入了签名。同时如果提供的签名不正确jwt生成的token不能被正确解析。 通过jwt.io这个网站观看jwt生成的token样式 2.3、JWT使用的大体流程 1、在登录验证通过后给用户生成一个对应的随机token(注意这个token不是指jwt可以用uuid等算法生成)然后将这个token作为key的一部分用户信息作为value存入Redis并设置过期时间这个过期时间就是登录失效的时间; 将第1步中生成的随机token作为JWT的payload生成JWT字符串返回给前端; 前端之后每次请求都在请求头中的Authorization字段中携带JWT字符串; 后端定义一个拦截器每次收到前端请求时都先从请求头中的Authorization字段中取出JWT字符串并进行验证验证通过后解析出payload中的随机token然后再用这个随机token得到key从Redis中获取用户信息如果能获取到就说明用户已经登录。 3、使用JWT实现签发token/校验token/获取token信息 3.1、项目结构 3.2、创建springboot工程映入jwt的包信息 我们使用java-jwt实现 ?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/artifactIdversion3.1.6/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.txc/groupIdartifactIddistribute-session-jwt/artifactIdversion0.0.1-SNAPSHOT/versionnamedistribute-session-jwt/namedescriptiondistribute-session-jwt/descriptionpropertiesjava.version17/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdcom.auth0/groupIdartifactIdjava-jwt/artifactIdversion4.4.0/version/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationimagebuilderpaketobuildpacks/builder-jammy-base:latest/builder/imageexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build /project3.3、创建login测试类签发token 注意理论上签名可以通过穷举法进行破除所以一般签名不要使用的过于简单或者定期更换签名增强系统的安全性。 程序中通过jwt.create进行签发并设置了签名信息过期时间及相关的用户信息。 RestController public class JWTController {RequestMapping(/login) public String login(RequestParam String username, HttpServletResponse response, HttpServletRequest request){//创建map存放用户信息MapString,Object mapnew HashMap();map.put(userid,1001);map.put(username,username);String tokennull;try {//!#$%^123~:是我们使用的签名Algorithm algorithm Algorithm.HMAC256(!#$%^123~);token JWT.create().withIssuer(auth0)//角色权限.withClaim(userinfo,map)//设置token的过期时间为一个小时.withExpiresAt(new Date(System.currentTimeMillis()3600000)).sign(algorithm);//将token信息添加到token中} catch (JWTCreationException exception){System.out.println(程序异常);}return token; } }3.4、访问login后结果如下 3.5、解析之后效果如下 将浏览器生成的token的信息拷贝到JSON Web Tokens - jwt.io地址中解析如下 3.6、创建getLoginToken实现校验和获取token信息 此处为了测试方便我们是直接手动的将token的值拷贝过来放在地址栏中传递到该方法实际的项目中会将token的信息存放到请求的header中用户通过header获取。 由于JWT是在请求头中传递的所以为了避免网络劫持推荐使用HTTPS来传输更加安全 请求地址localhost:8080/getLoginToken?tokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhdXRoMCIsInVzZXJpbmZvIjp7InVzZXJpZCI6MTAwMSwidXNlcm5hbWUiOiJ4aWFvY2h1biJ9LCJleHAiOjE3MDE4ODMwNjd9.ceGcf1Q_TG26HFCBf20E0TIoSXlJYK7gudAvfKOjUlw 说明1校验的时候签名千万不能写错了否则会提示校验失败。 说明2如果抛出异常说明校验失败 说明3注意获取值的返回值结果 RequestMapping(/getLoginToken) public String getLoginToken(RequestParam String token){//验证一个tokentry{Algorithm algorithmAlgorithm.HMAC256(!#$%^123~);JWTVerifier verifierJWT.require(algorithm).withIssuer(auth0).build();//jwt通过verify进行校验DecodedJWT jwtverifier.verify(token);//如果校验成功就获取userinfo的信息MapString,Object userinfojwt.getClaim(userinfo).asMap();//获取userinfo中的username值并转化成stringString usernameuserinfo.get(username).toString();int useridInteger.valueOf(userinfo.get(userid).toString());//获取token信息的有效期Date expjwt.getExpiresAt();return usernameuseridexp;}catch(Exception e){e.printStackTrace();return 校验失败;} }返回结果 4、拦截器统一处理token 案例实现当用户登录成功后将当前token信息保存到浏览器本地存储位置。当再次在项目中发起请求的时候从本地不去到token将token信息保存到请求头中拦截器获取到请求头中的token信息如果验证成功就允许访问资源如果验证失败重定向到登录页中。 4.1、在springboot中创建拦截器 1、下面的拦截器主要实现如果没有从请求头中获取到token就抛出异常程序不放行。如果获取了token的值但是验证没有通过不放行。 2、DecodedJWT jwtverifier.verify(token);就是验证方法如果验证不通过会抛出异常。3、hasText判断字符串是否为null用法 https://blog.csdn.net/tangshiyilang/article/details/134926299 Component public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(request.getMethod()拦截器执行);String tokenrequest.getHeader(token);if(!StringUtils.hasText(token)){throw new TokenIsNullException();}try{//验证一个tokenAlgorithm algorithmAlgorithm.HMAC256(!#$%^123~);JWTVerifier verifier JWT.require(algorithm).withIssuer(auth0).build();DecodedJWT jwtverifier.verify(token);String usernamejwt.getClaim(username).asString();request.setAttribute(username,username);}catch(Exception e){return false;}return true;} }4.2、在工程中加载拦截器 实现WebMvcConfigurer接口重写addInterceptors方法。 addInterceptor表示需要加载的拦截器 addPathPatterns需要拦截的地址 excludePathPatterns不需要拦截的地址如果拦截login地址会出现死循环的情况。 Configuration public class WebMvcConfig implements WebMvcConfigurer {Autowiredprivate LoginInterceptor loginInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns(/test.do).excludePathPatterns(/login);}}4.3、创建自定义异常类 public class TokenIsNullException extends RuntimeException{public TokenIsNullException(){super(token为空);} }4.4、创建登录使用的接口login1 说明1为了便于测试之前的login方法我们保留了下来单独又写了一个login1用于当前的测试。 RequestMapping(/login1) ResponseBody public String login1(RequestParam String username, HttpServletResponse response, HttpServletRequest request){System.out.println(loginusername);//创建map存放用户信息MapString,Object mapnew HashMap();map.put(userid,1001);map.put(username,username);String tokennull;try {//!#$%^123~:是我们使用的签名Algorithm algorithm Algorithm.HMAC256(!#$%^123~);token JWT.create().withIssuer(auth0)//角色权限.withClaim(userinfo,map)//设置token的过期时间为一个小时.withExpiresAt(new Date(System.currentTimeMillis()3600000)).sign(algorithm);} catch (JWTCreationException exception){System.out.println(程序异常);return 0;//如果返回值为0表示失败。}return 1;//如果返回值为1表示成功。 }4.5、创建test.do 这个方法主要用于模拟登录成功后我们需要访问的资源拦截器会获取请求中的token,如果验证成功允许访问否则不允许访问。 RequestMapping(/test.do) ResponseBody public String test(){System.out.println(test.do);return 恭喜你资源访问成功。; }4.6、创建登录页实现登录 说明1localStorage.setItem(token,msg2);使用jquery向本地存储数据 说明2window.location.hrefshow.html;//登录成功后重定向到show.html !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/titlescript srcjs/jquery-2.1.1.js/scriptscript typetext/javascriptfunction login(){$.ajax({type:get,url:/login,cache:false,dataType:text,data: {username:xiaochun},success:function(msg2,request){alert(msg2msg2);//存储字段localStorage.setItem(token,msg2);//重定向到主页window.location.hrefshow.html;}});}/script /head bodyinput typetext nameusername brbutton onclicklogin()登录/button /body /html登录页样式 4.7、创建show.html页面 如果登录成功后页面会重定向到show.html中。这个时候点击a标签触发getUserToken函数访问test.do资源在访问资源的同时会从本地获取token信息放入到请求头中。这个时候请求会被拦截器拦截拦截器获取请求头中的token信息如果验证成功允许访问test.do,如果验证失败拒绝访问。 !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/titlescript srcjs/jquery-2.1.1.js/scriptscript typetext/javascriptfunction getUserToken(){//获取保存在localStore中的数据var mytokenlocalStorage.getItem(token);alert(tokentoken);$.ajax({type:post,url:/test.do,headers: {token:mytoken},success:function(msg2){//存储字段localStorage.setItem(token,msg2);//重定向到主页window.location.hrefshow.html;}});}/script /head body我是主页 bra href javaScript:void(0) onclickgetUserToken()发起请求访问test.do资源/a /body /html4.8、登录成功后的信息 登录成功后重定向到show.html. 4.9、通过show.html访问test.do资源 当我们点击”发起请求访问test.do资源”经过拦截器校验token成功返回成功访问且从请求头中可以看到token的信息。 4.10、手动清除token信息再次访问 从下面的地址可以看出test.do没有成功访问拦截器没有放行。
http://www.yutouwan.com/news/311925/

相关文章:

  • 展示型网站都包括什么模块广告公司取名字参考大全
  • 什么是网站外部链接wordpress 存档过多
  • 外贸英文建站流感用什么药最好
  • 网站建设教程网站一套oa系统大概需要多少钱
  • 怎样看网站的建设时间网站后台数据库丢失
  • 国外免费舆情网站有哪些软件微信微网站是什么情况
  • 网站建设流程有哪七步昆明制作手机网站
  • 在福州做搬家网站多少钱wordpress 手机不显示
  • 宁海建设局网站wordpress 字段键
  • 巴彦淖尔网站制作开发北京网站建设解决方案
  • 网站搭建关键词排名宁津建设局网站
  • 专业的网站建设公网站底部导航菜单
  • 住房和城乡建设报名网站wordpress搬家换数据库
  • 云南手机网站建设中航建设集团网站
  • 网站建设用什么语言开发上海相亲网
  • 东莞网站营销推广山西网站建设营销qq
  • 做网站一般按什么报价上海装修公司哪家最好
  • 商城网站如何建设方案重庆网页制作设计营销
  • 网站设计与开发范本产品宣传小视频制作
  • 赣州市南康建设局网站wordpress站点很慢
  • php做商城网站怎么做好域名解析教程
  • 官方网站开发公司排名做网站的时候网站的第一个字母怎么在网站标题前面显示 比如谷歌g一样
  • 河南手机网站制作公司搭建视频播放网站
  • 网络营销模式和电子商务模式是一对紧密相关抖音seo排名系统公司
  • 域名费用和网站服务器费用是同样的吗免费永久网站建设
  • 公司的网站建设费入什么科目有的域名怎样做网站
  • php做的网站收录视频网站开发是什么
  • 网站开发分前台后台个人wordpress 主题
  • 宣传类的网站怎么做免费企业建站模板
  • 正规网站开发文案网站建设物理架构