SpringMVC中使用注解清除攔截器

本文描述的是在springmvc中威酒,通過注解清除(跳過)攔截器损肛,支持在Controller類級別或者方法級別來清除稀并,可同時清除多個攔截器昂拂。

在開發(fā)web后臺時鞭缭,我們的接口一般都需要加權限控制。比如一個簡單的場景:用戶需要登錄后才能訪問魏颓,沒登錄就直接跳轉登錄界面或者返回特定的錯誤碼岭辣。通常我們會配置一個攔截器,驗證一下用戶請求攜帶的token甸饱,如果驗證通過就返回true. 這時候有這么一個需求:幾乎所有的controller都需要攔截沦童,但某幾個Controller或者Controller里面的方法需要跳過攔截器,比如用戶登錄的接口和錯誤處理的接口叹话,雖然這時候我們可以在配置爛機器的時候配置忽略路徑偷遗,但這樣不夠靈活。前幾天用注解實現(xiàn)了這一功能驼壶,這里做一個簡單描述氏豌。

首先創(chuàng)建一個注解,內(nèi)容很簡單热凹,value為一個包含要清除的攔截器的數(shù)組泵喘。

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Clear {
    Class<? extends HandlerInterceptor>[] value() default {};
}

接下來要在你的攔截器里面來獲取當前請求對應的方法或者該方法所處的類上面是否有清除當前攔截器的注解泪电。如果有就直接返回true。比如我有一個ApiInterceptor纪铺,主要代碼如下:

public class ApiInterceptor implements HandlerInterceptor {

  //只列出主要代碼
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        HandlerMethod m= (HandlerMethod) o;
        Method method=m.getMethod();
        //判斷是否用注解清除
        if(clearedByAnnotation(method)){
            return true;
        }
      
        //其他操作相速,比如驗證token

        httpServletResponse.sendRedirect("/api/error/401");
        return false;
    }

    private boolean clearedByAnnotation(Method method){
        Clear clear=method.getAnnotation(Clear.class);
        if(clear!=null){
            if(Arrays.asList(clear.value()).contains(ApiInterceptor.class)){
                return true;
            }
        }
        Class clazz=method.getDeclaringClass();
        clear= (Clear) clazz.getDeclaredAnnotation(Clear.class);
        if(clear!=null){
            if(Arrays.asList(clear.value()).contains(ApiInterceptor.class)){
                return true;
            }
        }
        return false;
    }
}

然后,在使用的時候鲜锚,我們只需要在Controller或者Controller里面的方法上面加上Clear注解即可:

@RestController
@RequestMapping("/api/user")
public class UserApi {
  
  @PostMapping("/login/{code}")
  @Clear(ApiInterceptor.class)
  public Res doLogin(@PathVariable String code, HttpServletRequest req){
    // TODO
    return Res.ok;
  }
}

清除多個攔截器:

@RestController
@RequestMapping("/api/error")
@Clear({ApiInterceptor.class,AdminInterceptor.class})
public class ErrorApi {
  
  @RequestMapping("/{code}")
  public Res error(@PathVariable int code){
    return Res.fail.code(code);
  }
}

然后突诬,就沒有然后了,這樣就ok了芜繁,雖然說代碼多一點旺隙,但比起配置忽略路徑要更靈活,最重要的是更能裝X浆洗。然后補充一點催束,如果攔截器比較多的話,每個都這么配會比較繁瑣伏社,可以寫一個BaseInterceptor, 然后其他攔截器繼承就可以抠刺。

你說我是有多無聊,無聊到開始上班寫博客玩了……

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摘昌,一起剝皮案震驚了整個濱河市速妖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聪黎,老刑警劉巖罕容,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異稿饰,居然都是意外死亡锦秒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門喉镰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旅择,“玉大人,你說我怎么就攤上這事侣姆∩妫” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵捺宗,是天一觀的道長柱蟀。 經(jīng)常有香客問我,道長蚜厉,這世上最難降的妖魔是什么长已? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上痰哨,老公的妹妹穿的比我還像新娘胶果。我一直安慰自己,他們只是感情好斤斧,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布早抠。 她就那樣靜靜地躺著,像睡著了一般撬讽。 火紅的嫁衣襯著肌膚如雪蕊连。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天游昼,我揣著相機與錄音甘苍,去河邊找鬼。 笑死烘豌,一個胖子當著我的面吹牛载庭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播廊佩,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼囚聚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了标锄?” 一聲冷哼從身側響起顽铸,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎料皇,沒想到半個月后谓松,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡践剂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年鬼譬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逊脯。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡优质,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出男窟,到底是詐尸還是另有隱情盆赤,我是刑警寧澤贾富,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布歉眷,位于F島的核電站,受9級特大地震影響颤枪,放射性物質發(fā)生泄漏汗捡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扇住。 院中可真熱鬧春缕,春花似錦、人聲如沸艘蹋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽女阀。三九已至宅荤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浸策,已是汗流浹背冯键。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留庸汗,地道東北人惫确。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像蚯舱,于是被迫代替她去往敵國和親改化。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理晓淀,服務發(fā)現(xiàn)所袁,斷路器,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 此刻躺在床上凶掰,洗澡完畢燥爷,回家的感覺實在是太好了。感恩我們順利的回到家懦窘。感恩 感謝一切的美好 感恩早上婆婆做了做了我...
    能量團隊閱讀 170評論 0 0
  • 嘉賓:檢察官前翎、法官、學者畅涂、法科生港华、普通民眾 檢:大家好,我是內(nèi)蒙古通遼市檢察院的一名普通檢察官午衰。我這次春節(jié)前后到內(nèi)...
    翱翔的飛燕閱讀 371評論 0 0
  • 8:00 我起床了立宜,邊“喔喔喔喔”地喊道邊使勁蹬腿踢被子扭扭身子,將火車頭吵醒臊岸〕仁火車頭打戰(zhàn)似的將我伺候好后,還沒...
    月下梨花閱讀 337評論 0 2