最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解SpringBoot如何優(yōu)雅的處理免登錄接口

 更新時間:2024年01月02日 09:32:12   作者:RoronoaV587  
在項目開發(fā)過程中,會有很多API接口不需要登錄就能直接訪問,比如公開數據查詢之類的,常規(guī)處理方法基本是 使用攔截器或過濾器,攔截需要認證的請求路徑,本文介紹一個更優(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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在MyBatis中進行分頁查詢的兩種方法詳解

    在MyBatis中進行分頁查詢的兩種方法詳解

    在 MyBatis 中進行分頁查詢通常有兩種方法:一種是通過手動拼接 LIMIT 和 OFFSET,另一種是使用 MyBatis 插件(如 MyBatis-PageHelper)來自動處理分頁邏輯,下面分別介紹這兩種方法,需要的朋友可以參考下
    2025-11-11
  • MyBatis映射文件中parameterType與resultType的用法詳解

    MyBatis映射文件中parameterType與resultType的用法詳解

    MyBatis中的ParameterType指的是SQL語句中的參數類型,即傳入SQL語句中的參數的類型,下面這篇文章主要給大家介紹了關于MyBatis映射文件中parameterType與resultType用法的相關資料,需要的朋友可以參考下
    2023-04-04
  • Java web網站訪問量的統(tǒng)計

    Java web網站訪問量的統(tǒng)計

    這篇文章主要為大家詳細介紹了Java web網站訪問量的統(tǒng)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • mybatis的mapper對應的xml寫法及配置詳解

    mybatis的mapper對應的xml寫法及配置詳解

    這篇文章給大家介紹mybatis的mapper對應的xml寫法及配置詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-05-05
  • Unity&Springboot實現本地登陸驗證

    Unity&Springboot實現本地登陸驗證

    本文主要介紹了Unity&Springboot服務器/本地登陸驗證,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java、python、JavaScript以及jquery循環(huán)語句的區(qū)別

    java、python、JavaScript以及jquery循環(huán)語句的區(qū)別

    本篇文章主要介紹java、python、JavaScript以及jquery的循環(huán)語句的區(qū)別,這里整理了它們循環(huán)語句語法跟示例,以便大家閱讀,更好的區(qū)分它們的不同
    2016-07-07
  • Spring SseEmitter 系統(tǒng)及作用詳細講解

    Spring SseEmitter 系統(tǒng)及作用詳細講解

    Spring SseEmitter基于HTTP的長連接,實現服務器單向推送數據,支持異步、多用戶并發(fā)及超時管理,適用于實時通知、進度條等場景,相比WebSocket更輕量且易于實現,本文給大家介紹Spring SseEmitter系統(tǒng)及作用,感興趣的朋友一起看看吧
    2025-07-07
  • java并發(fā)之原子操作類和非阻塞算法

    java并發(fā)之原子操作類和非阻塞算法

    這篇文章主要為大家詳細介紹了java并發(fā)之原子操作類和非阻塞算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 詳解ThreadLocal為什么會內存溢出原理

    詳解ThreadLocal為什么會內存溢出原理

    這篇文章主要為大家介紹了ThreadLocal為什么會內存溢出原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Spring五大類注解讀取存儲Bean對象的方法

    Spring五大類注解讀取存儲Bean對象的方法

    這篇文章主要介紹了Spring五大類注解讀取存儲Bean對象,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論

忻州市| 长寿区| 安多县| 南澳县| 石景山区| 惠水县| 荔波县| 五原县| 上思县| 建瓯市| 揭东县| 天津市| 红桥区| 伽师县| 兰西县| 汝阳县| 咸阳市| 九龙县| 大名县| 金塔县| 保亭| 上虞市| 微博| 合作市| 靖边县| 甘谷县| 礼泉县| 漯河市| 滨海县| 娄烦县| 应城市| 新干县| 北川| 抚松县| 若尔盖县| 邵阳市| 蕲春县| 乌什县| 融水| 武功县| 信丰县|