更新時間:2020-10-23 17:56:08 來源:動力節(jié)點 瀏覽1251次
我們都知道filter是Java Web三大組件之一,作為Java Web的過濾器,filter可附加到一個或多個servlet或JSP頁面上,并且可以檢查進入這些資源的請求信息。言歸正傳,Java Web過濾器和攔截器在某些地方有相似之處,但又不是用一種東西。那么,不同于filter在Java Web中顯眼的地位,Java Web攔截器在Java Web中扮演著一個什么樣的角色呢?本文我們就來一探究竟。
攔截器,在AOP(Aspect-Oriented Programming)中用于在某個方法或字段被訪問之前,進行攔截然后在之前或之后加入某些操作。它依賴于Web框架,在SpringMVC中就是依賴于SpringMVC框架。攔截是AOP的一種實現(xiàn)策略。而在Webwork的中文文檔的解釋為——攔截器是動態(tài)攔截Action調(diào)用的對象。它提供了一種機制可以使開發(fā)者可以定義在一個action執(zhí)行的前后執(zhí)行的代碼,也可以在一個action執(zhí)行前阻止其執(zhí)行。同時也是提供了一種可以提取action中可重用的部分的方式。
在實現(xiàn)上,基于Java的反射機制,屬于面向切面編程(AOP)的一種運用,就是在service或者一個方法前,調(diào)用一個方法,或者在方法后,調(diào)用一個方法,比如動態(tài)代理就是攔截器的簡單實現(xiàn),在調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在調(diào)用方法后打印出字符串,甚至在拋出異常的時候做業(yè)務(wù)邏輯的操作。由于攔截器是基于Web框架的調(diào)用,因此可以使用Spring的依賴注入(DI)進行一些業(yè)務(wù)操作,同時一個攔截器實例在一個controller生命周期之內(nèi)可以多次調(diào)用。但是缺點是只能對controller請求進行攔截,對其他的一些比如直接訪問靜態(tài)資源的請求則沒辦法進行攔截處理。
示例代碼
在xml文件中如何定義Java Web攔截器
怎么編寫自定義攔截器
public class FilterIPActionInterceptor extends AbstractInterceptor
{
/** 日志控制. */
private final Log log = LogFactory.getLog(getClass());
/**
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception
{
String result = null;
// 獲得當(dāng)前方法名.
String methodName = invocation.getInvocationContext().getName();
String currIp = null;
try
{
if (invocation.getAction() instanceof PortletAction)
{
PortletAction action = (PortletAction) invocation.getAction();
currIp = action.getRequest().getRemoteAddr();
}
String ip = ApplicationResource.getHotValue("ALLOW_CACHE_IP");
if (StringUtils.isBlank(ip) || StringUtils.isBlank(currIp))
{
log.error("允許刷新的IP不存在或當(dāng)前請求的IP非法.");
throw new NoAllowIPException();
}
else
{
String[] ips = ip.split(",");
boolean errorIp = true;
for (String s : ips)
{
if (s.equals(currIp))
errorIp = false;
}
// 判斷IP
if (errorIp)
throw new NoAllowIPException();
}
result = invocation.invoke();//調(diào)用被攔截的方法
}
catch (Exception e)
{
log.error("異常類名:" + invocation.getAction().getClass());
log.error("異常方法:" + methodName, e);
throw e;
}
return result;
}
}
通過本文的講解加上我們之前對filter的了解,可以得出如下結(jié)論:
Java Web過濾器需要在web.xml中配置,依賴于Servlet;而Java Web攔截器需要在SpringMVC中配置,依賴于框架;
由此可見,Java Web攔截器的作用和filter相比毫不遜色,Java Web攔截器相關(guān)知識也是我們應(yīng)該加以重視的重要考點,在Java基礎(chǔ)面試題中也是頻繁出現(xiàn),我們應(yīng)該牢牢掌握。