创建拦截器,并且配置拦截器,一共只有三步骤,并且非常简单
- 创建自定义的拦截器
- 注入到spring容器中
- 配置拦截器拦截的路径
1.创建自定义的拦截器
创建一个类,实现HandlerInterceptor接口,它就是自定义的拦截器类
/*拦截器顾名思义,就是用来拦截Controller的请求的*/
public class LoginInterceptor implements HandlerInterceptor {
/*在Controller之前执行*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
System.out.println("LoginInterceptor --- > preHandle");
//false : 拦截Controller,Controller将不执行
//true : 放行,继续执行Controller
return true;
}
//在Controller之后执行
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("LoginInterceptor --- > postHandle");
}
//渲染视图以后执行
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("LoginInterceptor --- > afterCompletion");
}
}
有时候大家看到别人创建拦截器类是继承了HandlerInterceptorAdapter也别感到奇怪
因为HandlerInterceptorAdapter类也作为子类实现了HandlerInterceptor接口
所以,自己创建拦截器类继承HandlerInterceptorAdapter
或者实现HandlerInterceptor接口是一模一样的
2.注入到spring容器中
这一步骤非常简单,只需要使用注解,或者在xml配置文件中进行配置即可
<bean name="loginInterceptor"
class="com.xiaoka.interceptor.LoginInterceptor" />
3.配置拦截器拦截的路径
3.1 只配置拦截器,不配置拦截路径
<!-- 这种配置方式,由于没有指定拦截的路径,所以默认拦截所有的请求,不推荐,感兴趣的可以试试 -->
<mvc:interceptors>
<ref bean="loginInterceptor" />
</mvc:interceptors>
3.2 我们推荐使用下列方式配置拦截路径,它和上边的配置大同小异,就只是多了拦截路径的配置而已
<!-- 这里配置的路径只是示例代码讲解拦截规则,大家应该根据自己的实际需求来配置拦截的路径 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截的请求
/ 是拦截跟路径,
例如<mvc:mapping path="/" /> 拦截 ip:端口/项目/ 这个路径
* 是拦截路径下的一级路径,
例如<mvc:mapping path="/*" /> 拦截根路径下的一级别路径,像/a,/b等路径
** 是拦截路径下的多级别路径
例如<mvc:mapping path="/**" /> 拦截根路径下的多级别路径,像/a/b/c,/b/c/d等路径
例如<mvc:mapping path=/a/** /> 拦截/a路径下的多级别路径,像/a/b/c可以拦截,而/b/c/d路径不拦截
-->
<mvc:mapping path="/**" />
<!-- 这些路径不拦截 -->
<mvc:exclude-mapping path="/show-login-page" />
<mvc:exclude-mapping path="/find/*" />
<!-- 指定使用的拦截器 -->
<ref bean="loginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
4.测试效果
首先测试不拦截的路径,发现控制台没有任何输出
?
然后再测试拦截路径,可以看到拦截器执行了
查看控制台,可以看到,拦截器生效了
?
最后,为了方便大家阅读学习,删除所有的注释,附上完整的代码和逻辑
Java类 ,自定义拦截器类
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
System.out.println("LoginInterceptor --- > preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("LoginInterceptor --- > postHandle");
}
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("LoginInterceptor --- > afterCompletion");
}
}
配置文件,进行IOC配置和拦截器配置
<bean name="loginInterceptor"
class="com.sanqiliangjian.interceptor.LoginInterceptor" />
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/show-login-page" />
<mvc:exclude-mapping path="/find/*" />
<ref bean="loginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
|