Spring Boot學習筆記(8)—— SpringBoot自定義攔截器

攔截器在實際項目開發中很重要,下面以登錄攔截器爲例,要用戶登錄才能訪問系統中的請求
1、自定義一個攔截器 LoginHandlerInterceptor,實現 HandlerInterceptor接口,重寫裏面的 preHandle方法:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;

public class LoginHandlerInterceptor implements HandlerInterceptor{

	/**
	 * 重新調用目標請求前的攔截方法
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		//判斷session中是否有用戶信息
		Object loginUser = request.getSession().getAttribute("loginUser");
		if(loginUser != null) {
			//已經登錄,不進行攔截,放行
			return true;
		}
		
		//未登錄,進行攔截,跳轉到登錄頁面,並且在 request 中攜帶錯誤信息
		request.setAttribute("msg", "無權限,請先登錄!");
		//通過服務器轉發到登錄頁面,這裏不是使用重定向,因爲要通過request攜帶錯誤信息,index.html 就是之前自定義的視圖,用於跳轉到登錄頁面的請求
		request.getRequestDispatcher("/index.html").forward(request, response);
		return false;
	}
}

2、自定義攔截器之後,要將攔截器加入到web容器中,可以通過自定以的 webMvc配置類,來向springboot注入一個 WebMvcConfigurer 組件,在組件中將攔截器加入進去

/**
 * 聲明這個類是一個配置類
 * @author asong
 *
 */
@Configuration
public class MySpringMvcConfigurer {

	/**
	 * 向 spring容器中注入一個組件,組件的類型是 WebMvcConfigurer,組件的id是 webMvcConfigurer
	 * 可以通過這個自定義的webMvc組件,向容器中添加webmvc控制,比如添加視圖控制,添加攔截器等等
	 * @return
	 */
	@Bean
	public WebMvcConfigurer webMvcConfigurer() {
		return new WebMvcConfigurer() {
			
			/**
			 * 添加一個自定義的視圖控制,用於訪問 springboot 項目的默認首頁
			 */
			@Override
			public void addViewControllers(ViewControllerRegistry registry) {
				registry.addViewController("/").setViewName("main/login");
				registry.addViewController("/index.html").setViewName("main/login");
				registry.addViewController("/main.html").setViewName("main/index");
			}

			
			/**
			 * 將自定義的攔截器,通過webmvc組件添加到容器中,
			 * 注意,這裏添加攔截器也和 web項目增加過濾器一樣,存在先後順序之分
			 */
			@Override
			public void addInterceptors(InterceptorRegistry registry) {
				//將自定義的登錄攔截器添加到容器中
				registry.addInterceptor(new LoginHandlerInterceptor())
					//攔截所有的請求 /**
					.addPathPatterns("/**")
					//排除不需要攔截的請求,這裏是:去登錄頁面的請求、登錄表單提交請求
					.excludePathPatterns("/", "/index.html", "/login")
					//springboot2 版本之後,需要在攔截器中排除靜態資源路徑,否則靜態資源會被攔截
					.excludePathPatterns("/css/**", "/js/**", "/img/**");
			}
			
		};
	}
}

3、登錄請求的Controller

/**
* 登錄請求
 * @param username
 * @param password
 * @param request
 * @return
 */
@PostMapping("/login")
public String login(String username, String password, HttpServletRequest request, Model model) {
	
	if(!StringUtils.isEmpty(username) && "123".equals(password)) {
		//用戶名不爲空,且密碼是 123 則表示登錄成功
		
		//登錄成功,用戶信息存入session
		request.getSession().setAttribute("loginUser", username);
		
		//防止表單重複提交,這裏登錄成功之後,重定向到主頁,但是這裏重定向表示的還是一個請求,一個url,所以需要自定義個一個視圖,來表示 /main.html 請求跳轉到 主頁
		return "redirect:/main.html";
	}
	
	//登錄失敗,返回登錄頁面
	model.addAttribute("msg", "用戶名或密碼錯誤!");
	return "main/login";
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章