你是不是也曾在Struts2項(xiàng)目中遇到過(guò)這樣的困擾:想統(tǒng)一處理日志、權(quán)限校驗(yàn)、參數(shù)過(guò)濾,但又不想每個(gè)Action都重復(fù)寫(xiě)代碼?別急,今天就來(lái)手把手教你——Struts2攔截器怎么配置實(shí)現(xiàn)!
Q1:什么是Struts2攔截器?它和Filter有什么區(qū)別?
攔截器(Interceptor)是Struts2的核心機(jī)制之一,它就像一個(gè)“中間人”,在Action執(zhí)行前后自動(dòng)介入,幫你做統(tǒng)一邏輯處理。比如登錄校驗(yàn)、性能監(jiān)控、異常捕獲……而Filter是Servlet規(guī)范里的東西,作用范圍更廣,但對(duì)Struts2的Action控制力不如攔截器靈活。
Q2:我該怎么自定義一個(gè)攔截器?舉個(gè)真實(shí)案例!
比如我們有個(gè)需求:所有請(qǐng)求都要記錄訪問(wèn)時(shí)間+用戶IP。這時(shí)候你可以這樣寫(xiě):
public class LogInterceptor implements Interceptor { public void intercept(ActionInvocation invocation) throws Exception { long start = System.currentTimeMillis(); String ip = ServletActionContext.getRequest().getRemoteAddr(); System.out.println("訪問(wèn)IP:" + ip + ",開(kāi)始時(shí)間:" + new Date()); invocation.invoke(); // 執(zhí)行Action System.out.println("耗時(shí):" + (System.currentTimeMillis() start) + "ms"); }}Q3:攔截器怎么注冊(cè)到Struts2里?
很簡(jiǎn)單!在struts.xml中添加:
這樣,所有屬于這個(gè)包下的Action都會(huì)自動(dòng)走你的LogInterceptor!是不是超省心?
Q4:能同時(shí)用多個(gè)攔截器嗎?順序重要嗎?
當(dāng)然可以!而且順序超級(jí)關(guān)鍵!比如你先要權(quán)限校驗(yàn),再記錄日志,就要這樣寫(xiě):
Struts2會(huì)按順序執(zhí)行:auth → log → Action。如果反過(guò)來(lái),可能日志還沒(méi)記完就權(quán)限失敗了,那就尷尬了~
小貼士:如果你只想讓某個(gè)Action用攔截器,也可以局部配置:
這才是真正的“精準(zhǔn)控制”!
看到這里,是不是覺(jué)得Struts2攔截器沒(méi)那么神秘了?其實(shí)它就是你項(xiàng)目中的“隱形助手”——默默干活,還讓你代碼清爽!趕緊試試吧,下次發(fā)朋友圈可以說(shuō):“我靠,原來(lái)攔截器這么好用!” ??

