源码解析
public interface HandlerInterceptor {
//表示在所有请求之前完成的拦截,一般使用居多
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
//表示请求之后,返回值返回到视图解析器时,完成拦截功能
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
//表示在DispatcherServlet进行视图的渲染之后,多用于资源的回收
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
Springboot项目使用拦截器步骤:
1.定义一个拦截类,实现handlerInteceptor接口,重写相应的拦截方法。
/**
* 用于拦截有些页面只有在登录的情况下才可以访问
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 用于拦截登录之后才可以访问的资源页面
* @param request
* @param response
* @param handler
* @return 返回一个boolean值
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//1.获取到登录时session中的数据
Object obj = request.getSession().getAttribute("Uid");
//2.判断session中存不存在数据,不存在数据说明用户并未登录
if(obj == null){
//2.1如果用户没有登录,则需要重定向到login.html页面
response.sendRedirect("/web/login.html");
return false;
}
//3.如果if语句并没有执行,则放行
return true;
}
}
2.注册过滤器分析:
2.1白名单:
白名单是指在用户不登陆的情况下,就可以访问的页面资源,比如:login.html\register.html\index.html\/users/register等
2.2黑名单:
黑名单是指在用户登录的情况下才可以进行访问的页面资源。比如:password.html等
3.注册过滤器的技术:
借助WebMvcConfigurer接口,可以将用户定义的拦截器进行注册,才能够保证拦截器能够生效和使用。
/**
* 用于完成拦截器的注册
*/
@Configuration
public class LoginInterceptorConfig implements WebMvcConfigurer {
//用于注册拦截器的方法
public void addInterceptors(InterceptorRegistry registry) {
//1.创捷拦截器对象
LoginInterceptor interceptor =new LoginInterceptor();
//2.定义一个集合,用来存储将不进行过滤的资源
List<String> list=new ArrayList<String>();
list.add("/bootstrap3/**");
list.add("/css/**");
list.add("/images/**");
list.add("/js/**");
list.add("/web/login.html");
list.add("/web/register.html");
list.add("/index.html");
list.add("/web/product.html");
list.add("/users/login");
list.add("/users/register");
registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns(list);
}
}