Filter及Interceptor的不同應(yīng)用場(chǎng)景

1、Filter過(guò)濾器 與 Interceptor攔截器 的區(qū)別
1.Filter是Servlet支持的,Interceptor是SpringMVC自己實(shí)現(xiàn)的
2.Filter對(duì)所有請(qǐng)求起作用,Intercptor可以設(shè)置攔截規(guī)則(只對(duì)經(jīng)過(guò)DispatchServlet的請(qǐng)求起作用)
3.Filter只能拿到request和response,interceptor可以拿到整個(gè)請(qǐng)求上下文(包括request和response)
4.Filter基于函數(shù)回調(diào)瓣颅,Interceptor 基于反射AOP

2、優(yōu)先級(jí)問(wèn)題
1.Filter優(yōu)先于Interceptor
2.Filter可以指定不同F(xiàn)ilter的順序轿曙,Interceptor可以指定不同Interceptor的順序

image.png

3弄捕、應(yīng)用場(chǎng)景
Filter:記錄各個(gè)url的訪問(wèn)qps、插入數(shù)據(jù)到ThreadLocal供后續(xù)使用
Interceptor:token校驗(yàn)导帝,sign校驗(yàn)守谓,封禁校驗(yàn)等等

4、Filter代碼
1.寫(xiě)具體實(shí)現(xiàn)
2.注冊(cè)

import java.io.IOException;
import java.time.LocalDateTime;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class TimeLogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("TimeLogFilter init,"+LocalDateTime.now());
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        long start = System.currentTimeMillis();
        filterChain.doFilter(servletRequest,servletResponse);
        long end = System.currentTimeMillis();
        long time = end - start;
        String url = ((HttpServletRequest)servletRequest).getServletPath();
        System.out.println("TimeLogFilter."+time+","+url);
    }
 
    @Override
    public void destroy() {
 
    }
}

/* 注冊(cè) */
@Bean
public FilterRegistrationBean registFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new TimeLogFilter());
        registration.addUrlPatterns("/*");
        registration.setName("TimeLogFilter");
        registration.setOrder(1);
        return registration;
    }   

5您单、Interceptor代碼
1.寫(xiě)具體實(shí)現(xiàn)
2.注冊(cè)


@Order(TOKEN)
@Component
public class TokenInterceptor extends CommonInterceptor implements HandlerInterceptor {

    private static Logger logger = LoggerFactory.getLogger(TokenInterceptor.class);

    @Autowired
    TokenManager tokenManager;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try{
            if(gray(request)){
                return true;
            }

            long kugouId = Long.parseLong(request.getParameter("std_kid"));
            int appid = Integer.parseInt(request.getParameter("appid"));
            String token = request.getParameter("token");
            if(tokenManager.checkToken(kugouId,appid,token,request)){
                return true;
            }

        }catch (Exception e){
            logger.error("TokenInterceptor err");
        }

        //err
        returnJson(response);
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }

    private void returnJson(HttpServletResponse response){
        PrintWriter writer = null;
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        try {
            writer = response.getWriter();
            writer.print(ApplicationResponse.failure(TOKEN_ERR.code(),TOKEN_ERR.message()).toJsonString());
        } catch (IOException e){
            logger.error("TokenInterceptor returnJson err");
        } finally {
            if(writer != null){
                writer.close();
            }
        }
    }

    @Override
    protected boolean gray(HttpServletRequest request) {
        return checkMethod(request);
    }
}


/*注冊(cè)*/


@Configuration
public class WebConfigurer implements WebMvcConfigurer {

    /**
     * 攔截器Order
     */
    public static final int SIGN = 1;
    public static final int TOKEN = 2;
    public static final int BAN = 3;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 攔截所有請(qǐng)求
        registry.addInterceptor(BanInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(SignInterceptor()).addPathPatterns("/**");
        registry.addInterceptor(TokenInterceptor()).addPathPatterns("/**");
    }

...

    @Bean
    public BanInterceptor BanInterceptor() {
         return new BanInterceptor();
     }
     
    @Bean
    public SignInterceptor SignInterceptor() {
         return new SignInterceptor();
     }

    @Bean
    public TokenInterceptor TokenInterceptor() {
        return new TokenInterceptor();
    }
}



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斋荞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虐秦,更是在濱河造成了極大的恐慌平酿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦陋,死亡現(xiàn)場(chǎng)離奇詭異蜈彼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)俺驶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門幸逆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事还绘〕眩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵拍顷,是天一觀的道長(zhǎng)抚太。 經(jīng)常有香客問(wèn)我,道長(zhǎng)昔案,這世上最難降的妖魔是什么尿贫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮爱沟,結(jié)果婚禮上帅霜,老公的妹妹穿的比我還像新娘。我一直安慰自己呼伸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布钝尸。 她就那樣靜靜地躺著括享,像睡著了一般。 火紅的嫁衣襯著肌膚如雪珍促。 梳的紋絲不亂的頭發(fā)上铃辖,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音猪叙,去河邊找鬼娇斩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛穴翩,可吹牛的內(nèi)容都是我干的犬第。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芒帕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼歉嗓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起背蟆,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鉴分,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后带膀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體志珍,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年垛叨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伦糯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舔株,靈堂內(nèi)的尸體忽然破棺而出莺琳,到底是詐尸還是另有隱情,我是刑警寧澤载慈,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布惭等,位于F島的核電站,受9級(jí)特大地震影響办铡,放射性物質(zhì)發(fā)生泄漏辞做。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一寡具、第九天 我趴在偏房一處隱蔽的房頂上張望秤茅。 院中可真熱鬧,春花似錦童叠、人聲如沸框喳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)五垮。三九已至,卻和暖如春杜秸,著一層夾襖步出監(jiān)牢的瞬間放仗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工撬碟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诞挨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓呢蛤,卻偏偏與公主長(zhǎng)得像惶傻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子顾稀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355