出处: https://www.cnblogs.com/zexin/p/10389541.html

我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不错.

个人理解,jwt就是类似于一把锁和钥匙,客户来租房(登录),我们需要给他进来(第一次登录)登记消息,配把钥匙给他(使用jwt生成一个token,存放在用的cookie中),

我们这边也需要配置一把我们需求的锁(jwt的生成token,解析token规则我们来写),接下来看下我最近运用jwt的小实例(该项目由springboot2.x搭建).

首先需要的maven工程pom.xml文件中添加依赖

<!-- JWT相关 -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.7.0</version>
</dependency>

自定义一个拦截类,用户没有钥匙的都需要登录(jwt生成的token)

/*** 自定义登录拦截器*/
public class LoginIntercepter implements HandlerInterceptor { private static final Gson gson = new Gson(); /** * 进入controller的拦截 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token =""; //判断用户cookie中有无token Cookie[] ctoken = request.getCookies(); if(ctoken!=null){ for(Cookie ftoken: ctoken){ if(ftoken.getName().equals("token")){ token = ftoken.getValue(); } } } if (!token.isEmpty()){ //3.如果用户有token,则进行jwt解密 Claims claims = JWTUtils.checkToken(token); if (claims != null){ //4.不为空,则说明用户已登录,获取用户id,姓名,保存在request中的Attribute作用域中,这样controller就可以取到值 String signatureFile = (String) claims.get("signatureFile"); String email = (String) claims.get("email"); request.setAttribute("user_signatureFile",signatureFile); request.setAttribute("user_email",email); //5.放行 return true; } } //6.返回错误信息给前端 //sendMessage(response, JsonData.buildError("请登录")); //response.flushBuffer(); response.sendRedirect("sign_in.html"); return false; } /** * 发送错误信息给前端 */ public static void sendMessage(HttpServletResponse response, Object obj) throws IOException { response.setContentType("application/json;charset:utf-8"); PrintWriter writer = response.getWriter(); writer.print(gson.toJson(obj)); writer.close(); //需要刷新一下,怕有缓存  response.flushBuffer(); } }

springboot中需要配置一个配置类,注册我们的自定义配置类

/***自定义拦截类的配置类*/
@Configuration
public class InterceptConfig implements WebMvcConfigurer { //注册一个我们登录的拦截类  @Override public void addInterceptors(InterceptorRegistry registry) { //我们需要排除登录,和注册的拦截(特别注意,我们还需要取消拦截静态资源的访问) String[] exclude = new String[]{"/sign_in.html","/sign_up.html","/static/**","/assets/**","/login","/user_register"}; //1.需要对我们自定义的拦截器进行注册 registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/**").excludePathPatterns(exclude);//拦截路径 WebMvcConfigurer.super.addInterceptors(registry); } }

前面我们拦截类写好了,用户被拦截后会跳转到登录或者注册界面,这时,在我们的控制类中,我们需要根据表单提交的信息,生成相应的token,下面是控制类的重要代码,里面用到的JWTUtils下面会贴出来,方便大家复制

int save = userService.save(user);
if (save == 1) {//return JsonData.buildSuccess(user,"注册成功"); //使用jwt来将用户信息生成token的字符串 String token = JWTUtils.geneToken(user); //将token保存到cookie中去,并且设置时间为半个钟 Cookie cookie = new Cookie("token",token); cookie.setMaxAge(60*30); response.addCookie(cookie); response.sendRedirect("/index"); //return JsonData.buildError("注册成功,即将跳转到首页!",0); } else { return new JsonData(-1,null,"注册失败,请重试"); }

用户登录后,cookie中会被保存我们jwt生成的token,我这里设置半个钟有效期,在上面的自定义拦截器中,用户访问页面,会先向用户拿取token,有token的话,会被解析出相应信息,并且直接跳入首页,无须登录.接下来下面是JWTUtils

public class JWTUtils {public static final String SUBJECT = "ouyan"; //编写发布者 public static final int EXPIRE = 1000*60*60*30; //设置过期时间,单位为毫秒,过期时间为半个钟 public static final String APPSECRET = "axin"; //设置密钥 /** * 使用jwt生成token */ public static String geneToken(User user){ //先判断是否为空,为空返回null if (user == null || user.getSignatureFile() == null || user.getEmail() == null ){ return null; } String token = Jwts.builder().setSubject(SUBJECT).claim("signatureFile",user.getSignatureFile()) .claim("email",user.getEmail()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis()+EXPIRE)) .signWith(SignatureAlgorithm.HS256,APPSECRET).compact(); return token; } /** * 校验密钥 */ public static Claims checkToken(String token) { try { final Claims claims = Jwts.parser().setSigningKey(APPSECRET) .parseClaimsJws(token).getBody(); return claims; } catch (Exception e) { e.printStackTrace(); System.out.println("出错啦"); } return null; } }

转载于:https://www.cnblogs.com/But-you/p/10689649.html

使用JWT来实现单点登录功能相关推荐

  1. Spring Security整合JWT,实现单点登录,So Easy~!

    前面整理过一篇 SpringBoot Security前后端分离,登录退出等返回json数据,也就是用Spring Security,基于SpringBoot2.1.4 RELEASE前后端分离的情况 ...

  2. JWT实战 Spring Security Oauth2整合JWT 整合SSO单点登录

    文章目录 一.JWT 1.1 什么是JWT 1.2 JWT组成 头部(header) 载荷(payload) 签名(signature) 如何应用 1.3 JJWT 快速开始 创建token toke ...

  3. 邮件服务器“单点登录”功能

    现状分析: 相信我们每个人都有这样的经历,比方说银行卡多的人要具体记忆每张卡的密码挺麻烦:现代人兴 趣广泛,爱好多多,运动健身俱乐部.娱乐游戏休闲.购物理财等各种场合少不了获得入门的"通行证 ...

  4. php 单点登录实现代码,PHP简单实现单点登录功能示例

    1.准备两个虚拟域名 127.0.0.1  www.openpoor.com 127.0.0.1  www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...

  5. JSON Web Token (JWT)笔记(token实现单点登录功能)

    文章目录 前情提要 cookie(储存在用户本地终端上的数据) Cookie特点: session(web服务端内存) cookie和session 单点登录(只登录一次,可使用账号下全部服务)三种方 ...

  6. SpringBoot+SpringSecurity+JWT整合实现单点登录SSO史上最全详解

    作者:波波烤鸭 blog.csdn.net/qq_38526573/article/details/103409430 一.什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是 ...

  7. springboot+vue jwt校验token 单点登录

    SSO(Single Sign On)模式 CAS单点登录.OAuth2 分布式,SSO(single sign on)模式:单点登录英文全称Single Sign On,简称就是SSO.它的解释是: ...

  8. 八幅漫画理解 JWT 设计的单点登录系统

    来自:https://u.nu/2k4wk JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个场景.在A ...

  9. cas 登录之后不跳转_图解JWT如何用于单点登录

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:流云诸葛http://cnblogs.com/lyzg/p/6132801.html ...

最新文章

  1. 3.API的调用过程(保存现场)
  2. VisualStudioCode下载安装与安装中文插件教程(图文教程)
  3. k8s:Service的四种类型和三种代理模式
  4. VMware10.0.4下 CentOS 6.5 cmake安装 MySQL 5.5.32
  5. 设置背景图时防止图片拉伸的解决方法
  6. openfeign ribbon 负载_SpringCloud教程(三)声明式访问Feign、负载均衡Ribbon
  7. Python 面向对象(OOP)基本概念
  8. idea调试代码步入用法
  9. Pandas 读取 csv 得 DataFrame 转换成 List
  10. Unity人物动画扩展
  11. Python连接SQL Server 之pyodbc
  12. 项目经理的“势能”培养 (转)
  13. 若有恒,何必三更眠五更起;最无益,莫过一日曝十日寒
  14. 安装CDH出现file /opt/cloudera/parcels/.flood/CDH-6.2.0-1.cdh6.2.0.p0.967373-el7.parcel...does not exist
  15. 第二关,KPM算法和next函数值
  16. P528 List接口常用实现类的对比及源码分析
  17. DJ9-3 DMA 方式
  18. MongoDB_实战部分(二)
  19. Vue-vben-admin Vue3+TS Axios的封装源码分析
  20. 吉林大学计网真题以及期末题汇总

热门文章

  1. php变量和js变量的区别吗,JS声明变量的3种方式和区别
  2. python ftp编程_Python编程-FTP
  3. Web Components系列(七) ——自定义组件的生命周期
  4. VLAN专题之三:VLAN的访问链接
  5. php properties,PHP ReflectionClass getStaticProperties()用法及代码示例
  6. ORM框架之Mybatis(三)延迟加载、开启一二级缓存及使用注解增删改查
  7. 关于数据仓库和OLAP的问题!
  8. .NET生成静态页面并分页
  9. 云南大学软件测试,软件测试大赛云南省省赛在软件学院如期举行
  10. 串口IO、定时器、回调函数