前端 - 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;
}
前端 - token 是什么?为什么每次请求头(HEADS)里要携带它?___请求时,为什么要携带token?相关推荐
- 添加请求头 retrofit_Python爬虫偷懒神器 — 快速构造请求头!
我们在写爬虫构建请求的时候,不可避免地要添加请求头( headers ),一般来说,我们只要添加 user-agent 就能满足绝大部分需求了 但这并不是绝对的,有些请求单单添加一个 user-age ...
- python中scrapy加请求头_Python爬虫之scrapy框架随机请求头中间件的设置
方法一,定义一个存放请求头的列表,并从中随机获取请求头: 获取请求头的网址http://www.useragentstring.com/pages/useragentstring.php?name=A ...
- springcloud- FeginClient 调用统一拦截添加请求头 RequestInterceptor ,被调用服务获取请求头...
使用场景: 在springcloud中通过Fegin调用远端RestApi的时候,经常需要传递一些参数信息到被调用服务中去,比如从A服务调用B服务的时候, 需要将当前用户信息传递到B调用的服务中去,我 ...
- nginx过滤post请求头_BT宝塔面板Nginx防火墙HTTP请求过滤及GET/POST/UA过滤设置介绍...
本次BT宝塔面板的Nginx防火墙的内容比较多,这次虾皮路又介绍一下BT宝塔面板Nginx防火墙HTTP请求过滤及GET/POST/UA过滤设置相关内容.之前虾皮路也介绍了不少关于BT宝塔面板的Ngi ...
- 微信小程序请求头header_微信小程序开发:http请求
在微信小程序进行网络通信,只能和指定的域名进行通信,微信小程序包括四种类型的网络请求. 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downlo ...
- ios请求头解决参数中文乱码_解决请求参数的中文乱码问题(get、post)
2018-11-28 在web请求与响应中,会遇到乱码问题,比如填写表单数据时,难免会输入中文,姓名.公司名称等.由于HTML设置了浏览器在传递请求参数时,采用的编码方式是UTF-8,但在解码时采用的 ...
- 5获取http请求头_获取托管者发送http请求报文的解决方案
在测试.调试策略代码时.实盘运行机器人时经常有遇到交易所接口报错的情况,此时去查询交易所接口API文档,查询相关报错信息,咨询交易所API技术客服时总是需要提供报错时的请求报文,用来分析报错原因.这个 ...
- ajax请求头cookies中传递sid,跨域请求单点登录,登录成功,但是在controller中获取的cookie与浏览器中不一致,请大神指点一二。^_^...
跨域请求js代码: $.ajax({ type:"post", async:false, contentType : "application/x-www-form-ur ...
- html form提交增加请求头,怎么给jquery跨域post请求添加头部信息?
跨域,的整序大作站对近从体的家为宽应近从体的家服务器已开放请求接口,用$post可以成功,但是无法添加header信息,用$ajax的话会把post信息换成OPTIONS发送请求,data跟heade ...
- 错题集(已解决):爬虫中碰到请求头header里有冒号‘:‘在key前面,直接调用requests报错valueError: Invalid header name b‘:authority‘
不说闲话直接入题: 碰到如下这样有冒号':'在前面的请求标头,如果直接在requests的headers参数里写冒号的话会报错 具体报错如下ValueError: Invalid header nam ...
最新文章
- 软件项目管理面面观之“玩的就是心跳”
- java中的string函数_java中string.trim()函数的作用实例及源码
- 通过IP地址查计算机名
- 【TensorFlow-windows】MobileNet理论概览与实现
- 迷宫问题c语言报告,c语言写的迷宫问题
- 中国凉亭行业市场供需与战略研究报告
- 全球名校课程作业分享系列(6)--斯坦福计算机视觉与深度学习CS231n之神经网络细解与优化尝试
- 撞了南墙要记得回头看看
- linux环境pwd下ls,Linux基础命令2:cd、pwd、ls、stat、touch、alias
- 计算机英语期末试题,计算机英语期末考试试题
- html导航页面转换,纯CSS实现导航栏Tab切换效果
- 计算机科学与技术学业目标,计算机科学与技术专业本科培养目标及要求.doc
- ros操作命令与实操-话题发布
- 联邦学习与神经协同过滤模型的结合
- 计算机如何打开无线网络适配器,电脑WIFI网络适配器卡怎么启用
- iphone android同花顺,九成Android手机已内置同花顺手机炒股
- 编程字体Source Code Pro 安装
- 招聘android工程师
- 2022/9/16-2022/9/20
- 我今年35岁,余生却已极度迷茫,我有一点点惊慌
热门文章
- [转载] python学习笔记2--操作符,数据类型和内置功能
- python中类怎么理解_Python中的列表理解
- Python operator.lt()函数与示例
- css scroll属性_CSS中的scroll-behavior属性
- Java ClassLoader findResources()方法与示例
- python 示例_Python日历类| yeardatescalendar()方法与示例
- 软件可用性测试mantis,学生选课系统-软件可用性测试实验.doc
- ros 双wan配置_基于ROS搭建简易软件框架实现ROV水下目标跟踪(九)--程序解析之PWM波下发...
- MATLAB学习——常用语句
- 度量计算机外部传输单位,用来度量计算机外部设备传输率的是什么度量单位?...