攔截器在實際項目開發中很重要,下面以登錄攔截器爲例,要用戶登錄才能訪問系統中的請求
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";
}