Interceptor拦截器入门

拦截器基本概念

  • 拦截器(Interceptor)用于对URL请求进行前置/后置过滤
  • Interceptor与Filter用途相似,但实现方式不同
  • Interceptor底层就是基于Spring AOP面向切面编程实现

拦截器开发流程

  1. Maven依赖servlet-api

provided:只有在开发和编译阶段才会引用,打包的时候会被排除在外

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.imooc</groupId>
  7. <artifactId>interceptor</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <repositories>
  10. <repository>
  11. <id>aliyun</id>
  12. <name>aliyun</name>
  13. <url>https://maven.aliyun.com/repository/public</url>
  14. </repository>
  15. </repositories>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework</groupId>
  19. <artifactId>spring-webmvc</artifactId>
  20. <version>5.1.9.RELEASE</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>com.fasterxml.jackson.core</groupId>
  24. <artifactId>jackson-core</artifactId>
  25. <version>2.9.9</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.fasterxml.jackson.core</groupId>
  29. <artifactId>jackson-databind</artifactId>
  30. <version>2.9.9</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>com.fasterxml.jackson.core</groupId>
  34. <artifactId>jackson-annotations</artifactId>
  35. <version>2.9.9</version>
  36. </dependency>
  37. + <dependency>
  38. + <groupId>javax.servlet</groupId>
  39. + <artifactId>javax.servlet-api</artifactId>
  40. + <version>3.1.0</version>
  41. + <scope>provided</scope>
  42. + </dependency>
  43. <dependency>
  44. <groupId>ch.qos.logback</groupId>
  45. <artifactId>logback-classic</artifactId>
  46. <version>1.2.3</version>
  47. </dependency>
  48. </dependencies>
  49. </project>
  1. 实现HandlerInterceptor接口
  • preHandle - 前置执行处理,如果返回false,请求到此结束
  • postHandle - 目标资源已被Spring MVC框架处理
  • afterCompletion - 响应文本已经产生

src/main/java/com/song/resufutl/interceptor/MyInterceptor.java

  1. package com.imooc.restful.interceptor;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.web.servlet.HandlerInterceptor;
  5. import org.springframework.web.servlet.ModelAndView;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. public class MyInterceptor implements HandlerInterceptor {
  9. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  10. System.out.println(request.getRequestURL() + "-准备执行");
  11. // response.getWriter().print("[]");
  12. return true;
  13. }
  14. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  15. System.out.println(request.getRequestURL() + "-目标处理成功");
  16. }
  17. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  18. System.out.println(request.getRequestURL() + "-响应内容已产生");
  19. }
  20. }
  1. applicationContext配置过滤地址

src/mian/resources/applicationContext.xml

 +   <mvc:interceptors>
 +       <mvc:interceptor>
 +           <mvc:mapping path="/**"/>
 +           <bean class="com.imooc.restful.interceptor.MyInterceptor"/>
 +       </mvc:interceptor>
 +   </mvc:interceptors>

“/**”代表拦截所有,bean代表使用哪个拦截器

Interceptor拦截器使用技巧

src/mian/resources/applicationContext.xml

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/restful/**"/>
            <mvc:mapping path="/webapi/**"/>
            <mvc:exclude-mapping path="/**.ico"/>
            <mvc:exclude-mapping path="/**.jpg"/>
            <mvc:exclude-mapping path="/**.gif"/>
            <mvc:exclude-mapping path="/**.js"/>
            <mvc:exclude-mapping path="/**.css"/>
            <mvc:exclude-mapping path="/resources/**"/>
            <bean class="com.imooc.restful.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

image.png

开发用户流量拦截器

引入日志依赖

pom.xml

+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>1.2.3</version>
+        </dependency>

配置logback

src/main/resources/logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%thread] %d %level %logger{10} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="accessHistoryLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>d:/logs/history.%d.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>[%thread] %d %level %logger{10} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="console"/>
    </root>
    <logger name="com.imooc.restful.interceptor.AccessHistoryInterceptor"
            level="INFO" additivity="false">
        <appender-ref ref="accessHistoryLog"/>
    </logger>
</configuration>

设置拦截器

src/main/java/com/imooc/restful/interceptor/AccessHistoryInterceptor.java

package com.imooc.restful.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AccessHistoryInterceptor implements HandlerInterceptor {
    private Logger logger = LoggerFactory.getLogger(AccessHistoryInterceptor.class);

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        StringBuilder log = new StringBuilder();
        log.append(request.getRemoteAddr());
        log.append("|");
        log.append(request.getRequestURL());
        log.append("|");
        log.append(request.getHeader("user-agent"));
        logger.info(log.toString());
        return true;
    }
}

使用拦截器

src/main/resources/applicationContext.xml

+    <mvc:interceptors>
+        <mvc:interceptor>
+            <mvc:mapping path="/**"/>
+            <mvc:exclude-mapping path="/resources/**"/>
+            <bean class="com.imooc.restful.interceptor.AccessHistoryInterceptor"/>
+        </mvc:interceptor>
+    </mvc:interceptors>

Spring MVC处理流程

image.png