发表于: 2020-07-10 21:24:47
1 2209
Token访问令牌
一段字符串加密后当成访问令牌也可以, 用明文也可以, like {mobile: 1234}
一、Token含义:
1、Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。
2、Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
3、使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
了解了Token的意义后,我们就更明确的知道为什么要用他了。
二、如何使用Token
这是本文的重点,在这里我就介绍常用的两种方式。
1、用设备号/设备mac地址作为Token(推荐)
客户端:客户端在登录的时候获取设备的设备号/mac地址,并将其作为参数传递到服务端。
服务端:服务端接收到该参数后,便用一个变量来接收同时将其作为Token保存在数据库,并将该Token设置到session中,客户端每次请求的时候都要统一拦截,并将客户端传递的token和服务器端session中的token进行对比,如果相同则放行,不同则拒绝。
分析:此刻客户端和服务器端就统一了一个唯一的标识Token,而且保证了每一个设备拥有了一个唯一的会话。该方法的缺点是客户端需要带设备号/mac地址作为参数传递,而且服务器端还需要保存;优点是客户端不需重新登录,只要登录一次以后一直可以使用,至于超时的问题是有服务器这边来处理,如何处理?若服务器的Token超时后,服务器只需将客户端传递的Token向数据库中查询,同时并赋值给变量Token,如此,Token的超时又重新计时。
2、用session值作为Token
客户端:客户端只需携带用户名和密码登陆即可。
客户端:客户端接收到用户名和密码后并判断,如果正确了就将本地获取sessionID作为Token返回给客户端,客户端以后只需带上请求数据即可。
分析:这种方式使用的好处是方便,不用存储数据,但是缺点就是当session过期后,客户端必须重新登录才能进行访问数据。
三、使用过程中出现的问题以及解决方案?
使用过程中我们还出现各种问题,Token第一种方法中我们隐藏了一个在网络不好或者并发请求时会导致多次重复提交数据的问题。
该问题的解决方案:将session和Token套用,如何套用呢?
session始终保持是同一个对象,因为可以对其加锁,限制只允许同一个对象的单个请求。在后一个请求到来时,使用session中的token对比请求中的token看是否一致,当不一致时被认为是重复提交,将不允许通过。
参考链接:https://www.jianshu.com/p/24825a2683e如何生成token
JWT的构成(java web token)
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
JWT长什么样?
JWT是由三段信息构成的,将这三段信息文本用.
链接一起就构成了Jwt字符串。就像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

分part解析见参考链接:https://www.jianshu.com/p/576dbf44b2ae
SpringMVC中的拦截器,过滤器,监听器
拦截器
拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制。
拦截器不是在web.xml,比如springmvc的配置文件中配置,
对于拦截器我们一般情况下都是结合springmvc的,所以相应到springmvc的配置文件中配置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean id="commonInterceptor" class="org.shop.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
主要应用就是面向切面编程,实现对应的org.springframework.web.servlet.HandlerInterceptor
接口
当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法
其实我们会发现这过滤器、拦截器真的非常像,经常容器弄混,我们非常有必要了解下它们更多的不同点:
- 1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
- 2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
- 3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
- 4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
- 5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
执行顺序:过滤前 - 拦截前 - Action处理 - 拦截后 -过滤后
使用技巧
那我们什么时候正确地使用它们呢?
需要监听到项目中的一些信息,并且不需要对流程做更改时,用监听器;
当需要过滤掉其中的部分信息,只留一部分时,就用过滤器;
当需要对其流程进行更改,做相关的记录时用拦截器。
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应
到此,我相信大家对过滤器、监听器、拦截器都有一定的了解,对于后续使用它们,你一定会更加深刻的理解。
参考链接:https://www.jianshu.com/p/1ce89f9c6f8d
评论