管理員在谷歌瀏覽器上用用戶名和密碼來登錄後來管理系統,進入到後臺頁面(website.html),這個時候如果把main.html頁面的網址複製到其他瀏覽器(比如火狐等),而在其他瀏覽器一樣可以返回website.html,一樣可以進入後臺管理系統,那麼我們之前所做的用戶名和密碼就沒有任何意義了。
登錄攔截器爲了防止這樣的情況發生而產生,兩個步驟:
HandlerInterceptor和繼承類Config,重寫addInterceptors
我們可以把登錄的信息放在登錄session中:這個是登錄功能的代碼,只要用戶登錄,信息就會在session存在。
@PostMapping(value = "/user/login")
public String login(@RequestParam("username") String username,
@RequestParam("password") String password,
Map<String,Object> map, HttpSession session){
if(!StringUtils.isEmpty(username) && "123456789".equals(password)){
//登錄成功,防止表單重複提交,可以重定向到主頁
session.setAttribute("loginUser",username);
return "redirect:/main.html";
}else {
//登錄失敗
map.put("msg","用戶名或密碼錯誤");
return "login";
}
}
HandlerInterceptor類:
導入三個HandlerInterceptor方法後,在preHandle方法:
package com.bootcrud.component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
攔截器的作用就是登陸檢查
*/
public class LoginHandlerInterceptor implements HandlerInterceptor {
//目標方法執行之前
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
Object user = httpServletRequest.getSession().getAttribute("loginUser");
//判斷loginUser是否爲空
if (user == null) {
//未登錄,返回登陸頁面
httpServletRequest.setAttribute("msg", "沒有權限請先登陸");
httpServletRequest.getRequestDispatcher("index.html").forward(httpServletRequest, httpServletResponse);
return false;
} else {
//已登陸,放行請求
return true;
}
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
判斷Session中是否存在loginUser的登錄信息
Object user = httpServletRequest.getSession().getAttribute(“loginUser”);
HandlerInterceptor寫完之後要配置出來,在Config中定製和擴展mvc,在WebMvcConfigurerAdapter中重寫addInterceptors方法,這個方法就是來註冊攔截器的。
//註冊攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// super.addInterceptors(registry);
//添加一個攔截器
//SpringBoot已經做好了靜態資源映射,可以不用來處理靜態資源
//添加一個攔截器
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login");
}
addPathPatterns("/**")是攔截任意多層路徑下的任意請求,但是不是所有請求都攔截,否則連登錄頁面都訪問不到了。
excludePathPatterns是除了括號裏的請求以外的所以請求都攔截。
注意:SpringBoot已經做好了靜態資源映射,可以不用來處理靜態資源
攔截器已經配置好了,重新運行一下項目,在谷歌瀏覽器訪問頁面輸入正確的用戶名和密碼,進入到後臺頁面的時候,再次把wesite.html放到火狐瀏覽器就已經再訪問不到了,因爲我們在火狐瀏覽器中的session沒有website.html的登錄信息。