广告
返回顶部
首页 > 资讯 > 精选 >怎么在SpringBoot中通过自定义注解实现一个Token校验功能
  • 443
分享到

怎么在SpringBoot中通过自定义注解实现一个Token校验功能

2023-06-14 05:06:24 443人浏览 薄情痞子
摘要

本篇文章为大家展示了怎么在SpringBoot中通过自定义注解实现一个Token校验功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。定义Token的注解,需要Token校验的接口,方法上加上此注解

本篇文章为大家展示了怎么在SpringBoot中通过自定义注解实现一个Token校验功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

定义Token的注解,需要Token校验的接口,方法上加上此注解

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Token {  boolean validate() default true;}

定义LoginUser注解,此注解加在参数上,用在需要从token里获取的用户信息的地方

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; @Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)public @interface LoginUser {}

权限的校验拦截器

import com.example.demo.annotation.Token;import com.example.demo.entity.User;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import org.springframework.WEB.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.Http.httpservletRequest;import javax.servlet.http.HttpServletResponse; @Component@Slf4jpublic class AuthorizationInterceptor extends HandlerInterceptorAdapter {  public static final String USER_KEY = "USER_ID";  public static final String USER_INFO = "USER_INFO";  @Override  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {    Token annotation;    if(handler instanceof HandlerMethod) {      annotation = ((HandlerMethod) handler).getMethodAnnotation(Token.class);    }else{      return true;    }    //没有声明需要权限,或者声明不验证权限    if(annotation == null || annotation.validate() == false){      return true;    }    //从header中获取token    String token = request.getHeader("token");    if(token == null){      log.info("缺少token,拒绝访问");      return false;    }     //查询token信息//    User user = redisUtils.get(USER_INFO+token,User.class);//    if(user == null){//      log.info("token不正确,拒绝访问");//      return false;//    }     //token校验通过,将用户信息放在request中,供需要用user信息的接口里从token取数据    request.setAttribute(USER_KEY, "123456");    User user=new User();    user.setId(10000L);    user.setUserName("2118724165@qq.com");    user.setPhoneNumber("15702911111");    user.setToken(token);    request.setAttribute(USER_INFO, user);    return true;  }}

写参数的解析器,将登陆用户对象注入到接口里

import com.example.demo.annotation.LoginUser;import com.example.demo.entity.User;import com.example.demo.interceptor.AuthorizationInterceptor;import org.springframework.core.MethodParameter;import org.springframework.stereotype.Component;import org.springframework.web.bind.support.WebDataBinderFactory;import org.springframework.web.context.request.NativeWebRequest;import org.springframework.web.context.request.RequestAttributes;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.method.support.ModelAndViewContainer;@Componentpublic class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver{  @Override  public boolean supportsParameter(MethodParameter methodParameter) {    return methodParameter.getParameterType().isAssignableFrom(User.class)&&methodParameter.hasParameterAnnotation(LoginUser.class);  }   @Override  public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {    //获取登陆用户信息    Object object = nativeWebRequest.getAttribute(AuthorizationInterceptor.USER_INFO, RequestAttributes.SCOPE_REQUEST);    if(object == null){      return null;    }    return (User)object;  }}

配置拦截器和参数解析器

import com.example.demo.interceptor.AuthorizationInterceptor;import com.example.demo.resolver.LoginUserHandlerMethodArgumentResolver;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.method.support.HandlerMethodArgumentResolver;import org.springframework.web.servlet.config.annotation.InterceptorReGIStry;import org.springframework.web.servlet.config.annotation.WebmvcConfigurer;import java.util.List; @Configurationpublic class WebMvcConfig implements WebMvcConfigurer {  @Autowired  private AuthorizationInterceptor authorizationInterceptor;  @Autowired  private LoginUserHandlerMethodArgumentResolver loginUserHandlerMethodArgumentResolver;   @Override  public void addInterceptors(InterceptorRegistry registry) {    registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**");  }   @Override  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {    argumentResolvers.add(loginUserHandlerMethodArgumentResolver);  }}

测试

import com.example.demo.annotation.LoginUser;import com.example.demo.annotation.Token;import com.example.demo.entity.User;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController; @RestController@RequestMapping(value = "/api")@Slf4jpublic class TestController {  @RequestMapping(value="/test",method = RequestMethod.POST)  @Token  public String test(@LoginUser User user){    System.out.println("需要token才可以访问,呵呵……");    log.info("user:"+user.toString());    return "test";  }  @RequestMapping(value="/noToken",method = RequestMethod.POST)  public String noToken(){    System.out.println("不用token就可以访问……");    return "test";  }}

上述内容就是怎么在SpringBoot中通过自定义注解实现一个Token校验功能,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么在SpringBoot中通过自定义注解实现一个Token校验功能

本文链接: https://www.lsjlt.com/news/268031.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作