springboot-1.5.x 拦截器配置和不起作用原因

本文介绍如何在SpringBoot中定义和配置拦截器,包括创建拦截器类和配置类的方法,同时分析了拦截器不生效的常见原因及解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 定义拦截器类
public class ReSubmitInterceptor extends HandlerInterceptorAdapter {

        

/**
 * 进入controller前判断是否要验证重复提交
 */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {

     }

 

}

 

2. 编写配置类
@Configuration public class ResourceHandlerConfig extends WebMvcConfigurationSupport {

       

/**
 * 注册 拦截器
 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
   registry.addInterceptor(new ReSubmitInterceptor())
         .addPathPatterns("/**").excludePathPatterns("/error/page/**");
}

}

 

 

3. 可能造成拦截器不生效的原因:

  以前遇到要使用springboot拦截器却始终未生效的状况,查了网上的博客,大抵都是@Component,@Configuration注解未加,或是使用@ComponentScan增加包扫描,但是尝试后都没有生效,最后才发现是因为之前为了解决跨域问题配置类继承了WebMvcConfigurationSupport,并重写了里面的方法。之后的拦截器配置类同样继承了这个这个类并重写方法,它只会生效前一个配置类,后一个配置类不会生效,所以解决方法就是在一个配置类重写这两个方法就行了,不要分成两个配置类写。

<think>我们使用Spring Boot集成MyBatis,并配置Log4j来打印SQL日志。这里假设使用Log4j 1.x版本(虽然现在推荐Log4j2,但问题中指定了log4j)。 在Spring Boot中,通常我们使用`application.properties`或`application.yml`来配置,但日志配置通常需要单独的log4j.properties文件。 注意:Spring Boot默认使用Logback,如果要使用Log4j,需要排除Logback并引入Log4j依赖。 步骤: 1. 添加依赖(Maven示例) 2. 创建log4j.properties配置文件 3. 配置MyBatis的Mapper接口的日志级别为DEBUG(因为SQL执行日志是在DEBUG级别输出的) 详细步骤: 第一步:在pom.xml中添加依赖,并排除Spring Boot默认的logging(Logback),然后引入Log4j。 第二步:在src/main/resources目录下创建log4j.properties文件,并配置日志输出。 注意:MyBatis的日志输出是通过Mapper接口的包名或者全限定类名来控制的。通常,我们会将Mapper接口放在一个特定的包下(如com.example.mapper),然后设置这个包的日志级别为DEBUG。 示例代码: 1. Maven依赖配置: ```xml <dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除默认的日志框架 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入log4j --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> <version>1.3.8.RELEASE</version> <!-- 注意:Spring Boot 1.x版本有对log4j的starter,2.x版本不再支持log4j1,如果使用2.x请改用log4j2 --> </dependency> <!-- MyBatis Spring Boot Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> <!-- 请根据实际版本选择 --> </dependency> <!-- 其他依赖 --> </dependencies> ``` 注意:如果使用Spring Boot 2.x,官方不再提供对log4j 1.x的支持,而是使用log4j2。因此,如果项目必须使用log4j 1.x,可能需要额外配置。但这里我们按照问题要求,使用log4j1。 但是,由于Spring Boot 2.x已经不再支持log4j1,所以如果使用Spring Boot 2.x,建议使用log4j2。这里我们假设使用Spring Boot 1.5.x版本。 或者,如果你使用Spring Boot 2.x,并且必须使用log4j1,可以手动排除logback,并添加log4j1的依赖,但需要自己解决兼容性问题。 为了简单起见,我们以Spring Boot 1.5.x为例。 2. 创建log4j.properties文件(src/main/resources/log4j.properties): ```properties # 设置根日志级别为WARN,输出到控制台 log4j.rootLogger=WARN, stdout # 设置MyBatis的Mapper接口所在的包为DEBUG级别(这样才会打印SQL) log4j.logger.com.example.mapper=DEBUG # 控制台输出配置 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c{1}:%L - %m%n # 如果需要显示SQL语句的参数,可以配置MyBatis的日志实现为STDOUT_LOGGING(可选,但通常log4j配置已经可以打印SQL,参数需要额外设置) # 但是注意:MyBatis自身有日志实现,它会使用log4j来输出。默认情况下,MyBatis不会打印参数值,只会打印带?的SQL。 # 如果需要打印参数,可以配置log4j.logger.java.sql.PreparedStatement=DEBUG(但这样会打印所有PreparedStatement,可能过多) # 或者使用MyBatis的插件如p6spy,这里不展开。 # 如果希望看到SQL语句中的参数值,可以设置: log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG ``` 注意:将`com.example.mapper`替换为你的Mapper接口所在的包。 3. 在application.properties中指定MyBatis配置(可选): ```properties # 指定MyBatis的Mapper文件位置 mybatis.mapper-locations=classpath:mapper/*.xml # 配置MyBatis的日志实现(如果使用log4j,可以不用配置,MyBatis会自动使用log4j) mybatis.configuration.log-impl=org.apache.ibatis.logging.log4j.Log4jImpl ``` 但是,在Spring Boot中,MyBatis会自动检测日志实现,所以通常不需要配置`log-impl`。 4. 如果使用Spring Boot 2.x,并且想使用log4j2,那么依赖配置如下: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- MyBatis依赖 --> </dependencies> ``` 然后使用log4j2.xml配置文件。但问题要求log4j,所以这里不展开log4j2。 由于问题指定了log4j,我们按照log4j1配置。 但是,请注意:Spring Boot 2.x已经不支持log4j1,如果使用Spring Boot 2.x,建议迁移到log4j2。如果坚持使用log4j1,需要手动添加log4j1的依赖并排除其他日志框架,但可能会遇到兼容性问题。 因此,以下是一个折中方案:使用log4j-over-slf4j将log4j的日志输出重定向到SLF4J,然后由SLF4J输出到logback(或其他)。但这样就不能使用log4j.properties配置了。 考虑到问题要求,我们给出Spring Boot 1.5.x + log4j1配置。 如果使用Spring Boot 2.x,并且必须使用log4j1,可以尝试以下依赖配置(但不推荐): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency> ``` 然后配置log4j.properties。 总结:在Spring Boot 1.5.x中,使用log4j1配置MyBatis打印SQL日志的步骤如上。 但是,更常见的做法是使用logback或log4j2。因此,如果条件允许,建议升级到log4j2。 最后,我们给出一个在Spring Boot 2.x中使用log4j2的配置示例(供参考,因为问题要求log4j,但考虑到实际,提供备选): log4j2.xml配置(打印SQL): ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> </Appenders> <Loggers> <!-- 设置MyBatis接口的包为DEBUG级别 --> <Logger name="com.example.mapper" level="DEBUG" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Root level="warn"> <AppenderRef ref="Console" /> </Root> </Loggers> </Configuration> ``` 由于问题要求log4j(即log4j1),所以主要提供log4j1配置。 如果配置后仍然不打印SQL,请检查: 1. 包名是否正确 2. 日志级别是否足够(DEBUG) 3. 是否还有其他日志框架干扰 希望以上内容能帮助解决问题。 §§相关问题§§: 1.Spring Boot中如何配置log4j2来打印MyBatis的SQL日志? 2. 如何让MyBatis在日志中打印SQL语句的参数值(而不是带?的语句)? 3.Spring Boot 2.x中如何排除默认的Logback并改用log4j2? 4. 如何将MyBatis的SQL日志输出到单独的文件?</think># Spring Boot + MyBatis + Log4j 配置 SQL 日志打印 在 Spring Boot 项目中整合 MyBatis Log4j 来打印 SQL 日志,需要配置 MyBatis 的日志实现 Log4j 的日志级别。以下是完整的配置方案: ## 完整配置步骤 ### 1. 添加 Maven 依赖 (`pom.xml`) ```xml <dependencies> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis Spring Boot Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> <!-- Log4j 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> <version>1.3.8.RELEASE</version> <!-- 适配 Spring Boot 2.x --> </dependency> <!-- 数据库驱动 (以 MySQL 为例) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> ``` ### 2. 配置 `log4j.properties` (核心配置) 在 `src/main/resources` 目录下创建 `log4j.properties` 文件: ```properties # 设置根日志级别为 WARN log4j.rootLogger=WARN, stdout # 控制台输出配置 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] %c{1}:%L - %m%n # 配置 MyBatis SQL 日志输出 # 1. 打印执行的 SQL 语句 log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG # 2. 打印 MyBatis Mapper 接口的 SQL (推荐方式) log4j.logger.com.example.mapper=TRACE # 3. 打印 MyBatis 操作日志 log4j.logger.org.mybatis=DEBUG log4j.logger.org.apache.ibatis=TRACE # 4. 打印 JDBC 事务日志 log4j.logger.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG # 5. 打印 SQL 参数值 (需要额外配置) log4j.logger.jdbc.sqlonly=DEBUG log4j.logger.jdbc.sqltiming=INFO ``` ### 3. 配置 `application.properties` ```properties # 数据源配置 spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # MyBatis 配置 # 指定 MyBatis 使用 Log4j 作为日志实现 mybatis.configuration.log-impl=org.apache.ibatis.logging.log4j.Log4jImpl # 指定 Mapper 文件位置 mybatis.mapper-locations=classpath:mapper/*.xml ``` ### 4. 创建 Mapper 接口 XML `src/main/java/com/example/mapper/UserMapper.java`: ```java package com.example.mapper; import com.example.model.User; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface UserMapper { List<User> findAllUsers(); User findUserById(Long id); void insertUser(User user); } ``` `src/main/resources/mapper/UserMapper.xml`: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.UserMapper"> <select id="findAllUsers" resultType="com.example.model.User"> SELECT * FROM users </select> <select id="findUserById" resultType="com.example.model.User"> SELECT * FROM users WHERE id = #{id} </select> <insert id="insertUser" parameterType="com.example.model.User"> INSERT INTO users (name, email) VALUES (#{name}, #{email}) </insert> </mapper> ``` ### 5. 创建 Service Controller `src/main/java/com/example/service/UserService.java`: ```java package com.example.service; import com.example.mapper.UserMapper; import com.example.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getAllUsers() { return userMapper.findAllUsers(); } public User getUserById(Long id) { return userMapper.findUserById(id); } public void createUser(User user) { userMapper.insertUser(user); } } ``` `src/main/java/com/example/controller/UserController.java`: ```java package com.example.controller; import com.example.model.User; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping public List<User> getAllUsers() { return userService.getAllUsers(); } @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); } @PostMapping public void createUser(@RequestBody User user) { userService.createUser(user); } } ``` ## 日志输出详解 ### 1. SQL 语句输出示例 ``` DEBUG [http-nio-8080-exec-1] java.sql.PreparedStatement: - ==> Preparing: SELECT * FROM users WHERE id = ? DEBUG [http-nio-8080-exec-1] java.sql.PreparedStatement: - ==> Parameters: 1(Long) ``` ### 2. 完整 SQL 日志输出(带参数值) 如果需要显示完整的 SQL 语句(包含实际参数值),添加以下配置: ```properties # 在 log4j.properties 中添加 log4j.logger.jdbc.sqlonly=DEBUG log4j.logger.jdbc.sqltiming=INFO ``` 然后在代码中注册 JDBC 日志拦截器: `src/main/java/com/example/config/JdbcLogConfig.java`: ```java package com.example.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import net.sf.log4jdbc.Log4jdbcProxyDataSource; import net.sf.log4jdbc.tools.Log4JdbcCustomFormatter; import net.sf.log4jdbc.tools.LoggingType; import javax.sql.DataSource; @Configuration public class JdbcLogConfig { @Bean public DataSource dataSource(DataSource originalDataSource) { Log4jdbcProxyDataSource proxyDataSource = new Log4jdbcProxyDataSource(originalDataSource); Log4JdbcCustomFormatter formatter = new Log4JdbcCustomFormatter(); formatter.setLoggingType(LoggingType.MULTI_LINE); formatter.setSqlPrefix("SQL:::"); proxyDataSource.setLogFormatter(formatter); return proxyDataSource; } } ``` 添加依赖: ```xml <dependency> <groupId>org.lazyluke</groupId> <artifactId>log4jdbc-remix</artifactId> <version>0.2.7</version> </dependency> ``` 输出示例: ``` SQL::: SELECT * FROM users WHERE id = 1 ``` ## 常见问题解决 ### 1. SQL 日志不显示 - 检查 `log4j.properties` 中包路径是否正确 - 确认 `mybatis.configuration.log-impl=org.apache.ibatis.logging.log4j.Log4jImpl` - 检查日志级别是否设置为 TRACE 或 DEBUG ### 2. 日志过多问题 ```properties # 只打印 SQL 不打印结果集 log4j.logger.java.sql.ResultSet=ERROR # 只打印 SQL 执行时间超过 100ms 的语句 log4j.logger.jdbc.sqltiming=WARN log4j.logger.jdbc.sqltiming.threshold=100 ``` ### 3. 日志输出到文件 ```properties log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=logs/sql.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # 将 SQL 日志单独输出到文件 log4j.logger.com.example.mapper=TRACE, file ``` ## 最佳实践建议 1. **环境区分**:开发环境使用 TRACE,生产环境使用 DEBUG 2. **敏感信息**:避免在日志中打印密码等敏感数据 3. **日志轮转**:配置日志文件大小限制备份策略 4. **性能监控**:使用 `jdbc.sqltiming` 监控慢 SQL 5. **异步日志**:在高并发场景下使用异步日志记录器
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值