0x00前言
springmvc的拦截器类似于Selvet的Filter,但是所属的操作又不一样
Spring MVC 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理,也就是增强方法,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
0x01基础使用
拦截器需要实实现HandlerInterceptor
@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {
@Override
//原始方法调用前执行的内容
//返回值类型可以拦截控制的执行,true放行,false终止
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String contentType = request.getHeader(\"Content-Type\");
HandlerMethod hm = (HandlerMethod)handler;
System.out.println(\"preHandle...\"+contentType);
return true;
}
@Override
//原始方法调用后执行的内容
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(\"postHandle...\");
}
@Override
//原始方法调用完成后执行的内容
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(\"afterCompletion...\");
}
}
有三个方法
- 原始方法调用前执行的内容
返回值类型可以拦截控制的执行,true放行,false终止
public boolean preHandle - 原始方法调用后执行的内容
public void postHandle - 原始方法调用完成后执行的内容
public void afterCompletion - 方法中参数都是可以用的,如postHandle中的requst,response那些都是可以进行配置的
写配置需要继承WebMvcConfigurationSupport类实现addInterceptors方法
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(\"/pages/**\").addResourceLocations(\"/pages/\");//配置访问静态资源
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
//配置拦截器
registry.addInterceptor(projectInterceptor).addPathPatterns(\"/books\",\"/books/*\");
}
}
0x02简化配置
经典前面白学
@Configuration
@ComponentScan({\"com.itheima.controller\"})
@EnableWebMvc
//实现WebMvcConfigurer接口可以简化开发,但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {
@Autowired
private ProjectInterceptor projectInterceptor;
@Autowired
private ProjectInterceptor2 projectInterceptor2;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//配置多拦截器
registry.addInterceptor(projectInterceptor).addPathPatterns(\"/books\",\"/books/*\");
registry.addInterceptor(projectInterceptor2).addPathPatterns(\"/books\",\"/books/*\");
}
}
直接在核心配置类里面配置拦截器
0x03拦截链
拦截链,执行的顺序是先执行1的preHandle执行2的preHandle,后面的方法是从2开始执行因为preHandle过了就是原始方法,原始方法过了就是类似于,人从门里往外面走先过第二道门。
这里直接引用一张上课的PPT
只要pre执行了对呀的after就会执行。只要一个pre出错误了post就都不会执行。
0x04xml配置
按照前面的方法配置好拦截器然后在xml文件中加入一系列mvc的标签
<mvc:interceptors>
<mvc:interceptor>
<!-- 配置拦截器拦截路径-->
<mvc:mapping path=\"/book/*\"/>
<!-- 注入自定义拦截器-->
<bean class=\"com.test.domain.MyInterceptor\"/>
</mvc:interceptor>
</mvc:interceptors>
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(\"/pages/**\").addResourceLocations(\"/pages/\");//配置访问静态资源
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
//配置拦截器
registry.addInterceptor(projectInterceptor).addPathPatterns(\"/books\",\"/books/*\");
}
}
0x05总结
这两篇的mvc都是一些开发多的注解呀和一些配置的问题,只需要记住一些该有的注解,它们的使用跟Servlet是十分相似的,还有ssm整合和springboot了,整体来说我写的代码都很少很多都是直接抄的代码,主要是要去了解这些控件,始终要记得的是ioc开发模式很多东西都是属于是bean
来源:https://www.cnblogs.com/0x3e-time/p/16450981.html
本站部分图文来源于网络,如有侵权请联系删除。