前端 - token 是什么?为什么每次请求头(HEADS)里要携带它?___请求时,为什么要携带token?

前端 - token 是什么?为什么每次请求头(HEADS)里要携带它?

Token

token 是客户端频繁向服务器端请求数据,服务器频繁的去数据库查询用户名和密码进行对比,判断用户名和密码正确与否,并作出相应的提示,在这样的背景下,token 便应运而生了。

目的

token 的目的是为了减轻服务器的压力,减少频繁的查询数据库。

在前端请求后台的 API 接口的时候,为了安全性,一般需要再用户登录成功之后才能发送其他请求。

因此,在用户登录成功之后,后台会返回一个 token 给前端,这个时候我们就需要把 token 暂时保存在本地,每次发送请求的时候需要在 header 里边带上 token(无需再次带上请求名和密码),这个时候本地的 token 和后台数据库中的 token 进行一个验证,如果两者一致,则请求成功,否则失败。

用什么作为 Token 标识合适

一、使用设备号/设备mac地址作为token(推荐)

客户端:客户端在登录的时候获取设备的设备号串号 / mac 地址,并将其作为参数传递到服务器端。

服务器:服务器接收到该参数之后,使用一个变量接收同时将其作为 token 保存数据库,并将该 token 设置在 session 中,客户端每次请求的时候都要统一拦截,并将客户端传递的 token 和服务器 session 中的 token 对比,如果相同则放下,不同则拒绝。

优点:客户端不需要重新登录,只要登录一次后就能一直使用。

缺点:客户端需要带设备号/mac地址作为参数传递

二、用 session 值作为 token

客户端:客户端只需要携带用户名和密码即可登录。

服务端:客户端接收到用户名和密码后并判断,如果正确就将本地获取 sessionId 作为 token 返回给客户端,客户端以后只需要带上请求数据即可。


请求时,为什么要携带token?

token是什么?

token携带在请求头中,只有登录请求不需要携带token,登录成功后把token返回给前端,以后的请求前端需要携带这个token来才能请求成功!否则请求被拦截……

为什么要用它?

token的目的是减轻服务器压力,减少数据库请求。

如果没有token做一层拦截的,每次请求都会去请求数据库,如果恶意请求,很可能击垮数据库…

如何实现呢?

拦截器:写一个类实现HandlerInterceptor接口,重写preHandle方法,在方法里实现拦截逻辑

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 如果是OPTIONS则结束请求if (Objects.equals(request.getMethod(), HttpMethod.OPTIONS.name())) {response.setStatus(HttpStatus.OK.value());return false;}String token = request.getHeader("token");if (!hasText(token)) {handleErrorResponse(response, ResponseResultEnum.PARAM_ERROR, "can't getHeader token ");return false;}if (TEST_TOKEN.equals(token)) {return true;} } catch (JwtException e) {log.trace(e.getMessage(), e);handleErrorResponse(response, ResponseResultEnum.TOKEN_INVALID);return false;}return true;}

这里的拦截,是拦截所有请求,而我们在实际开发中,要有拦截白名单,比如:登录接口

那么如何写拦截白名单呢?

写一个配置类,实现WebMvcConfigurer接口,重写addInterceptors方法

@Configuration
public class WebConfig implements WebMvcConfigurer {private final TokenInterceptor tokenInterceptor;public WebConfig(TokenInterceptor tokenInterceptor) {this.tokenInterceptor = tokenInterceptor;}/*** 不需拦截-白名单*/private static final String[] WHITELIST = {// 登录相关"/login/verify","/login/sms/**","/heartbeat"};@Overridepublic void addInterceptors(InterceptorRegistry registry) {List<String> patterns = Arrays.asList(WHITELIST);registry.addInterceptor(tokenInterceptor) // 拦截器实例.addPathPatterns("/**") // 拦截所有请求.excludePathPatterns(patterns); // 排除哪些请求}}

small tips:

1.JWT:JSON WEB TOKEN,用于生产token的插件

 Jwts.builder().setIssuedAt(new Date()).signWith(this.key).claim(Global.USER_CODE, userCode).claim(Global.PHONE, phone).claim(Global.UNION_NUM, unionNum).setExpiration(new Date(System.currentTimeMillis() + this.expiration)).setId(UUID.randomUUID().toString()).compact();

使用以上,需要导入jar包

        <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.2</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.2</version><scope>runtime</scope></dependency>

token设置多久有效期?

根据具体情况来定,失效时间写在生成token的方法里,token的失效时间一般存在缓存或内存中,而不会数据库中

 public String generateTokenCache(String userCode, String phone, String unionNum) {String token = generateToken(userCode, phone, unionNum);String key = String.format(RedisConstants.APP_TOKEN_KEY, userCode);redisTemplate.opsForValue().set(key, ShaKit.hashString(token), this.expiration, TimeUnit.MILLISECONDS);return token;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全栈工程师薪水_2020 Java 全栈工程师进阶路线图,不可错过

技术更新日新月异&#xff0c;对于初入职场或者刚开始学习的同学来说&#xff0c;经常会困惑该往那个方向发展&#xff0c;这一点所有刚开始学习的人基本都有这个体会的。刚开始学习 Java 那会&#xff0c;最大的问题就是不知道该学什么&#xff0c;以及学习的顺序&#xff0c;…

5乘7的c语言程序,C语言程序设计实验5-7教案(20页)-原创力文档

第 7-8 次课程名称 程序设计基础 课程性质 实验课授课班级 网络 16-1 、2 授课地点 14022016 年 11 月 9 日第 5 小节 ~第 8 小节授课时间 2016 年 11 月 16 日第 5 小节~第 8 小节2016 年 11 月 23 日第 5 小节~第 8 小节课题&#xff1a; 实验六、 数组的应用—— 4 学时主要…

python手机安装模块_python如何安装模块 模块安装操作教程

Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言&#xff0c;设计具有很强的可读性&#xff0c;相比其他语言经常使用英文关键字&#xff0c;它具有比其他语言更有特色语法结构。那么Python的安装模块该怎么使用呢&#xff1f;让小编来教一下各位吧。模…

cookie 和 token 都存放在 header 中,为什么不会劫持 token?____token和cookie的区别

cookie 和 token 都存放在 header 中&#xff0c;为什么不会劫持 token&#xff1f; cookie:登录后服务端生成的sessionid&#xff0c;并在http请求里返回到客户端&#xff0c;同时服务端保存sessionid&#xff0c;以后客户端的每次http请求都带上cookie&#xff08;sessionid…

语言inc c,汇编语言练习

习题一1&#xff0e;在计算机内部&#xff0c;计算机能够直接执行的程序语言是。A&#xff0e;汇编语言 B。C语言C&#xff0e;机器语言 D。高级语言2&#xff0e;在堆栈段中&#xff0c;存放栈顶地址的寄存器是。A&#xff0e;IP &#xff22;&#xff0e;SP &#xff23;&…

python降维之时间类型数据的处理_使用Python进行数据降维|线性降维

前言为什么要进行数据降维&#xff1f;直观地好处是维度降低了&#xff0c;便于计算和可视化&#xff0c;其深层次的意义在于有效信息的提取综合及无用信息的摈弃&#xff0c;并且数据降维保留了原始数据的信息&#xff0c;我们就可以用降维的数据进行机器学习模型的训练和预测…

cookie、Session、Token、sessionStorage、localStorage简介__Token放在 cookie, sessionStorage 和 localStorage中区别

cookie、Session、Token、sessionStorage、localStorage简介 cookie 是一个非常具体的东西&#xff0c;只得是浏览器里永久存储的一种数据&#xff0c;是浏览器实现的一种数据存储功能。Cookie在计算机中是个存储在浏览器目录中的文本文件&#xff0c;当浏览器运行时&#xf…

歌星大奖赛C语言程序,C_歌星大奖赛

在歌星大奖赛中&#xff0c;有10个评委为参赛的选手打分&#xff0c;分数为1~100分。选手最后得分为&#xff1a;去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。*问题分析与算法设计这个问题的算法十分简单&#xff0c;但是要注意在程序中判断最大、最…

c语言树莓派音乐播放器,使用web端来控制我的树莓派播放音乐

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;web端控制树莓派播放音乐&#xff0c;PHPNodeJSmpg123&#xff0c;粗糙版。实现后还可以做个app什么的。代码git用到的代码内容可以在这里看~nodempg.js启动一个se…

Nginx学习_狂神

Nginx 公司产品出现瓶颈&#xff1f; 我们公司项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发的情况下&#xff0c;一个jar包启动应用就够了&#xff0c;然后内部tomcat返回内容给用户。 但是慢慢的&#xff0c;使用我们平台的用户…

c语言中运算符的读音是什么,操作符、运算符,operator,音标,读音,翻译,英文例句,英语词典...

补充资料&#xff1a;二进制算术运算二进制算术运算binary arithmetic operation二.165. 原码两位索法为了提高运算速度&#xff0c;在1次操作中可同时考虑两位乘数&#xff0c;求得与两位乘数相对应的部分积&#xff0c;其速度比一位乘法提商1倍&#xff0c;规则如下: 又丫1二…

python怎么重复输出_如何根据输出在Python中重复函数?

你可以用while循环来实现这一点。只要没有break或sys.exit&#xff0c;它就返回到start&#xff0c;这意味着这里的每一个错误输入。希望这有帮助def read_the_file(output):while True:print """Do you want me to read your newly created file?Type [Y]es o…

C语言读取load格式文件,求指导,如何用c语言实现读取*.raw格式图像

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼/*** 这个程序是读取jpg图像的** 后续加上jpg图像打开和存放*/ #include #include #include #include #include #define SOI 0xD8 //文件头#define EOI 0xD9 //文件尾#define APP0 0xE0 //定义交换格式和图像识别信息#define SOF0 …

js当前时间格式化_JS时间格式化

因为new Date().toLocaleString() 在安卓和ios上的格式不一致&#xff0c;所以尽量自己写format生成一个时间数组作为一个简单的举例&#xff0c;我序列化一周的时间对象声明参数let lastMonth []let daylong 86400000判断时间值是否小于9const formatNumber num > { num…

android json传输数据到服务器,Android中post请求传递json数据给服务端的实例

在最近的项目中有个需求是这样的&#xff1a;入参封装成JSON&#xff0c;EXAMPLE&#xff1a;{ "uuid": "iamauuid","clientType": "AND","content": "{\"gender\":\"F\",\"name\":\&qu…

springboot项目中使用shiro 自定义过滤器和token的方式___shiro使用token登录流程

springboot项目中使用shiro 自定义过滤器和token的方式 实现步骤主要是以下几步&#xff1a; 1. 在项目中导入maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.0</versi…

window.print 点击取消后再次打印无效_教程 | 图书馆自助复印打印机使用方法

图书馆自助复印打印机教程当当当&#xff01;教程君又来辽~今天为大家介绍的是咱们图书馆霸气十足的自助复印打印机实行全程无人化管理为读者提供自助打印、复印、扫描服务是你学习的小帮手&#xff01;实行全程无人化管理为读者提供自助打印、复印、扫描服务读者可在校园内任意…

android 支付模块封装,Android集成支付----支付宝支付总结与封装

前言类似于Android集成支付----微信支付总结与封装(可以查看本人另外一篇文章)&#xff0c;本文对支付宝支付进行一个总结与封装。相比于微信支付&#xff0c;支付宝支付没有那么多坑。集成支付宝支付SDK这里只是简要介绍&#xff0c;重点解说有坑的地方&#xff0c;具体参考官…

Springboot系列之Shiro、JWT、Redis 进行认证鉴权

Springboot系列之Shiro、JWT、Redis 进行认证鉴权 Shiro架构 Apache Shiro是一个轻量级的安全框架 Shiro可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在JavaSE环境&#xff0c;也可以用在JavaEE环境。 Shiro可以帮助我们完成&#xff1a;认证、授权、加密、会…

kettle 先删除后插入_Kettle:使用触发器和快照表进行增量数据同步

主库为Oracle 11g数据库&#xff0c;针对需要同步的表建立增量数据临时表以及反向并通过水壶定时同步到PostgreSQL数据库。1&#xff0c;主库创建快照表和快照注意&#xff1a;快照表结构和源表结构必须一致&#xff01;--创建插入快照表 CREATE TABLE SPWUSER.WEB_CUSTOMER_IN…