问题分析:
当我在写项目的时候,发现一些页面访问的问题,项目中很多操作都是需要先登录才可以执行的,如果在每个请求处理之前都编写代码检查Session中有没有登录信息,是不现实的。所以应使用拦截器解决该问题。
实现代码:
/*表示定义一个拦截器*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 检测全局session对象中是否有uid数据,如果有则放行,如果没有重定向到登录
* @param request 请求对象;
* @param response 响应对象;
* @param handler 处理器(url+Conroller:映射);
* @return 如果返回值为true表示放行当前的请求,如果返回值为false则表示拦截当前的请求;
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
//HttpSercletRequest对象来获取session对象;
Object obj = request.getSession().getAttribute("uid");
if (obj == null){
//说明用户没有登陆过系统,则重定向到login.html页面
response.sendRedirect("/web/login.html");
//结束后续的调用;
return false;
}
//请求放行;
return true;
}
}
然后从新定义一个类完成处理器、拦截器的注册
/*完成处理器,拦截器的注册*/
@Configuration //加载当前的拦截器
public class LoginInterceptorConfigurer implements WebMvcConfigurer {
//配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//创建自定义的拦截器对象;
HandlerInterceptor interceptor = new LoginInterceptor();
//配置白名单:存放在一个List集合;
List<String> patterns = new ArrayList<>();
//这些是我项目所需的地址,根据个人项目而写;
patterns.add("/bootstrap3/**");
patterns.add("/css/**");
patterns.add("/images/**");
patterns.add("/js/**");
patterns.add("/web/register.html");
patterns.add("/web/login.html");
patterns.add("/web/index.html");
patterns.add("/web/product.html");
patterns.add("/users/reg");
patterns.add("/users/login");
//完成了拦截器的注册;
registry.addInterceptor(interceptor)
.addPathPatterns("/**")
.excludePathPatterns(patterns);//要拦截的url是什么?
}
}
不要忘记添加@Configuration注解。