当在未登录的时候,不希望用户访问别的页面,这时候拦截器就可以阻止用户的操作行为,首先,创建拦截器:
/**
* 登录拦截器
*
* @author sxyuser
*/
@Component
public class LoginHandlerInterceptor implements HandlerInterceptor {
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("执行了TestInterceptor的preHandle方法");
//统一拦截(查询当前session是否存在user)(这里user会在每次登陆成功后,写入session)
Object user = request.getSession().getAttribute("currentUser");
if (user == null) {
try {
response.sendRedirect(request.getContextPath() + "/login");
} catch (IOException e) {
e.printStackTrace();
}
return false;
}else {
//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
return true;
//如果设置为true时,请求将会继续执行后面的操作
}
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
}
/**
* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
}
}
拦截器创建成功后需要注册拦截器:
/**
* 注册拦截器
*
* @author sxyuser
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
/**
* 添加主页方法
*
* @param registry 主页注册器
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
System.out.println("设置了主页");
//设置主页
registry.addViewController("/").setViewName("login");
registry.addViewController("/login").setViewName("login");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}
/**
* 添加静态资源文件,外部可以直接访问地址
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//需要配置1:----------- 需要告知系统,这是要被当成静态文件的!
//第一个方法设置访问路径前缀,第二个方法设置资源路径
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
/** 表示拦截所有路径下的所有请求
注册TestInterceptor拦截器
**/
InterceptorRegistration registration = registry.addInterceptor(new LoginHandlerInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns( //添加不拦截路径
"/login",
"/user/login",//登录
"/css/**",
"/","/js/**","/fonts/**","/images/**","/lib/**",
"/webjars/**","/error/**"
,"/h-ui/**","/h-ui.admin/**","/temp/**"
);
}
}
在登录的时候将登录的信息存放到Session中,需要和拦截器中的获取Session值得变量名相同,如果获取的值不为空则放行拦截,如果为空将阻止用户的操作并跳转到登录页面。