Spring MVC使用攔截器對(duì)請(qǐng)求進(jìn)行攔截處理,用戶可以自定義攔截器來實(shí)現(xiàn)特定的功能,自定義的攔截器必須實(shí)現(xiàn)HandlerInterceptor接口
preHandle():這個(gè)方法在業(yè)務(wù)處理器處理請(qǐng)求之前被調(diào)用,在該方法中對(duì)用戶請(qǐng)求 request 進(jìn)行處理。如果程序員決定該攔截器對(duì)請(qǐng)求進(jìn)行攔截處理后還要調(diào)用其他的攔截器,或者是業(yè)務(wù)處理器去進(jìn)行處理,則返回true;如果程序員決定不需要再調(diào)用其他的組件去處理請(qǐng)求,則返回false。
postHandle():這個(gè)方法在業(yè)務(wù)處理器處理完請(qǐng)求后,但是DispatcherServlet 向客戶端返回響應(yīng)前被調(diào)用,在該方法中對(duì)用戶請(qǐng)求request進(jìn)行處理。
afterCompletion():這個(gè)方法在 DispatcherServlet 完全處理完請(qǐng)求后被調(diào)用,可以在該方法中進(jìn)行一些資源清理的操作。

圖片.png
xml代碼:
<mvc:interceptors>
<!-- 使用bean定義一個(gè)Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請(qǐng)求 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
<bean id="firstInterceptor" class="com.wiwj.app.api.controller.FirstInterceptor"></bean>
<mvc:interceptor>
<mvc:mapping path="/emps"/>
<!-- 定義在mvc:interceptor下面的表示是對(duì)特定的請(qǐng)求才進(jìn)行攔截的 -->
<bean id="secondInterceptor" class="com.wiwj.app.api.controller.SecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
java代碼:
package com.wiwj.app.api.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class FirstInterceptor implements HandlerInterceptor
{
/**
* 攔截器的初始方法,它在業(yè)務(wù)方法調(diào)用之前開始運(yùn)行,不管return true/false,它都會(huì)打??;
* 他的作用是不是進(jìn)行初始化,加載資源等需要在業(yè)務(wù)方法開始之前的準(zhǔn)備工作。
*/
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception
{
System.out.println("FirstInterceptor------preHandle");
return true;
}
/**
* 在業(yè)務(wù)方法之后,視圖渲染之前來完成自己的工作,如果preHandle return false,它失效;
* 主要用于業(yè)務(wù)方法處理結(jié)果完成之后進(jìn)行進(jìn)一步的內(nèi)容、業(yè)務(wù)的加強(qiáng)。
*/
@Override
public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception
{
System.out.println("FirstInterceptor------postHandle");
}
/**
* 在視圖渲染之后,一切運(yùn)行完成結(jié)束后開工,它主要完成資源的釋放、接口、連接、IO讀取等操作的關(guān)閉,
* 以及進(jìn)行性能優(yōu)化時(shí),最最后的總結(jié)呈現(xiàn)。如果preHandle return false,它失效;
*/
@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception
{
System.out.println("FirstInterceptor------afterCompletion");
}
}
注解攔截器
自定義一個(gè)注解
package com.wiwj.app.api.controller;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessRequired {
}
在需要攔截的方法頭上添加自定義的注解

圖片.png
攔截器中需要做的修改:
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod)
{
AccessRequired accessrequired = ((HandlerMethod) handler).getMethodAnnotation(AccessRequired.class);
//判斷方法或者類有沒有添加AccessRequired注解 ,如果有則攔截,沒有放過
if (accessrequired == null)
{
return true;
}else{
//攔截后獲取參數(shù)
String page=request.getParameter("page");
String count=request.getParameter("pcount");
System.out.println(page+count);
return false;
}
}
return true;
}