使用JWT来实现单点登录功能
出处: 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来实现单点登录功能相关推荐
- Spring Security整合JWT,实现单点登录,So Easy~!
前面整理过一篇 SpringBoot Security前后端分离,登录退出等返回json数据,也就是用Spring Security,基于SpringBoot2.1.4 RELEASE前后端分离的情况 ...
- JWT实战 Spring Security Oauth2整合JWT 整合SSO单点登录
文章目录 一.JWT 1.1 什么是JWT 1.2 JWT组成 头部(header) 载荷(payload) 签名(signature) 如何应用 1.3 JJWT 快速开始 创建token toke ...
- 邮件服务器“单点登录”功能
现状分析: 相信我们每个人都有这样的经历,比方说银行卡多的人要具体记忆每张卡的密码挺麻烦:现代人兴 趣广泛,爱好多多,运动健身俱乐部.娱乐游戏休闲.购物理财等各种场合少不了获得入门的"通行证 ...
- php 单点登录实现代码,PHP简单实现单点登录功能示例
1.准备两个虚拟域名 127.0.0.1 www.openpoor.com 127.0.0.1 www.myspace.com 2.在openpoor的根目录下创建以下文件 index.PHP 1 ...
- JSON Web Token (JWT)笔记(token实现单点登录功能)
文章目录 前情提要 cookie(储存在用户本地终端上的数据) Cookie特点: session(web服务端内存) cookie和session 单点登录(只登录一次,可使用账号下全部服务)三种方 ...
- SpringBoot+SpringSecurity+JWT整合实现单点登录SSO史上最全详解
作者:波波烤鸭 blog.csdn.net/qq_38526573/article/details/103409430 一.什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是 ...
- springboot+vue jwt校验token 单点登录
SSO(Single Sign On)模式 CAS单点登录.OAuth2 分布式,SSO(single sign on)模式:单点登录英文全称Single Sign On,简称就是SSO.它的解释是: ...
- 八幅漫画理解 JWT 设计的单点登录系统
来自:https://u.nu/2k4wk JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 让我们来假想一下一个场景.在A ...
- cas 登录之后不跳转_图解JWT如何用于单点登录
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:流云诸葛http://cnblogs.com/lyzg/p/6132801.html ...
最新文章
- 3.API的调用过程(保存现场)
- VisualStudioCode下载安装与安装中文插件教程(图文教程)
- k8s:Service的四种类型和三种代理模式
- VMware10.0.4下 CentOS 6.5 cmake安装 MySQL 5.5.32
- 设置背景图时防止图片拉伸的解决方法
- openfeign ribbon 负载_SpringCloud教程(三)声明式访问Feign、负载均衡Ribbon
- Python 面向对象(OOP)基本概念
- idea调试代码步入用法
- Pandas 读取 csv 得 DataFrame 转换成 List
- Unity人物动画扩展
- Python连接SQL Server 之pyodbc
- 项目经理的“势能”培养 (转)
- 若有恒,何必三更眠五更起;最无益,莫过一日曝十日寒
- 安装CDH出现file /opt/cloudera/parcels/.flood/CDH-6.2.0-1.cdh6.2.0.p0.967373-el7.parcel...does not exist
- 第二关,KPM算法和next函数值
- P528 List接口常用实现类的对比及源码分析
- DJ9-3 DMA 方式
- MongoDB_实战部分(二)
- Vue-vben-admin Vue3+TS Axios的封装源码分析
- 吉林大学计网真题以及期末题汇总
热门文章
- php变量和js变量的区别吗,JS声明变量的3种方式和区别
- python ftp编程_Python编程-FTP
- Web Components系列(七) ——自定义组件的生命周期
- VLAN专题之三:VLAN的访问链接
- php properties,PHP ReflectionClass getStaticProperties()用法及代码示例
- ORM框架之Mybatis(三)延迟加载、开启一二级缓存及使用注解增删改查
- 关于数据仓库和OLAP的问题!
- .NET生成静态页面并分页
- 云南大学软件测试,软件测试大赛云南省省赛在软件学院如期举行
- 串口IO、定时器、回调函数