前言:首先讲jwt令牌,其实就是token,主要用于鉴别用户请求是不是合法的,怎么校验?给它标记!当用户登录时,通过过滤器或者拦截器对请求进行拦截,如果是登录请求,让用户登录,登录校验账号密码没问题了,给它制作个jwt令牌,让他拿着这个令牌返回前端,并且保存起来,后续只要在同一个浏览器且不跨域的情况下,token都会生效,每个请求打到后端都会对令牌进行解析,查看是否有效,有效指的是:token完整性,时效性,合法性,我们在生成令牌的时候会给这个令牌进行设置,以上就是关于令牌、过滤器、拦截器的由来
实质上,过滤器和拦截器功能相仿,只需要用到一个就行了,只是顺带讲了,勿要多疑!接下来看看代码实现吧
1.首先是jwt令牌的额制作和解析
signKey是签名,确保令牌数据不会被篡改(我是这么理解的,我不太确定哈哈哈),expire是有效时间,平时登录网页不都是登录之后一定时间就自动退出了吗,应该就是这玩意
2.然后看这个登录接口,这里在登录验证成功后调用了令牌制作的额方法并传递了“claims”,claims 参数是用于包含关于用户或其他实体的声明(statements)的JSON对象。这些声明可以是标准的(由JWT规范定义)或自定义的
那么以上步骤就实现了用户登录及令牌的发放,避免了用户在没有登录的情况下访问其他接口
再讲jwt令牌token,既然token有了,那我登录之后,从新开了个页面或者直接访问其他路径(没有跨域的情况下),你怎么校验我有没有登录呢,举个例子:后端服务本地启动后端口为8080,访问登录接口localhost:8080/login,登录之后token就生成并保存在前端浏览器了,每次请求就会携带这个token,但是现在我直接叉掉登录的页面,然后直接访问localhost:8080/emp,没有跨域,同一个服务,token也还在时效内,是不是就需要个东西拦截这个请求,然后解析token看是否合法?合法则直接给他访问,不合法则退回登录页面
先来看filter过滤器,实现Filter接口并重写所有方法,重点是第二个doFilter方法,他是在请求方法执行前执行的,也就是你执行登录请求,在登录的controller执行前,他会将你拦截,并进行逻辑处理,这里逻辑处理不就可以判断是不是登录接口了吗,如果是自然不用拦截了,如果不是就要看看是否携带token了,并检查是否合法有效,具体逻辑看代码吧
然后是怎么设置拦截哪些请求,看下图,就是这个注解,还可以用web.xml进行配置,注解的话加载Filter实现类上就行了
然后是拦截器,和过滤器80%相似,也是实现接口,这里是实现HandlerInterceptor,并重写方法,拦截器得的主要方法是preHandle,也是在方法执行前执行,下面处理逻辑的代码,就都一样了
然后也是设置拦截哪些请求,和过滤器不一样,他编写一个配置类来拦截,实现WebMvcConfigurer,然后可以设置拦截哪些请求和不拦截哪些请求,这点我觉得比过滤器好,更加精确,就是稍微麻烦点
下班了,赶着下班,有点糙,将就吧