拦截器-Interceptor
- 拦截器(Interceptor)用于对URL请求进行前置/后置过滤
- Interceptor与Filter用途相似,但实现方式不同
- Interceptor底层就是基于Spring AOP面向切面编程实现
拦截器开发流程
- Maven依赖servlet-api
- 实现HandlerInterceptor接口
- applicationContext配置过滤地址
pop.xml文件添加
复制代码
1
2
3
4
5
6
7
8<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!--只有在开发编译才会引用,打包最终使用的时候会被排除在外--> <scope>provided</scope> </dependency>
HandlerInterceptor接口
- preHandle -前置执行处理
- postHandle -目标资源已被Spring MVC框架处理
- afterCompletion -响应文本已经产生
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26public class MyInterceptor implements HandlerInterceptor { // 前置执行处理 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(request.getRequestURL() + "-准备执行"); // 如果为false就会发生阻断,原本执行的所有请求和后序处理都会被阻断,相应在当前的方法中直接产生 return true; } // 目标已被Spring MVC框架处理 // 目标资源被处理成功以后,但是没有产生相应文本之前要做的事情 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(request.getRequestURL() + "-目标处理成功"); } // 相应文本已经产生 最后被执行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(request.getRequestURL() + "-相应内容已经产生"); } }
复制代码
1
2
3
4
5
6
7
8
9
10<!--可以有很多个--> <mvc:interceptors> <mvc:interceptor> <!--对所有的请求进行拦截,被拦截的请求送达至MyInterceptor 并按照里边方法的实现顺序依次执行--> <mvc:mapping path="/**"/> <!--哪个类对拦截的URL进行处理--> <bean class="com.imooc.restful.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
将不需要拦截的排除在外
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17<mvc:interceptors> <mvc:interceptor> <!--对所有的请求进行拦截,被拦截的请求送达至MyInterceptor 并按照里边方法的实现顺序依次执行--> <!--拦截URI--> <mvc:mapping path="/restful/**"> <mvc:mapping path="/**"/> <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>
URI和URL区别
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18URI 是统一资源标识符,而 URL 是统一资源定位符。 关系: URI 属于 URL 更高层次的抽象,一种字符串文本标准。 就是说,URI 属于父类,而 URL 属于 URI 的子类。URL 是 URI 的一个子集。 URI—Uniform Resource Identifier通用资源标志符: Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的 URI一般由三部组成: ①访问资源的命名机制 ②存放资源的主机名 ③资源自身的名称,由路径表示,着重强调于资源。 URI 是统一资源标识符,而 URL 是统一资源定位符。 URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。 采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。 URL一般由三部组成: ①协议(或称为服务方式) ②存有该资源的主机IP地址(有时也包括端口号) ③主机资源的具体地址。如目录和文件名等
开发用户流量拦截器
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class AccessHistoryInterceptor implements HandlerInterceptor { private Logger logger = LoggerFactory.getLogger(AccessHistoryInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { StringBuilder log = new StringBuilder(); //远程用户IP地址 log.append(request.getRemoteAddr()); log.append("|"); // 用户访问的URL地址 log.append(request.getRequestURL()); log.append("|"); // 用户客户端环境 log.append(request.getHeader("user-agent")); logger.info(log.toString()); return true; } }
复制代码
1
2
3
4
5
6<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
创建logback.xml配置文件
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36<?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"> <!--滚动策略 按照时间进行滚动 每天都会创建一个新的.log文件--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--保存路径--> <fileNamePattern>E:logshistory.%d.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>[%thread] %d %level %logger{10} - %msg%n</pattern> </encoder> </appender> <!-- 日志输出级别(优先级高到低): error:错误–系统的故障日志 warn:警告-存在风险或使用不当的日志 info:一般性消息 debug:程序内部用于调试信息 trace:程序运行的跟踪信息 --> <root level="debug"> <appender-ref ref="console"/> </root> <logger name="com.imooc.restful.interceptor.AccessHistoryInterceptor" level="INFO" additivity="false"> <!--additivity="false"只会在文件中输出--> <appender-ref ref="accessHistoryLog"/> </logger> </configuration>
配置过滤器地址
复制代码
1
2
3
4
5
6
7
8<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/resources/**"/> <bean class="com.imooc.restful.interceptor.AccessHistoryInterceptor"/> </mvc:interceptor> </mvc:interceptors>
最后
以上就是刻苦紫菜最近收集整理的关于Interceptor-拦截器的全部内容,更多相关Interceptor-拦截器内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复