SpringBoot自定義注解實(shí)現(xiàn)Token校驗(yàn)的方法
1.定義Token的注解,需要Token校驗(yàn)的接口,方法上加上此注解
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; }
2.定義LoginUser注解,此注解加在參數(shù)上,用在需要從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 { }
3.權(quán)限的校驗(yàn)攔截器
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 @Slf4j public 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; } //沒有聲明需要權(quán)限,或者聲明不驗(yàn)證權(quán)限 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校驗(yàn)通過,將用戶信息放在request中,供需要用user信息的接口里從token取數(shù)據(jù) 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; } }
4.寫參數(shù)的解析器,將登陸用戶對(duì)象注入到接口里
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; @Component public 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; } }
5.配置攔截器和參數(shù)解析器
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; @Configuration public 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); } }
7.測(cè)試類
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") @Slf4j public 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"; } }
至此,自定義注解實(shí)現(xiàn)token校驗(yàn)就大功告成了。
到此這篇關(guān)于SpringBoot自定義注解實(shí)現(xiàn)Token校驗(yàn)的方法的文章就介紹到這了,更多相關(guān)SpringBoot Token校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring注解驅(qū)動(dòng)開發(fā)實(shí)現(xiàn)屬性賦值
- Spring中的注解之@Override和@Autowired
- Spring事務(wù)注解@Transactional失效的八種場(chǎng)景分析
- Spring注解解析之@ImportResource
- Spring-IOC容器中的常用注解與使用方法詳解
- @SpringBootApplication注解的使用
- SpringMVC結(jié)構(gòu)簡(jiǎn)介及常用注解匯總
- Spring注解實(shí)現(xiàn)Bean自動(dòng)裝配示例詳解
- 詳解Spring注解驅(qū)動(dòng)開發(fā)之屬性賦值
相關(guān)文章
SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫版本控制的詳細(xì)教程
這篇文章主要介紹了SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫版本控制,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Spring中@Transactional用法詳細(xì)介紹
這篇文章主要介紹了Spring中@Transactional用法詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02SpringBoot使用@EnableAutoConfiguration實(shí)現(xiàn)自動(dòng)配置詳解
你有想過SpringBoot為什么能夠自動(dòng)的幫我們創(chuàng)建一個(gè)Bean對(duì)象么?或許在我們使用的時(shí)候只需要在自己自定義的配置文件中加入@Bean對(duì)象就可以,但SpringBoot是如何來創(chuàng)建的呢2022-08-08Nacos框架服務(wù)注冊(cè)實(shí)現(xiàn)流程
這篇文章主要介紹了SpringCloud服務(wù)注冊(cè)之nacos實(shí)現(xiàn)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)簡(jiǎn)單例子
這篇文章主要給大家介紹了關(guān)于java實(shí)用小技巧之判斷l(xiāng)ist是否有重復(fù)項(xiàng)的相關(guān)資料,在開發(fā)工作中我們有時(shí)需要去判斷List集合中是否含有重復(fù)的元素,需要的朋友可以參考下2023-10-10SpringBoot中基于JWT的單token授權(quán)和續(xù)期方案步驟詳解
在前后端分離架構(gòu)中,用戶登錄后,后端生成JWT?Token返給前端存于LocalStorage,每次請(qǐng)求攜帶Token驗(yàn)證身份,后端校驗(yàn)其有效性,本文給大家介紹SpringBoot中基于JWT的單token授權(quán)和續(xù)期方案步驟詳解,感興趣的朋友一起看看吧2024-09-09Spring security認(rèn)證兩類用戶代碼實(shí)例
這篇文章主要介紹了Spring security認(rèn)證兩類用戶代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06