自定义拦截器jwt登录校验接口模拟账号登录

五一闲在宿舍,本来想写一个自己的简易博客网站,发现vue基础太差,做不出来页面效果于是便放弃,但也没有完全放弃。于是我分析了一下简易博客的后端实现流程,除了最基本的crud以外,在自己目前的对接口的分析中感觉比较复杂的便是登录校验这一块,于是便用apifox 进行接口测试,模拟实现一个登录校验接口

接口分析

我们在发送一个登录请求到后端之后,首先会经过拦截器,拦截器拦截到这次登录请求,于是就会创建一个token返回给前端,在接下来的每次请求后面都会携带这个token进行请求。

假设 我们token返回给前端之后,前端进行校验成功,然后切换到登录之后的页面。切换到登录之后的页面之后,你的每一次请求都会携带后端创建的token进行校验之后,再进行数据的查询显示等操作

准备工作

1.依赖的引入

我们引入 jwt 依赖  lombok 依赖 以及其他常用的依赖

这里在我的pom文件中 因为只有一个demo  并没有多个demo,所以并没有用maven的继承聚合分模块管理等,而是直接进行依赖的引入

2.配置 jwt 的yml文件 以及对应的实体类

3.为了使用方便  我们提前设置好 jwt令牌创建与解析的工具类

我们先分析一下创建jwt的方法的传入参数    第一个map集合,我们一般传入的是   登录人员的id,因为到后面由登录id 创建的jwt令牌,到最后解析的时候解析出来的也是这个我们传入的登陆人员的id ,第二个参数 是自己设置的签名密匙,第三个是设置的jwt过期时间单位是毫秒

解析jwt参数 传入的是创建的token和签名密匙

4.配置拦截器

首先 我们配置一个configuration类实现  WebMvcConfigurer 接口 ,重写addInterceptors方法

,然后再写一个拦截器类 实现

 HandlerInterceptor 接口  重写  preHandle  方法。

在这里我们产生一个思考   filter 接口这么好用 只需要 实现一个filter接口 然后 加上@webfilter注解

指定过滤的路径就行了,为什么要用拦截器  

我觉得主要是   拦截器可以进行更好的封装 ,过滤器能做的拦截器都能做 而且过滤器主要负责处理与请求相关的预处理和后处理工作,拦截器主要进行业务操作

过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境

拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑 

综上所述一般就用拦截器,但是两者的选择还是主要看业务场景 

登录接口书写

该接口是一个简易的实现,他的返回值调用值其实并不规范    

在此  我们并没有使用 autowired注解,而是使用lombok的@requireargconstructor注解,基于构造方法注入 bean

拦截器的配置

在这里我为了省力还是用了 autowired 注解,虽然没啥事,但是这并不是springboot现在建议使用的注解 。

当时写完之后 我在想,如果由坏蛋拿到了我的请求 直接用postman或者apifox进行接口请求攻击我怎么办,但是仔细思考了一下发现他们这样并行不通,首先 第一次  他的请求 是/userlogin请求,发现是第一次登录,系统就会校验他的用户名密码,在sql的编写中  用#占位符防止SQL注入。

我又想 如果他拿到token,拿到我的请求网址用postman测试我的接口,但是他涉及的操作也就是登录之后我给予的权限操作,这样貌似并没有什么问题,关于这点  ,我对网络攻击也不太懂,就不去深究了。

这样 我们就写好了一个自定义接口  

接下来进行测试

首先在paifox中进行一系列的设置

接下来启动服务  ,发送请求

 测试通过  

在写的时候想到 由于现在经验并不足,可能这里面会有一些小bug ,如果有,还希望大佬指正

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
自定义拦截器是指在 Web 应用程序中实现的一种机制,用于拦截请求并对其进行处理,例如验证用户是否已登录或检查请求是否符合安全性要求。JWT(JSON Web Token)是一种用于安全地传输信息的开放标准,可以在各种应用程序之间传输信息。 下面是使用自定义拦截器JWT 实现登录和登出的步骤: 1. 创建一个 JWT 工具类,用于生成和验证 JWT。该类应包含以下方法: - 生成 JWT:将用户信息(如用户名、角色等)加密,并将其存储在 JWT 中。 - 验证 JWT:从请求头中获取 JWT 并验证其有效性。 2. 创建一个登录接口,用户在该接口中输入用户名和密码。在验证用户名和密码后,调用 JWT 工具类中的生成 JWT 方法并将 JWT 返回给客户端。 3. 创建一个自定义拦截器,用于拦截所有需要验证 JWT 的请求。在拦截器中,从请求头中获取 JWT 并调用 JWT 工具类中的验证 JWT 方法。如果验证成功,则允许请求通过;否则,返回一个错误响应。 4. 创建一个登出接口,用户在该接口中退出登录。在该接口中,将当前用户的 JWT 从客户端删除。 示例代码如下: JWT 工具类: ```java public class JwtUtil { private static final String SECRET_KEY = "your-secret-key"; private static final long EXPIRATION_TIME = 864_000_000; // 10 days public static String generateToken(User user) { Map<String, Object> claims = new HashMap<>(); claims.put("username", user.getUsername()); claims.put("roles", user.getRoles()); Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (JwtException | IllegalArgumentException e) { return false; } } } ``` 登录接口: ```java @RestController public class LoginController { @PostMapping("/login") public ResponseEntity<String> login(@RequestBody User user) { // validate username and password if (userService.validateUser(user)) { String token = JwtUtil.generateToken(user); return ResponseEntity.ok(token); } else { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } } } ``` 自定义拦截器: ```java public class JwtAuthenticationInterceptor implements HandlerInterceptor { private static final String AUTHORIZATION_HEADER = "Authorization"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader(AUTHORIZATION_HEADER); if (StringUtils.isNotEmpty(token) && JwtUtil.validateToken(token)) { return true; } else { response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } } } ``` 登出接口: ```java @RestController public class LogoutController { @PostMapping("/logout") public ResponseEntity<Void> logout(HttpServletRequest request, HttpServletResponse response) { CookieUtils.deleteCookie(request, response, "jwt"); return ResponseEntity.ok().build(); } } ``` 在 Web 应用程序中注册拦截器: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new JwtAuthenticationInterceptor()).addPathPatterns("/api/**"); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三氧化真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值