真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

攔截器一二三

1.實(shí)現(xiàn)攔截器

1.寫一個(gè)攔截器

創(chuàng)新互聯(lián)公司專注于武侯網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供武侯營銷型網(wǎng)站建設(shè),武侯網(wǎng)站制作、武侯網(wǎng)頁設(shè)計(jì)、武侯網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造武侯網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供武侯網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

繼承HandlerInterceptor

preHandle:

  • 調(diào)用時(shí)間: Controller方法處理之前【也就是路徑跳轉(zhuǎn)之前】;

  • 執(zhí)行順序: 鏈?zhǔn)絀ntercepter情況下,Intercepter按照聲明的順序一個(gè)接一個(gè)執(zhí)行;

  • 返回值: 返回值為true,則繼續(xù)執(zhí)行,false中斷執(zhí)行,生成時(shí)默認(rèn)false;

  • 應(yīng)用場(chǎng)景:登陸驗(yàn)證之類的

postHandle:

  • 調(diào)用前提: preHandle返回true;

  • 調(diào)用時(shí)間: Controller方法處理完之后,DispatcherServlet進(jìn)行視圖的渲染之前,也就是說在這個(gè)方法中你可以對(duì)ModelAndView進(jìn)行操作

  • 執(zhí)行順序: 鏈?zhǔn)絀ntercepter情況下,Intercepter按照聲明的順序倒著執(zhí)行。

  • 備注: postHandle雖然post打頭,但post、get方法都能處理

afterCompletion:

  • 調(diào)用前提:preHandle返回true

  • 調(diào)用時(shí)間:DispatcherServlet進(jìn)行視圖的渲染之后

  • 應(yīng)用場(chǎng)景:多用于清理資源,統(tǒng)一日志處理,統(tǒng)一異常處理

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //獲取session
        HttpSession session = request.getSession();
        //獲取session中的用戶
        UserDTO user = (UserDTO) session.getAttribute("user");
        //判斷用戶是否存在
        if(user == null){
            //不存在并;攔截
            response.setStatus(401);
            return false;
        }
        //存在,保存用戶到TheadLocal放行
        UserHolder.saveUser(user);
        return true;
    }

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

2.開啟攔截器

WebMvcConfigurer

order:決定攔截器執(zhí)行的順序

初始值都為0,不設(shè)置按照添加順序執(zhí)行

添加后,最先執(zhí)行的是order(0)

@Configuration
public class MVCConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(new LoginInterceptor())
               .excludePathPatterns("/user/code",
                       "/user/login",
                       "/shop/**",
                       "/upload/**",
                       "/shop-type/**",
                       "/shop/**",
                       "/blog/hot",
                       "/voucher/**",
                       "/user/me"
               ).order(1);}
}

2.攔截器類型(有待考證)

HandlerInterceptor類: 三個(gè)方法都必須繼承

public interface HandlerInterceptor {
    boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception;

    void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

    void afterCompletion(
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;
}

多個(gè)攔截器的執(zhí)行順序:

HandlerInterceptorAdapter類:可以選擇性繼承三個(gè)方法中的一個(gè)

public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {  
     //選擇需要的方法 
}  

3.攔截器和spring容器的先后執(zhí)行順序

4.過濾器和攔截器的區(qū)別

原文鏈接:https://blog.csdn.net/nigulasizp/article/details/125322507

1、實(shí)現(xiàn)原理不同 過濾器和攔截器底層實(shí)現(xiàn)方式大不相同,過濾器 是基于函數(shù)回調(diào)的,攔截器 則是基于Java的反射機(jī)制(動(dòng)態(tài)代理)實(shí)現(xiàn)的。

2、使用范圍不同 我們看到過濾器 實(shí)現(xiàn)的是 javax.servlet.Filter 接口,而這個(gè)接口是在Servlet規(guī)范中定義的,也就是說過濾器Filter 的使用要依賴于Tomcat等容器,導(dǎo)致它只能在web程序中使用。 而攔截器(Interceptor) 它是一個(gè)Spring組件,并由Spring容器管理,并不依賴Tomcat等容器,是可以單獨(dú)使用的。不僅能應(yīng)用在web程序中,也可以用于Application、Swing等程序中。

3、觸發(fā)時(shí)機(jī)不同 過濾器Filter是在請(qǐng)求進(jìn)入容器后,但在進(jìn)入servlet之前進(jìn)行預(yù)處理,請(qǐng)求結(jié)束是在servlet處理完以后。攔截器 Interceptor 是在請(qǐng)求進(jìn)入servlet后,在進(jìn)入Controller之前進(jìn)行預(yù)處理的,Controller 中渲染了對(duì)應(yīng)的視圖之后請(qǐng)求結(jié)束。

4、攔截的請(qǐng)求范圍不同 過濾器Filter執(zhí)行了兩次,攔截器Interceptor只執(zhí)行了一次。這是因?yàn)檫^濾器幾乎可以對(duì)所有進(jìn)入容器的請(qǐng)求起作用,而攔截器只會(huì)對(duì)Controller中請(qǐng)求或訪問static目錄下的資源請(qǐng)求起作用。

5、注入Bean情況不同 這是因?yàn)榧虞d順序?qū)е碌膯栴},攔截器加載的時(shí)間點(diǎn)在springcontext之前,而Bean又是由spring進(jìn)行管理。(所以攔截器中注入不了Bean)

6、控制執(zhí)行順序不同 過濾器用@Order注解控制執(zhí)行順序,通過@Order控制過濾器的級(jí)別,值越小級(jí)別越高越先執(zhí)行。 攔截器默認(rèn)的執(zhí)行順序,就是它的注冊(cè)順序,也可以通過Order手動(dòng)設(shè)置控制,值越小越先執(zhí)行

Filter的執(zhí)行順序在Interceptor之前,具體的流程見下圖

5.攔截器的原理

攔截器Interceptor 的攔截功能是基于Java的反射機(jī)制(動(dòng)態(tài)代理)實(shí)現(xiàn)的。

原文地址:http://hzhcontrols.com/new-1239027.html


本文標(biāo)題:攔截器一二三
網(wǎng)站網(wǎng)址:http://weahome.cn/article/dsoiogh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部