在Spring+Spring MVC+Mybatis中,也就是SSM框架中,我们得自定义拦截器是在springmvc-servlet.xml中配置拦截器,而SpringBoot是舍去了许多配置文件,以代码代替配置文件,在配置的时候我们需要用到@Configuration这个注解,这个注解是将这个类注册成为一个Beans,虽然说springboot得大部分配置都可以通过properties或者yml文件去配置,但是有一些还是需要使用@Configuration去写,就比如我们今天要写的拦截器WebMvcConfiguerAdapter,首先我们看一下SSM得拦截器是如何配置,如下:
在springMvc-servlet.xml文件当中配置:
<!-- 配置自定义拦截器,用于当在系统中注销退出后,的非法访问-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/dev/**"/>
<bean class="cn.appsys.interceptor.SysInterceptor"></bean>
</mvc:interceptor>
<!--拦截后台非法访问-->
<mvc:interceptor>
<mvc:mapping path="/backend/**"/>
<bean class="cn.appsys.interceptor.BackInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
这个时候我们可以清楚得看到,这里拦截2种请求,一种是/dev/**,一种是/backend/**,都分发到不同得处理类当中,这个也就是前台后台得账号处理【判断登陆,这个时候我们看一下2个处理类.
public class BackInterceptor extends HandlerInterceptorAdapter {
private Logger logger = Logger.getLogger(BackInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("SysInterceptor preHandle");
HttpSession session = request.getSession();
BackendUser devUser = (BackendUser) session.getAttribute(Constants.Back_SESSION);
if (null == devUser) {
String ss = request.getContextPath() + "/403.jsp";
response.sendRedirect(request.getContextPath() + "/403.jsp");
return false;
}
return true;
}
}
public class SysInterceptor extends HandlerInterceptorAdapter {
private Logger logger = Logger.getLogger(SysInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("SysInterceptor preHandle");
HttpSession session = request.getSession();
DevUser devUser = (DevUser) session.getAttribute(Constants.USER_SESSION);
if (null == devUser) {
String ss = request.getContextPath() + "/403.jsp";
response.sendRedirect(request.getContextPath() + "/403.jsp");
return false;
}
return true;
}
}
这个时候看到了,都是通过继承HandlerInterceptorAdapter类重写preHandle类去处理拦截请求,这个时候想一下,springboot得拦截器不再配置文件当中配置,而是使用@Configuration注解去将类注册为拦截器,该如何写?
之前说过,@Configuration是将类注册为Beans,也就是注册为一个配置文件得节点,通过springboot启动扫描注册,如下:
import cn.appsys.interceptor.BackInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class BackConfig extends WebMvcConfigurerAdapter {
//后台拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
/*addPathPatterns 用于添加拦截规则
excludePathPatterns 用户排除拦截*/
registry.addInterceptor(new BackInterceptor()).addPathPatterns("/backend/**")
.excludePathPatterns("/index.html", "/", "/user/login");
}
}
这个时候可以清楚得看到在类上使用了@Configuration,这个时候我们看到了这个类是不是继承了WebMvcConfigurerAdapter,
在文章的开头就说过springboot得配置文件虽然可以配置大多数得文件资源,但是还是有一部分需要通过@Configuration注解去注册,我们继承了WebMvcConfigurerAdapter之后这个重写得addInterceptors方法得意思是,在Controller控制层之前进行调用,我们得项目是否是需要通过Controller控制层去处理任何请求?跟初学者得servlet的一样,都是用来处理各种请求的。addInterceptor方法就是在Controller调用之前进行处理,在调用之前,我们对指定的路径进行拦截,拦截网址请求为/backend/**后的所有请求,但不包括/index.html,/,/user/login/,这三个请求一看就一目了然,初始欢迎页,登陆请求页面,项目根路径.当拦截到为/backend/**的请求之后发送到new BackInterceptor()这个类当中进行请求处理,如下:
public class BackInterceptor extends HandlerInterceptorAdapter {
private Logger logger = Logger.getLogger(BackInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.debug("SysInterceptor preHandle");
HttpSession session = request.getSession();
BackendUser devUser = (BackendUser) session.getAttribute(Constants.Back_SESSION);
if (null == devUser) {
String ss = request.getContextPath() + "/403.jsp";
response.sendRedirect(request.getContextPath() + "/403.jsp");
return false;
}
return true;
}
}
这个时候可以看到,这个类是否很熟悉?对了,跟springmvc-servlet.xml配置的拦截器的处理类几乎是一模一样,实现账号的获取判断是否登陆,
这个就是springboot的一个自定义拦截器
需要多少个就创建多少个这样的类去注册为Beans拦截