用户登录优化-拦截器
拦截器
首先将所有的请求统一拦截到拦截器中,可以在拦截器中来定义过滤规则,如果不满足系统设置的过滤规则,统一的处理是重新去打开login.html页面(重定向和转发),推荐使用重定向。
在springboot中拦截器的定义和使用。拦截器 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
HandlerInterceptor
1.1 preHandle()方法
该方法将在请求处理之前被调用。SpringMVC中的Interceptor是链式的调用,在一个应用或一个请求中可以同时存在多个Interceptor。每Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle()方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值类型,当返回false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值true时,就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor的时,就会调用当前请求的Controller方法。
1.2 postHandle()方法
该方法将在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。postHandle方法被调用的方向跟preHandle是相反的,也就是说先声明
的Interceptor的postHandle方法反而会后执行。如果当前Interceptor的preHandle()方法返回值为false,则此方法不会被调用。
1.3 afterCompletion()方法
该方法将在整个当前请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作。如果当前Interceptor的preHandle()方法返回值为false,则此方法不会被调用。
1、声明一个自定义拦截器实现HandlerInterceptor 接口
package com.cy.store.intercepor; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //定义一个拦截器 public class LoginInterceptor implements HandlerInterceptor { /** * 检测全局session对象中是否有uid数据,如果有,则放行,没有的话重定向到登录页面 * @param request 请求对象 * @param response 响应对象 * @param handler 处理器 * @return 返回值为true,放行。若false表示拦截 * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //HttpServletRequest来获取session对象 Object obj = request.getSession().getAttribute("uid"); if (obj == null){ response.sendRedirect("/web/login.html"); //结束后续的调用 return false; } return true;//放行 } }
2、注册过滤器:添加白名单(哪些资源可以在不登录的情况下访问:)、黑名单(用户登录状态下才能访问)
3、注册过滤器技术:WebMvcConfigurer接口
可以将用户定义的拦截器进行注册,才可以保证拦截器能够生效。定义一个类,然后实现这个接口。配置信息建议存放在项目的config下
addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例 addPathPatterns:用于设置拦截器的过滤路径规则,addPathPatterns(“/**”)对所有请求都拦截 excludePathPatterns:用于设置不需要拦截的过滤规则
package com.cy.store.config; import com.cy.store.intercepor.LoginInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.ArrayList; import java.util.List; @Configuration public class LoginInterceptorConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //创建自定义的拦截对象 LoginInterceptor interceptor = new LoginInterceptor(); //配置白名单 Listpatterns = 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"); patterns.add("/districts/**"); patterns.add("/products/**"); registry.addInterceptor(interceptor)//完成拦截器注册 .addPathPatterns("、**") .excludePathPatterns(patterns);//是个集合,需要创建一个,白名单 } }