天天看點

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>
           
Interceptor-攔截器

将不需要攔截的排除在外

<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位址(有時也包括端口号)
③主機資源的具體位址。如目錄和檔案名等
           
Interceptor-攔截器

開發使用者流量攔截器

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>
           
Interceptor-攔截器

繼續閱讀