token 案例,只是测试,功能并不完善(只是看看token 到底是何方神圣)
token 简单理解就是 加密 解密的一个过程
JavaWebToken(加密解密工具)
public class JavaWebToken { private static Logger log = LoggerFactory.getLogger(JavaWebToken.class); //该方法使用HS256算法和Secret:bankgl生成signKey private static Key getKeyInstance() { //We will sign our JavaWebToken with our ApiKey secret SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl"); Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); return signingKey; } //使用HS256签名算法和生成的signingKey最终的Token,claims中是有效载荷 public static String createJavaWebToken(Map<String, Object> claims) { return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact(); } //解析Token,同时也能验证Token,当验证失败返回null public static Map<String, Object> parserJavaWebToken(String jwt) { try { Map<String, Object> jwtClaims = Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody(); return jwtClaims; } catch (Exception e) { log.error("json web token verify failed"); return null; } }}
JavaWebInterceptor(拦截器)
public class JavaWebInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { response.setContentType("multipart/form-data"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); PrintWriter printwriter = new PrintWriter(response.getOutputStream()); String token = request.getParameter("token"); response.setHeader("token", token); printwriter.println("token:" + token); if (null != JavaWebToken.parserJavaWebToken(token)) { Map<String, Object> tokenMapVal = JavaWebToken.parserJavaWebToken(token);//解析token for (String key : tokenMapVal.keySet()) { String value = (String) tokenMapVal.get(key); printwriter.println("解析的内容:(key:" + key + " value:" + value + ")"); } String endTime=tokenMapVal.get("times").toString(); long currentTime=System.currentTimeMillis(); printwriter.println("当前时间"+currentTime); printwriter.println("结束时间"+endTime); if(Long.valueOf(endTime).longValue()<=currentTime){ printwriter.println("token失效,请重新获取token"); printwriter.flush(); printwriter.close(); return false; } if (tokenMapVal.get("passwd").equals("123456")){ printwriter.println("登陆验证成功"); }else{ printwriter.println("登陆验证失败"); } printwriter.flush(); printwriter.close(); return true; } else { printwriter.println("没有token信息"); printwriter.flush(); printwriter.close(); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }}spring-mv.xml(配置拦截器)
<mvc:interceptor> <mvc:mapping path="/hello/ai"/> <bean class="com.sun.test.aircraft.token.JavaWebInterceptor"/></mvc:interceptor>
controller(请求数据)
@RequestMapping("/token")public String token(Model model, HttpServletRequest request, HttpServletResponse response){ Map<String,Object> map=new HashMap<String,Object>(); map.put("passwd","123456");//负载 map.put("times","1000");//负载 String token=JavaWebToken.createJavaWebToken(map);//创建token model.addAttribute("token",token); return "redirect:/hello/ai";}引入的jar 包:
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.1.0</version></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.6.0</version></dependency>
效果: 做的完善功能远不止这一点比如:1、用户登陆成功后生成的token放到数据库中,每次登陆的时候拿token对比2、把token放到头信息里3、在负载中加入token的有效时间(也可利用redis的ttl设置有效时间,方式很多种),token失效后重新获取,重新存入数据库(比如:redis,mongodb)中 等
如果看官有认为我理解的错误的地方,可以留下你的评论,我好改正,感谢!
转载于:https://www.cnblogs.com/austinspark-jessylu/p/8043391.html
token 案例,只是测试,功能并不完善(只是看看token 到底是何方神圣)相关推荐
- 【学习日记2023.5.8】之 springboot案例之登录功能(会话技术_JWT令牌_过滤器_拦截器)
文章目录 1. 案例-登录认证 1. 1登录功能 1.1.1 需求 1.1.2 接口文档 1.1.3 思路分析 1.1.4 功能开发 1.1.5 测试 1.1.6 全后端联调 1.2 登录校验 1.2 ...
- VS 2010 测试功能学习(七) - RnP与Coded UI自动化测试
题外话:昨天去上海浦东机场接闺女, 一切还是蛮顺利的,公交机场7线直接从上海火车南站一站直达浦东机场,票价20元,算上乘坐地铁5号和1号线的6元,从我家到机场总共要26元,相对于打 的士的220元 ...
- 头条案例登录注册功能
1.准备 #1.1 创建组件并配置路由 1.创建 src/views/login/index.vue 并写入以下内容 <template><div class="login ...
- 接口练习:猫狗案例扩展跳高功能
在"抽象类练习1:猫狗案例"的基础上,猫狗案例加入额外功能:跳高jump() 注意分析:是有的猫会跳高,有的狗会跳高 所以定义一个跳高接口.再定义两个类:跳高猫,继承猫,实现猫的跳 ...
- Idea自带http测试功能真香
Idea自带http测试功能真香 前言 图像界面 命令 Get请求 post请求 认证请求 测试响应 前言 在工作中接触的大多数项目都采用前后端分离方式,常用postman免费版来进行api接口测试. ...
- 华为鸿蒙OS手机尝鲜,鸿蒙OS开启消费者尝鲜计划!大批华为手机可用,功能接近完善...
原标题:鸿蒙OS开启消费者尝鲜计划!大批华为手机可用,功能接近完善 近日,原华为EMUI官微就正式宣布更名为Harmony OS,而且华为也官方宣布将在6月2日晚20点召开鸿蒙操作系统及华为全场景新品 ...
- 案例分享| T-Box功能自动化测试方案
背景 T-Box是实现汽车车联网的一个关键环节,从起初单纯的实现车辆信息采集,已发展到具有车辆信息监测及信息交互(V2X).车辆远程控制.安全监测和报警.远程诊断.边缘计算等多种离线和在线的应用功能的 ...
- Fluke OTDR新增SmartLoop双向测试功能
通信仪表公司Fluke网络日前为其OptiFiber Pro OTDR产品增加SmartLoop双向测试功能,从而可以支持在一端同时测试双向两根光纤的故障. SmartLoop双向测试功能基于Fluk ...
- python操作三大主流数据库(6)python操作mysql⑥新闻管理后台功能的完善(增、ajax异步删除新闻、改、查)...
python操作mysql⑥新闻管理后台功能的完善(增.删.改.查) 安装表单验证 D:\python\python_mysql_redis_mongodb\version02>pip inst ...
最新文章
- mysql开启慢查询日志
- php写web服务器端,如何用php实现一个web服务器
- 访问进程环境变量environ时的一个坑
- js时间工具 MyTimeUtil.js
- Shell脚本之sed的使用
- react学习(48)--编辑回显用moment处理
- linux驱动的中断函数,嵌入式Linux驱动开发(四)——字符设备驱动之中断方式以及中断方式获取按键值...
- go - struct
- 【网站集合】【Windows】程序员常用网站一览
- 查找算法-跳跃表(SkipList)入门及复杂度分析
- Vue开发警告[Vue warn]: Avoid replacing instance root $data. Use nested data properties instead.
- 二叉树的镜像和对称二叉树
- 软件设计师---计算机系统
- 现代信号处理——平稳随机信号的功率谱密度
- JavaScript 无法获取响应 header 的 Content-Disposition 字段
- code.aliyun.com拉取提交代码认证失败
- 祝学校计算机系的新年贺词,新年祝福语:学校新年贺词祝福短信
- 2021-05-23:打开Office后界面上显示一个横幅提示:你的许可证不是正版,并且你可能是盗版软件的受害者
- TCP协议为什么是三次握手而不是两次
- idea2018.3 无需注册码破解,完美使用100年
热门文章
- 征战蓝桥 —— 2016年第七届 —— C/C++A组第7题——剪邮票
- 大数据WEB阶段(十八)数据库事务
- VS2017简单用法
- 【Linux】一步一步学Linux——chkconfig命令(148)
- 【Ubuntu】 Ubuntu16.04搭建Samba服务
- 每天一道LeetCode-----生成由[1 : n]这n个数组成的所有二叉搜索树
- 和java通信_[源码和文档分享]基于JAVA的即时通信软件
- 记录k8s下配置ssl安全连接版rabbitmq
- python中items属性的用法
- mysql8.0.15调优_Mysql 8.0 参数调优