拦截器 :Interceptor 拦截 中断
类似于javaweb中的Filter,不过没有Filter那么强大
作用
Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦截器可以在请求到达控制器之前和之后执行一些操作,例如日志记录、权限验证、数据处理等。
拦截器特点
配置拦截器 实现**HandlerInterceptor**
,这个类通常包含**preHandle
、postHandle
和afterCompletion
**三个方法,分别用于请求处理之前、之后以及完成后执行自定义逻辑。
@Component
public class MyInterceptor implements HandlerInterceptor {
private final Logger log = LoggerFactory.getLogger(MyInterceptor.class);
@Override
//参数1:当前请求对象 参数2:当前请求响应对象 参数3:当前请求的控制器对应的方法对象
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.debug("======1========");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
// 参数1、2、3同上 参数4:当前控制器方法的返回值
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.debug("======2========");
log.debug("view:{}",modelAndView.getViewName());
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
// 参数1、2、3同上 参数4:请求过程中出现异常时的异常对象
// 这个方法总是会执行 无论请求正确或出现异常
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.debug("======3========");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
创建配置类,目的是将拦截器注册到程序中,在这个配置类中,你需要重写**addInterceptors
方法,并在其中将拦截器添加到InterceptorRegistry
**中。
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)// 指定拦截器
.addPathPatterns("/**")// 拦截所有
.excludePathPatterns("file/**");//排除拦截
}
}
注意
多个拦截器注册到配置类中,他们的执行顺序是按照栈一样的顺序,第一个拦截器先执行,那么该拦截器也是最后退出的。秉承先进后出的原理
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Autowired
private MyInterceptor2 myInterceptor2;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)// 指定拦截器
.addPathPatterns("/**")// 拦截所有
.excludePathPatterns("file/**");//排除拦截
registry.addInterceptor(myInterceptor2)// 指定拦截器
.addPathPatterns("/**")// 拦截所有
.excludePathPatterns("file/**");//排除拦截
}
}
执行结果
可以通过order参数修改执行顺序
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Autowired
private MyInterceptor2 myInterceptor2;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)// 指定拦截器
.addPathPatterns("/**")// 拦截所有
.excludePathPatterns("file/**") //排除拦截
.order(2);
registry.addInterceptor(myInterceptor2)// 指定拦截器
.addPathPatterns("/**")// 拦截所有
.excludePathPatterns("file/**")//排除拦截
.order(1);
}
}
Spring Boot 项目可以通过多种方式部署:
目前讲的就是传统部署方式,分为两种:
目前创建springboot项目默认都是war包部署,需要修改设置pom.xml
<packaging>war</packaging>
删除内嵌tomcat依赖
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!--设置仅当前idea环境可以,不参与打包-->
<scope>provided</scope>
</dependency>
<!--tomcat 不参与打包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
配置入口类,不再使用内嵌服务器
<configuration>
<fork>true</fork>
<!--增加jvm参数-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<!--指定入口类-->
<mainClass>com.baizhi.Springboot06Application</mainClass>
<skip>true</skip>
</configuration>
// SpringBootServletInitializer:不在使用内嵌容器启动,使用外部tomact启动
@SpringBootApplication
public class Springboot06Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Springboot06Application.class);
}
在maven里进行打包操作
打包后以后
在tomcat运行war包项目
将WAR文件复制到webapps目录
启动Tomcat服务器
# 进入Tomcat的bin目录
cd $CATALINA_HOME/bin
# 启动Tomcat服务器
./startup.sh
访问应用程序:http://localhost:8080/springboot06
执行在maven执行**package**
进行打包
通过控制台打开jar包目录
启动jar包
**java -jar jar文件名 nohub &**
解释:nohub:后台启动 &:不要日志
成功启动