SpringBoot之HandlerInterceptor攔截器的使用


HandlerInterceptor簡介

 

java里的攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發者在一個Action執行的前后執行一段代碼,也可以在一個Action 執行前阻止其執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。

1、定義實現類

定義一個Interceptor 非常簡單方式也有幾種,我這里簡單列舉兩種
1、類要實現Spring 的HandlerInterceptor 接口
2、類繼承實現了HandlerInterceptor 接口的類,例如 已經提供的實現了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter
我這里使用第一種方式

2、HandlerInterceptor方法介紹

boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception; void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
  1. preHandle:在業務處理器處理請求之前被調用。預處理,可以進行編碼、安全控制、權限校驗等處理;
  2. postHandle:在業務處理器處理請求執行完成后,生成視圖之前執行。后處理(調用了Service並返回ModelAndView,但未進行頁面渲染),有機會修改ModelAndView (這個博主就基本不怎么用了);
  3. afterCompletion:在DispatcherServlet完全處理完請求后被調用,可用於清理資源等。返回處理(已經渲染了頁面)

接下來讓我們來實現簡單的登錄攔截器吧

3、攔截器實現

  • 新建 LoginInterceptor 實現  HandlerInterceptor接口
public class LoginInterceptor implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		Object obj = request.getSession().getAttribute("loginUser");//(你的用戶信息session)
		// 如果user不為空則放行
		if (null != obj) {
			return true;
		}
		// 否則攔截並跳轉到登錄
		response.sendRedirect("/admin/login");
		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 {
	}
  • 新建WebAppConfigurer 實現WebMvcConfigurer接口
public class WebAppConfigurer implements WebMvcConfigurer {
	@Autowired
	private LoginInterceptor loginAuthenticator;

	/**
	 * 注冊攔截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {

		registry.addInterceptor(loginAuthenticator).addPathPatterns("/admin/**")
                                .excludePathPatterns("/admin/login")
				.excludePathPatterns("/admin/getLogin");
    //  - /**: 匹配所有路徑
    //  - /admin/**:匹配 /admin/ 下的所有路徑
    //  - /admin/*:只匹配 /admin/login,不匹配 /secure/login/tologin ("/*"只匹配一級子目錄,"/**"匹配所有子目錄)
}
     .......//其實下面還有很多方法我這里就省略了,過濾器可以添加多個。
}

  

 

其實以前都是繼承WebMvcConfigurerAdapter類 不過springBoot2.0以上 WebMvcConfigurerAdapter 方法過時,有兩種替代方案:
1、繼承WebMvcConfigurationSupport
2、實現WebMvcConfigurer
但是繼承WebMvcConfigurationSupport會讓Spring-boot對mvc的自動配置失效。根據項目情況選擇。現在大多數項目是前后端分離,並沒有對靜態資源有自動配置的需求所以繼承WebMvcConfigurationSupport也未嘗不可。

 


免責聲明!

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



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