八、SpringBoot登录接口+Token+拦截器编写超详细

在开发登录接口时你都需要做什么,不会就是简单的将数据和后端数据对比吧,都对的话就进入没有就拒绝访问,那样的话是不是在忽悠小孩子呀~~~~~哈哈哈

话不多说,开搞

一、登录接口编写

登录接口的参数校验和注册接口一样,可以看看上一篇注册接口文章,对啦还有Md5的加密欧

// 登录接口
@PostMapping("/login")
public Result login(@Pattern(regexp = "^\\d{4,6}$") String username,@Pattern(regexp = "^[a-zA-Z]\\w{5,17}$") String password){
    // 根据用户名查询用户
    User LoginUser = userService.select(username);
    // 判断用户是否存在
    if(LoginUser == null){

        return Result.error("没有该账户");
    }
    // 判断密码是否正确  loginUser 对象中的password是密文
    if(Md5Util.getMD5String(password).equals(LoginUser.getPassword())){
        // 这里用来生成token
    }
    return Result.error("密码错误");
}

二、 导入JWT

1.导入JWT依赖

<!--      生成令牌jwt依赖-->
<dependency>
  <groupId>com.auth0</groupId>
  <artifactId>java-jwt</artifactId>
  <version>4.4.0</version>
</dependency>

2.封装JWT工具类

        

public class JwtUtil {

    private static final String KEY = "yangyangshije";
   
   //接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
                .withClaim("claims", claims)
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
                .sign(Algorithm.HMAC256(KEY));
    }

   //接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("claims")
                .asMap();
    }

}

3.导入登入接口生成Token

// 登录接口
@PostMapping("/login")
public Result login(@Pattern(regexp = "^\\d{4,6}$") String username,@Pattern(regexp = "^[a-zA-Z]\\w{5,17}$") String password){
    // 根据用户名查询用户
    User LoginUser = userService.select(username);
    // 判断用户是否存在
    if(LoginUser == null){

        return Result.error("没有该账户");
    }
    // 判断密码是否正确  loginUser 对象中的password是密文
    if(Md5Util.getMD5String(password).equals(LoginUser.getPassword())){
        // 这里用来生成token
        // 登陆成功生成一个token
        Map<String,Object> claims = new HashMap<>();
        claims.put("id",LoginUser.getId());  // 登录名字
        claims.put("username",LoginUser.getUsername());
        String token =  JwtUtil.genToken(claims);
        return Result.success(token);  // jwt token令牌发布 登陆验证
    }
    return Result.error("密码错误");
}

三、拦截器

1.生成拦截器

// 拦截器
@Component  // 拦截器对象注入
public class LoginInterceptor implements HandlerInterceptor {

    @Override  //Override是伪代码,判断所有父类是否有错误
    // preHandle 调用时间:controller方法处理之前
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws  Exception{
        // 令牌验证                         请求头名字
        String token = request.getHeader("Authorization");
        // 验证token
        try {
            Map<String, Object> claims  = JwtUtil.parseToken(token);
            // 把业务数据存储到ThreadLocal
            ThreadLocalUtil.set(claims);
            // 解析成功应该是放行
            return true;
        }catch(Exception e){
            // http响应状态码401
            response.setStatus(401);
            // 不放行
            return false;
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        // 清空theradLocal中的数据
        ThreadLocalUtil.remove();
    }
}

/**
 * ThreadLocal 工具类  提供线程的局部变量,用来存储数据: set()/get() 使用threadlocal存储的数据,线程安全
 */
@SuppressWarnings("all")
public class ThreadLocalUtil {
    //提供ThreadLocal对象,
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    //根据键获取值
    public static <T> T get(){
        return (T) THREAD_LOCAL.get();
    }
   
    //存储键值对
    public static void set(Object value){
        THREAD_LOCAL.set(value);
    }


    //清除ThreadLocal 防止内存泄漏
    public static void remove(){
        THREAD_LOCAL.remove();
    }
}

2.注入拦截器

 
import org.example.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// 注入适配器
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    // 快捷建立 addinter
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 拦截器的注册和使用不能将所有请求数据都拦截
        // 登录和注册接口不拦截
        registry.addInterceptor(loginInterceptor).excludePathPatterns("/login","/add");

    }
}

四、测试

1.错误测试

2.正确测试

登录

删除

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot,我们可以使用拦截器来验证token拦截器是一种在请求处理之前或之后拦截请求的机制。我们可以在拦截器编写代码来验证token,并在需要时拒绝请求。为了实现这个目标,我们需要编写一个自定义的拦截器类,并将其配置到Spring Boot应用程序。 具体步骤如下: 1. 创建一个自定义的拦截器类,例如TokenInterceptor.java。 2. 在拦截器编写代码来验证token。可以使用第三方库,例如JWT,来验证token。 3. 创建一个拦截器配置类,例如InterceptorConfig.java。 4. 在拦截器配置类注册自定义拦截器,并配置拦截器的拦截路径和排除路径。 5. 在Spring Boot应用程序启用拦截器配置。 下面是一个简单的示例代码,演示如何在Spring Boot使用拦截器验证tokenTokenInterceptor.java: ``` public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 验证token的代码 // 如果token验证失败,可以使用response对象返回错误信息 return true; } } ``` InterceptorConfig.java: ``` @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(tokenInterceptor) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/login"); // 排除登录请求 } } ``` 在上面的示例代码,我们创建了一个名为TokenInterceptor的自定义拦截器类,并实现了HandlerInterceptor接口。在preHandle方法,我们可以编写代码来验证token。如果token验证失败,可以使用response对象返回错误信息。 然后,我们创建了一个名为InterceptorConfig的拦截器配置类,并实现了WebMvcConfigurer接口。在addInterceptors方法,我们注册了TokenInterceptor拦截器,并配置了拦截路径和排除路径。在这个例子,我们拦截了所有请求,但排除了/login请求。 最后,在Spring Boot应用程序启用拦截器配置。这可以通过在应用程序类上添加@EnableWebMvc注解来实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值