首先,瞭解一下攔截器的作用,他是用來做登錄檢查的,也就是沒有前邊的登錄,就不可以訪問後邊的頁面
1. 先添加一個攔截器,我們新建一個登錄的攔截器在component包下,名字就叫 LoginHandlerInterceptor (實現接口HandlerInterceptor),IDEA編譯器,我們按ctrl+O,把需要用到的三個接口都拉出來,然後開始編寫:
/**
* 攔截器,登錄檢查
*/
public class LoginHandlerInterceptor implements HandlerInterceptor {
// 目標方法執行之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("loginUser");
// 如果獲取的request的session中的loginUser參數爲空(未登錄),就返回登錄頁,否則放行訪問
if (user == null) {
// 未登錄,給出錯誤信息,
request.setAttribute("msg","無權限請先登錄");
// 獲取request返回頁面到登錄頁
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
} else {
// 已登錄,放行
return true;
}
}
@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 {
}
}
2. 上邊配置的session需要取值才能做判斷,那麼我們需要在controller中設置這個session值,以讓它生效:
3. 之前說過,要讓登錄有個攔截器的功能,就是除了訪問首頁我們可以,其他未登錄的都攔截下來,所以,需要在MyMvcConfig中添加一個攔截器,讓上邊的配置都有作用:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 註冊攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加攔截的請求,並排除幾個不攔截的請求
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html", "/", "/user/login");
}
}