Interceptor-拦截器

拦截器-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:\logs\history.%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>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值