用户访问接口验证,如果用户没有登录,则不让他访问除登录外的任何接口。

实现思路:

1.前端登录,后端创建token(通过JWT这个依赖),返给前端

2.前端访问其他接口,传递token,后端判断token存在以或失效

3.失效或不存在,则返回失效提示,前端根据接口返回的失效提示,让其跳转到登录界面


目录

实现思路:

注解定义

调用都通过注解

登录才能通过

注解的作用说明@Target代表此注解,能@到哪些代码上

token生成与验证

拦截器定义

拦截器配置定义

拦截器的方法执行类

注解使用

返回值-全局异常类定义

各种测试

不传token

制造可行的假token

伪造token测试

程序员使用:方法不加注解,测试

程序员使用:加上,调用通过,注解

拓展:从请求中获取token


注解定义

定义2个注解,1个用于任何接口都能访问,另外一个用于需要登录才能访问

调用都通过注解

package com.example.etf.story.tools;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {boolean required() default true;
}

登录才能通过

package com.example.etf.story.tools;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {boolean required() default true;
}

注解的作用说明
@Target代表此注解,能@到哪些代码上

@Target:注解的作用目标

@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包

@Retention:注解的保留位置

RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。

@Document:说明该注解将被包含在javadoc
@Inherited:说明子类可以继承父类中的该注解

token生成与验证

传送门

然后springBoot拦截器验证token

拦截器定义

拦截器配置定义

拦截器拦截,除了登录和发送短信,不拦截,其他都拦截

package com.example.etf.story.tools;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import javax.annotation.Resource;@Configuration
public class MyMvcConfig implements WebMvcConfigurer {@Resourceprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册自己的拦截器,并设置拦截的请求路径//addPathPatterns为拦截此请求路径的请求//excludePathPatterns为不拦截此路径的请求registry.addInterceptor(loginInterceptor).addPathPatterns("/story/*").excludePathPatterns("/story/sendSMS").excludePathPatterns("/story/signOrRegister");}
}

拦截的时候,调用的方法,给谁通过

其中service查询数据库,有没有用户,的方法要自己写

拦截器的方法执行类

package com.example.etf.story.tools;import com.auth0.jwt.JWT;
import com.auth0.jwt.exceptions.JWTDecodeException;import com.example.etf.story.dao.R;
import com.example.etf.story.paramer.UserInfoParam;
import com.example.etf.story.service.TestClientService;
import com.example.etf.story.service.TokenUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;@Slf4j
@Component
public class LoginInterceptor extends R implements HandlerInterceptor {/*** 目标方法执行前* 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作* 返回 true 表示继续向下执行,返回 false 表示中断后续操作** @return*/@Resourceprivate TestClientService testClientService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("token");// 从 http 请求头中取出 token// 如果不是映射到方法直接通过if (!(handler instanceof HandlerMethod)) {return true;}HandlerMethod handlerMethod = (HandlerMethod) handler;Method method = handlerMethod.getMethod();//检查方法是否有passtoken注解,有则跳过认证,直接通过if (method.isAnnotationPresent(PassToken.class)) {PassToken passToken = method.getAnnotation(PassToken.class);if (passToken.required()) {return true;}}//检查有没有需要用户权限的注解if (method.isAnnotationPresent(UserLoginToken.class)) {UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);if (userLoginToken.required()) {// 执行认证if (token == null) {throw new RuntimeException("无token,请重新登录");}// 获取 token 中的 user idString phone;try {phone = JWT.decode(token).getClaim("phone").asString();} catch (JWTDecodeException j) {throw new RuntimeException("token不正确,请不要通过非法手段创建token");}//查询数据库,看看是否存在此用户,方法要自己写UserInfoParam userInfoParam = testClientService.selectUserByPhone(phone);if (userInfoParam == null) {throw new RuntimeException("用户不存在,请重新登录");}// 验证 tokenif (TokenUtils.verify(token)) {return true;} else {throw new RuntimeException("token过期或不正确,请重新登录");}}}throw new RuntimeException("没有权限注解一律不通过");}/*** 目标方法执行后* 该方法在控制器处理请求方法调用之后、解析视图之前执行* 可以通过此方法对请求域中的模型和视图做进一步修改*/@Overridepublic void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndViewmodelAndView) throws Exception {System.out.println("postHandle执行{}");}/*** 页面渲染后* 该方法在视图渲染结束后执行* 可以通过此方法实现资源清理、记录日志信息等工作*/@Overridepublic void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exceptionex) throws Exception {System.out.println("afterCompletion执行异常");}}

注解使用

在controller层加入注解进行测试

返回值-全局异常类定义

加入全局,异常类,这样当异常,会返回你所指定的异常

package com.example.etf.story.tools;import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice
public class GloablExceptionHandler {@ResponseBody@ExceptionHandler(Exception.class)public Object handleException(Exception e) {String msg = e.getMessage();if (msg == null || msg.equals("")) {msg = "服务器出错";}JSONObject jsonObject = new JSONObject();jsonObject.put("message", msg);jsonObject.put("status",500)return jsonObject;}
}

各种测试

不传token

成功

制造可行的假token

我们测试一下加token后的

因为数据库里,我没有插入,所以不存在,我们在随便写个token

伪造token测试

我们在试试

程序员使用:方法不加注解,测试

程序员使用:加上,调用通过,注解

我们试试,加上通过注解

拓展:从请求中获取token

我们在试试从中获取token

结束。

参考文章:

SpringBoot集成JWT实现token验证 - 简书

springboot对请求的接口实现token拦截以及参数校验_kotomeli的博客-CSDN博客_springboot拦截请求参数

java SpringBoot登录验证token拦截器相关推荐

  1. 手机验证码+Redis登录验证+token+登录拦截

    手机验证码+Redis登录验证+token+登录拦截 文章目录 手机验证码+Redis登录验证+token+登录拦截 解决方案 思想 以阿里云为例 1.阿里云官网开通短信服务 2.创建签名 3.创建短 ...

  2. 在SpringBoot项目中整合拦截器

    拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现.总结起来,拦截器大致有以下几种使用场景: 1.权限检查:如登录检测,进入处理程序检测用户是否登录,如果没有,则直接 ...

  3. token拦截器阻止连接_如何防止广告拦截器阻止您的分析数据

    token拦截器阻止连接 TL;DR There's dataunlocker.com service coming soon (subscribe!), along with the open-so ...

  4. springBoot之过滤器和拦截器的使用

    在springBoot中,过滤器和拦截器的使用. 过滤器 概述 过滤器是什么? 简单的来说,过滤器就是过滤的作用,在web开发中过滤一些我们指定的url. 过滤器主要做什么? 过滤掉一些不需要的东西, ...

  5. 科学的解决Http Token拦截器TokenInterceptor实现

    1.写在前面 在做项目的时候,有时对接口要求比较严谨.先介绍下情况. 我这边Http 方式采用的是 OKhttp+Retrofit 后台一共分为三种token,分别是实名token(accessTok ...

  6. springboot中配置了拦截器后,拦截器无效的解决方案之一

    springboot中配置了拦截器后,拦截器无效的解决方案之一 参考文章: (1)springboot中配置了拦截器后,拦截器无效的解决方案之一 (2)https://www.cnblogs.com/ ...

  7. Java自定义异常类以及异常拦截器

    Java自定义异常类以及异常拦截器 参考文章: (1)Java自定义异常类以及异常拦截器 (2)https://www.cnblogs.com/acm-bingzi/p/java_exception. ...

  8. 前端登录验证(Token)

    1.登录验证(token) 请求需要登录态标识的接口时,会先判断本地是否存储的有token. ①如果是客户端首次登陆, 会将用户密码发送给服务器端, 服务器判断用户密码是否正确, 如果验证正确的话返回 ...

  9. SpringBoot项目使用JWT+拦截器实现token验证

    利用token进行用户身份验证 流程 客户端使用用户名和密码请求登录 服务端收到登录请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token ...

最新文章

  1. 如何使用python画折线图-Python 使用 matplotlib 画折线图教程
  2. 1.3 循环神经网络模型-深度学习第五课《序列模型》-Stanford吴恩达教授
  3. 使用docker commit将修改后的容器保存为镜像及其使用注意事项
  4. PyTorch官方教程中文版:Pytorch之图像篇
  5. SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列
  6. php mysql-proxy报错_MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错,MySQL报General error: 1243错误...
  7. 安卓手机怎么root_怎么在腾讯手机管家中一键获取Root权限
  8. 没有搜索_杭州诠网科技解析搜索词和点击量正常却没有咨询对话的原因
  9. 通过软考高项的艰辛历程
  10. 智能卡APDU的命令及其解析
  11. 加拿大计算机硕士留学移民,加拿大硕士留学移民深度解析,纯干货
  12. 2020高考数学:常用知识点公式第四章(文科)
  13. 视频回顾 | Pulsar Summit Asia 2020 · 场景案例(上):即时零售, 金融证券, 物联网, 电信计费等...
  14. 情人节用Python画玫瑰花
  15. LOJ 3124 「CTS2019 | CTSC2019」氪金手游——概率+树形DP
  16. VB打开工程时出现不能加载MSCOMCTL.OCX的解决方法
  17. ListView加载图片错位的问题,解决很简单
  18. c语言ntc程序,NTC热敏电阻温度计算以及C语言实现
  19. sublime text3插件使用
  20. hadoop实战(三) 使用HDFS操作文件

热门文章

  1. mysql交集_mysql交集INTERSECT运算符的具体应用方法
  2. 世界史上五个横跨亚欧非三大洲的超强帝国
  3. 使用pdf.js实现pdf文件的在线预览(有码源)
  4. LCC编译器的源程序分析(2)LCC编译器的预处理
  5. linux下运行yolo,Linux下 安装YOLO
  6. C++ 中的容器类详解
  7. discuz mobile 接口加载过程
  8. 切换分支node_modules问题——npm ERR! This is probably not a problem with npm. There is likely additional log
  9. 使用Animations动画改变View的cornerRadius半径
  10. 在ubuntu 搭建TFTP服务器时的步骤及 出现的常见错误:Restarting tftpd-hpa (via systemctl): tftpd-hpa.serviceJob for tftpd-