詳解SpringBoot如何優(yōu)雅的處理免登錄接口
在項(xiàng)目開(kāi)發(fā)過(guò)程中,會(huì)有很多API接口不需要登錄就能直接訪問(wèn),比如公開(kāi)數(shù)據(jù)查詢(xún)之類(lèi)的 ~
常規(guī)處理方法基本是 使用攔截器或過(guò)濾器,攔截需要認(rèn)證的請(qǐng)求路徑。在攔截器中判斷session或token信息,如果存在則放行,否則跳轉(zhuǎn)到登錄頁(yè)。過(guò)濾器原理與攔截器類(lèi)似,可以在過(guò)濾器中判斷請(qǐng)求的session或token信息,麻煩的地方就是:每次開(kāi)發(fā)新的免登錄接口的時(shí)候,都需要去配置一下路徑
今天介紹一個(gè)更優(yōu)雅的方法:自定義注解的方式
基本思路是:自定義一個(gè)注解,在不需要校驗(yàn)登錄的Controller方法或類(lèi)上使用該注解。通過(guò)AOP或攔截器在方法執(zhí)行前判斷免登錄狀態(tài)
自定義注解這里命名為NoToken
import java.lang.annotation.*;
/**
* 不校驗(yàn)token注解
*/
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NoToken {
String name() default "";
}這里采用攔截器搭配使用,攔截器代碼如下
@Slf4j
public class SessionInterceptor implements HandlerInterceptor {
//在請(qǐng)求處理之前進(jìn)行調(diào)用Controller方法調(diào)用之前
@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, 說(shuō)明不需要攔截, 直接放過(guò)
return true;
} else {
Method method = handlerMethod.getMethod();
handlerMethod.getMethodAnnotation(NoToken.class);
//獲取出方法上的NoToken注解
NoToken access = method.getAnnotation(NoToken.class);
if (access != null) {
// 如果注解不為null, 說(shuō)明不需要攔截, 直接放過(guò)
return true;
}
}
}
RedisService redis = (RedisService) SpringContextUtils.getBean("redisService");
String token = request.getHeader("token");
boolean ok = false;
log.info("開(kāi)始檢驗(yàn)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", "登錄已過(guò)期,請(qǐng)重新登錄");
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注解和攔截器上,做了兩種處理 也就是類(lèi)注解 和 方法注解
如果注解放到方法上,該方法調(diào)用的時(shí)候就是免登錄的。如果注解放到@Controller類(lèi)上,那么該類(lèi)下的所有請(qǐng)求接口,都是免登錄的(是不是很方便 ~)
/**
* 類(lèi)上加NoToken注解,該類(lèi)下所有方法都免登錄
*/
@NoToken
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
/**
* 方法上單獨(dú)加注解,只對(duì)該方法免登錄
*/
@NoToken
@RequestMapping("testMethod")
public void testMethod() {
System.out.println("1111111111111");
}
}以上就是實(shí)現(xiàn)方式,如果覺(jué)得還有用,就點(diǎn)個(gè)贊吧 ~
到此這篇關(guān)于詳解SpringBoot如何優(yōu)雅的處理免登錄接口的文章就介紹到這了,更多相關(guān)SpringBoot處理免登錄接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java代碼性能測(cè)試實(shí)戰(zhàn)之ContiPerf安裝使用
這篇文章主要為大家介紹了Java代碼性能測(cè)試實(shí)戰(zhàn)之ContiPerf安裝使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
java使用freemarker模板生成html再轉(zhuǎn)為pdf
這篇文章主要為大家詳細(xì)介紹了java如何使用freemarker模板生成html,再利用iText將生成的HTML轉(zhuǎn)換為PDF文件,感興趣的小伙伴可以參考下2025-04-04
基于SpringBoot和Vue的動(dòng)態(tài)語(yǔ)音播放實(shí)現(xiàn)
本文介紹如何使用SpringBoot和Vue實(shí)現(xiàn)音頻文件的動(dòng)態(tài)播放,包括前端頁(yè)面設(shè)計(jì)、后端接口開(kāi)發(fā)、音頻文件存儲(chǔ)和調(diào)用等方面。通過(guò)該實(shí)現(xiàn),用戶(hù)可以在網(wǎng)頁(yè)上直接播放音頻,增強(qiáng)用戶(hù)體驗(yàn),提高網(wǎng)站互動(dòng)性2023-04-04
SpringMVC基于注解方式實(shí)現(xiàn)上傳下載
本文主要介紹了SpringMVC基于注解方式實(shí)現(xiàn)上傳下載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Spring打包jar包時(shí)jsp頁(yè)面無(wú)法訪問(wèn)問(wèn)題解決
這篇文章主要介紹了Spring打包jar包時(shí)jsp頁(yè)面無(wú)法訪問(wèn)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
JVM進(jìn)階教程之字段訪問(wèn)優(yōu)化淺析
這篇文章主要給大家介紹了關(guān)于JVM進(jìn)階教程之字段訪問(wèn)優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01

