詳解SpringBoot如何優(yōu)雅的處理免登錄接口
在項目開發(fā)過程中,會有很多API接口不需要登錄就能直接訪問,比如公開數據查詢之類的 ~
常規(guī)處理方法基本是 使用攔截器或過濾器,攔截需要認證的請求路徑。在攔截器中判斷session或token信息,如果存在則放行,否則跳轉到登錄頁。過濾器原理與攔截器類似,可以在過濾器中判斷請求的session或token信息,麻煩的地方就是:每次開發(fā)新的免登錄接口的時候,都需要去配置一下路徑
今天介紹一個更優(yōu)雅的方法:自定義注解的方式
基本思路是:自定義一個注解,在不需要校驗登錄的Controller方法或類上使用該注解。通過AOP或攔截器在方法執(zhí)行前判斷免登錄狀態(tài)
自定義注解這里命名為NoToken
import java.lang.annotation.*; /** * 不校驗token注解 */ @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface NoToken { String name() default ""; }
這里采用攔截器搭配使用,攔截器代碼如下
@Slf4j public class SessionInterceptor implements HandlerInterceptor { //在請求處理之前進行調用Controller方法調用之前 @Override @Reference public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; NoToken classAnno = handlerMethod.getMethod().getDeclaringClass().getAnnotation(NoToken.class); //獲取出Controller上的NoToken注解 if (classAnno != null) { // 如果注解不為null, 說明不需要攔截, 直接放過 return true; } else { Method method = handlerMethod.getMethod(); handlerMethod.getMethodAnnotation(NoToken.class); //獲取出方法上的NoToken注解 NoToken access = method.getAnnotation(NoToken.class); if (access != null) { // 如果注解不為null, 說明不需要攔截, 直接放過 return true; } } } RedisService redis = (RedisService) SpringContextUtils.getBean("redisService"); String token = request.getHeader("token"); boolean ok = false; log.info("開始檢驗token!"); if (!StringUtils.isEmpty(token)) { if (redis.exists(token)) { redis.expire(token, ConstantsUtil.APP_TOKEN_EXPIRE); log.info("token有效!"); ok = true; } } if (!ok) { Map<String, Object> result = new HashMap<>(); result.put("returncode","-1"); result.put("returnmsg", "登錄已過期,請重新登錄"); writeJSON(response, result); return ok; } return ok; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) throws Exception { } public void writeJSON(HttpServletResponse response, Object o) throws IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String JsonString = JSON.toJSONString(o); out.write(JsonString); } }
大家看到在NoToken注解和攔截器上,做了兩種處理 也就是類注解 和 方法注解
如果注解放到方法上,該方法調用的時候就是免登錄的。如果注解放到@Controller類上,那么該類下的所有請求接口,都是免登錄的(是不是很方便 ~)
/** * 類上加NoToken注解,該類下所有方法都免登錄 */ @NoToken @Slf4j @RestController @RequestMapping("/test") public class TestController { /** * 方法上單獨加注解,只對該方法免登錄 */ @NoToken @RequestMapping("testMethod") public void testMethod() { System.out.println("1111111111111"); } }
以上就是實現方式,如果覺得還有用,就點個贊吧 ~
到此這篇關于詳解SpringBoot如何優(yōu)雅的處理免登錄接口的文章就介紹到這了,更多相關SpringBoot處理免登錄接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java代碼性能測試實戰(zhàn)之ContiPerf安裝使用
這篇文章主要為大家介紹了Java代碼性能測試實戰(zhàn)之ContiPerf安裝使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06java使用freemarker模板生成html再轉為pdf
這篇文章主要為大家詳細介紹了java如何使用freemarker模板生成html,再利用iText將生成的HTML轉換為PDF文件,感興趣的小伙伴可以參考下2025-04-04基于SpringBoot和Vue的動態(tài)語音播放實現
本文介紹如何使用SpringBoot和Vue實現音頻文件的動態(tài)播放,包括前端頁面設計、后端接口開發(fā)、音頻文件存儲和調用等方面。通過該實現,用戶可以在網頁上直接播放音頻,增強用戶體驗,提高網站互動性2023-04-04