SpringBoot 中攔截器的簡介及使用方式


攔截器簡介

  • 攔截器通常通過動態代理的方式來執行。
  • 攔截器的生命周期由IoC容器管理,可以通過注入等方式來獲取其他Bean的實例,使用更方便。

攔截器配置使用方式

實現攔截器接口:

import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

private class AuthenticationInterceptor implements HandlerInterceptor {
	// 在請求處理之前進行調用(Controller方法調用之前)
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException{
    	System.out.println(request.getRequestURL());
    	User user = (User)request.getSession().getAttribute("USER");
        if(user != null){
        	return true;
        }else {
        	System.out.println("no login...");
        	// request.getRequestDispatcher("/index.html").forward(request, response);
        	response.sendRedirect(request.getContextPath()+"login.html");
        	return false;
        }
        return false;
    }
    
    // 在請求處理之后視圖被渲染之前進行調用(Controller方法調用之后)
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("postHandle...");
    }

	// 在請求結束之后、也就是視圖被渲染之后進行調用(主要是用於進行資源清理工作)
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("afterCompletion...");
    }
}

將攔截器加入到配置中:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebSecurityConfig implements WebMvcConfigurer{
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new AuthenticationInterceptor())
        		//所有路徑都被攔截
        		.addPathPatterns("/**")
        		//添加不攔截的路徑
        		.excludePathPatterns("/userLogin", "/css/**", "/images/**", "/js/**", "/login.html");
        registry.addInterceptor(new OtherInterceptor())
                .addPathPatterns("/**");
    }
}

備注:

由於 preHandle、postHandle、afterCompletion 是不同的方法,如果在這些方法之間使用共享變量來儲存值,會存在線程安全問題。而使用過濾器實現則不存在此問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM