攔截器,主要用於攔截前端請求,常用於登錄檢查。
下面是演示使用攔截器攔截未登錄的用戶訪問需要登錄的模塊情景,使用配置方式實現和注解方式實現代碼:
配置方式:
1、web.xml中配置監聽器,對於所有的/admin開頭的請求,都走com.blog.interceptor.LoginInterceptor這個攔截器。
<mvc:interceptors>
<!-- 登錄檢查攔截器 -->
<mvc:interceptor>
<mvc:mapping path="/admin/**" />
<bean class="com.blog.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
2、再看com.blog.interceptor.LoginInterceptor的實現代碼:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
SysUser currentUser = SessionHelper.getCurrentUser(arg0);
if (currentUser == null) {
// 攔截,重定向到登陸頁面
// 需要加上當前請求路徑
arg1.sendRedirect(arg0.getContextPath() + "/Login/loginpage.do");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
}
對於客戶端的每次登錄,都先記錄登錄用戶的用戶名信息,對於每次請求,獲取session中的用戶信息,如果用戶信息為空,則認為該用戶未登錄,則跳轉到登錄頁面。
注解方式:
攔截類是一樣的,只需要增加配置類。
//頁面配置類,不再使用xml配置需要攔截打請求
@Configuration
public class WebMvcConfg extends WebMvcConfigurationSupport {
@Autowired
private LoginInterceptor loginInterceptor;// 需要使用的攔截器,對於所有admin開頭的請求都需要進行登錄攔截
// 攔截器鏈
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用於添加攔截規則
// excludePathPatterns 用於排除攔截
registry.addInterceptor(loginInterceptor).addPathPatterns("/admin/**")
.excludePathPatterns("/admin/**/exportUser","/admin/**/exportAllUser");
}
// 處理靜態資源
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
}
