通过拦截器来实现用户的登录页面和公开页面的访问,这里使用到了用户登录用将用户的id存储在session中,如果检测不到,就返回登录页面,否则就可以正常访问。实现的代码如下:
一、首先定义一个类,去实现HandlerInterceptor。重新里面的preHandle方法。
/**
* 定义拦截器
* 要起作用,需要两步:
* 1、拦截器的定义: 去实现一个接口 HandlerInterceptor,下面的代码就是
* 2、配置(注册)拦截器:添加白名单和黑名单: 需要在spring-mvc.xml或者WebMvcConfigure接口中进行注册,才能保证拦截器起作用。
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 这里我们只使用preHandle,如果返回true则放行,否则阻止
* @param request 请求对象
* @param response 响应对象
* @param handler 被调用的处理器对象,本质上是一个方法对象,对反射中的Method对象进行了再包装
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
Object uid = request.getSession().getAttribute("uid");
if(uid == 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/index.html");
patterns.add("/web/login.html");
patterns.add("/web/register.html");
patterns.add("/web/product.html");
patterns.add("/users/reg");
patterns.add("/users/login");
patterns.add("/districts/**");
patterns.add("/products/**");
//完成自定义拦截器的注册,并完成配置
registry.addInterceptor(interceptor)
.addPathPatterns("/**") //要拦截的url地址
.excludePathPatterns(patterns); //不进行拦截的url地址
}
}
目录结构: