最近從頭開始用springboot做了一個項目,做到了一個登錄攔截,實現很簡單,記錄一下。
1.註冊攔截器,新建類 MVCConfiguration
@Configuration
@EnableCaching
public class MVCConfiguration implements WebMvcConfigurer {
/*
* 配置攔截器
* */
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加對用戶是否登錄的攔截器,並添加過濾項、排除項
//一開始把用戶登錄功能也給攔截了,跳轉不了
registry.addInterceptor(new UserLoginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/static/*")
.excludePathPatterns("/toLogin")
.excludePathPatterns("/user/verifyUser");
WebMvcConfigurer.super.addInterceptors(registry);
}
/*
* 配置靜態資源
* */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
//設置默認頁面
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/toLogin");
//設置優先級 當請求地址有重複的時候 執行優先級最高的
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
WebMvcConfigurer.super.addViewControllers(registry);
}
}
2.攔截器,實現 UserLoginInterceptor
@Component
public class UserLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession httpSession=request.getSession();
Object userId=httpSession.getAttribute("userId");
if(null!=userId ){
System.out.println("已登錄"+userId);
return true;
}else{
System.out.println("未登錄");
response.sendRedirect(request.getContextPath()+"/toLogin");
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
三個方法:
1.preHandle:在業務處理器處理請求之前被調用。預處理,可以進行編碼、安全控制、權限校驗等處理。
2.postHandle:在業務處理器處理請求執行完成後,生成視圖之前執行。
3.afterCompletion:在DispatcherServlet完全處理完請求後被調用,可用於清理資源等。返回處理(已經渲染了頁面)。