登錄驗證攔截是攔截器比較常用的場景之一。我們想做到對未登錄的用戶進行攔截,禁止其訪問其他頁面同時跳轉到登錄頁面,那麼就需要使用攔截器了。當然你也可以使用比較成熟的框架,比如Shiro就是比較優秀的,但是我們自己如何實現這個功能呢,下面通過配置自定義的攔截器實現,順便學習一下攔截器。
1、登錄Controller的實現
我們這裏只簡單的模擬場景。
@Controller
public class AuthController {
@GetMapping("/login")
public String login(){
return "login";
}
@PostMapping("/login")
public String login(String username, String password, HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("token", "authorized"); //對於登錄的用戶在session中添加登錄標記
return "login";
}
}
2、配置攔截規則
由於我們用的SpringBoot版本較高,HandlerInterceptor
已經實現了所有方法,所以我們這裏只實現這個訪問前的方法即可。
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle");
HttpSession session = request.getSession();
if ("authorized"!=session.getAttribute("token")) { //校驗登錄標記
request.getRequestDispatcher("/login").forward(request, response); //對於未登錄的用戶跳轉到登錄頁面
return false;
}
return true;
}
}
3、配置WebMvcConfigurer攔截器
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login") //過濾掉登錄頁面
.excludePathPatterns("/static/**"); //過濾掉靜態資源
}
}
通過上面簡單的配置一個自定義的登錄驗證的攔截器就實現了。