概述
拦截器-Interceptor
- 拦截器(Interceptor)用于对URL请求进行前置/后置过滤
- Interceptor与Filter用途相似,但实现方式不同
- Interceptor底层就是基于Spring AOP面向切面编程实现
拦截器开发流程
- Maven依赖servlet-api
- 实现HandlerInterceptor接口
- applicationContext配置过滤地址
pop.xml文件添加
<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 -响应文本已经产生
public 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() + "-相应内容已经产生");
}
}
<!--可以有很多个-->
<mvc:interceptors>
<mvc:interceptor>
<!--对所有的请求进行拦截,被拦截的请求送达至MyInterceptor 并按照里边方法的实现顺序依次执行-->
<mvc:mapping path="/**"/>
<!--哪个类对拦截的URL进行处理-->
<bean class="com.imooc.restful.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
将不需要拦截的排除在外
<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区别
URI 是统一资源标识符,而 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地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
开发用户流量拦截器
public 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;
}
}
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
创建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">
<!--滚动策略 按照时间进行滚动 每天都会创建一个新的.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>
配置过滤器地址
<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-拦截器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复