SpringBoot之請(qǐng)求攔截

Filter 過濾器

1、編寫過濾器TestFilter 繼承javax.servlet.Filter

@Component
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("加載攔截器");
    }

    /**
    * 過濾后的處理操作
    */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("開始攔截");
        Date startTime = new Date();
        //對(duì)請(qǐng)求進(jìn)行處理
        chain.doFilter(request,response);
        Date endTime = new Date();
        System.out.println("結(jié)束攔截");
        System.out.println("總用時(shí)" + (endTime.getTime() - startTime.getTime()));
    }


    @Override
    public void destroy() {
        System.out.println("銷毀攔截器");
    }
}

注釋:@Component注解把我們寫好的Filter注入到Spring容器中
2、編寫Controller,用于測(cè)試Filter

@RestController        //spring boot注解 @RestController = @Controller + @ResponseBody
@RequestMapping("/test")    //controller請(qǐng)求路徑
public class TestController {
    @GetMapping( "get_user")
    public SR getUser() {
        System.out.println("調(diào)用getUser服務(wù)");
        User user = User.builder()
                .age(16)
//               .name("張三")
                .sex("男")
                .birthday(new Date())
                .build();
        return SR.ok(user);
    }

}

運(yùn)行服務(wù)測(cè)試,訪問剛才寫好的controller



我們的Filter已經(jīng)攔截到了請(qǐng)求。

攔截器 Interceptor

1、編寫攔截器TestInterceptor繼承HandlerInterceptor

@Component
public class TestInterceptor implements HandlerInterceptor {

    /**
     * 進(jìn)入controller方法之前調(diào)用
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        request.setAttribute("startTime",System.currentTimeMillis());
        return true;
    }

    /**
     * controller方法結(jié)束之后調(diào)用如果有controller方法有異常則不會(huì)調(diào)用
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandler");
        System.out.println(System.currentTimeMillis() - (Long)request.getAttribute("startTime")+ "秒");

    }

    /**
     * controller方法之后調(diào)用
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
        System.out.println(System.currentTimeMillis() - (Long)request.getAttribute("startTime")+ "秒");
    }
}

寫完攔截器我們對(duì)他進(jìn)行注冊(cè),讓Springboot能加載到,注冊(cè)類

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private TestInterceptor testInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(testInterceptor);
    }
}

啟動(dòng)服務(wù)訪問接口:


攔截器已經(jīng)成功攔截

下面進(jìn)行postHandler異常測(cè)試
在控制器里隨便拋出一個(gè)異常



結(jié)果:
postHandler沒有

在異常后面我們還會(huì)發(fā)現(xiàn)一組攔截到信息



這時(shí)候我們發(fā)現(xiàn)有postHandler,這是因?yàn)閿r截器會(huì)攔截所有的controller,包括Spring自己的controller,后面就是在出現(xiàn)異常后Spring會(huì)進(jìn)入一個(gè)ErrorController里。這時(shí)候就會(huì)被攔截了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容