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