攔截器也是一個類
攔截器可以在Action被調用之前和之后執行代碼
框架很多核心功能是攔截器實現的
攔截器的特點:攔截器自由組合,增強了靈活性、擴展性、有利于系統解耦
攔截器可以攔截Action請求
在訪問的Action執行之前和執行之后執行代碼實現某項功能
Struts2:
大部分功能是在攔截器中實現的如:接收輸入的參數,數據驗證,文件上傳,國際化等
應用程序:
需要在Action執行的前后執行特定功能
Action執行時間統計,Action訪問權限管理
Action添加功能,Action代碼不動使用攔截器實現功能
二、攔截器工作方式Struts2還有很多攔截器。
四、攔截器棧從結構上 :攔截器棧就是一組攔截器
從功能上:攔截器棧也是攔截器
五、默認攔截器MyTimerInterceptor
package com.pb.web.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class MyTimerInterceptor extends AbstractInterceptor { //實現父類的方法 @Override public String intercept(ActionInvocation invocation) throws Exception { //執行前的時間 long startTime=System.currentTimeMillis(); System.out.struts.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><struts> <!-- 禁用動態方法調用--> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <!-- 啟用開發模式后,更改設置不用重啟Tomcat--> <constant name="struts.devMode" value="true" /> <!-- 包默認繼承strus-default --> <package name="default" namespace="/" extends="struts-default"> <interceptors> <interceptor name="myTimer" class="com.pb.web.interceptor.MyTimerInterceptor"></interceptor> </interceptors> <action name="hello" class="com.pb.web.action.HelloAction" method="hello"> <result name="success">/index.jsp</result> <result name="input">/index.jsp</result> <result name="error">/index.jsp</result> <!-- 啟用自定義的攔截器--> <interceptor-ref name="myTimer"/> <!-- 同時啟用struts2默認的攔截器名稱為defaultStack --> <interceptor-ref name="defaultStack"/> </action> </package></struts>七、自定義攔截器struts2有三種方法自定義攔截器
- 實現interceptor接口
- 繼承AbstractInterceptor類
- 繼承MethodFilterInterceptor類
八、簡單例子實現登錄后某個頁面才能訪問
登錄后才能訪問/WEB-INF/page/security.jsp
實體類
package com.pb.entity;/* * 用戶類 */public class User { private String username; private String passWord; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }package com.pb.web.action;import java.util.Map;import org.apache.struts2.interceptor.sessionAware;import com.opensymphony.xwork2.ActionSupport;import com.pb.entity.User;public class LoginAction extends ActionSupport implements SessionAware { private User user; private Map<String, Object> session; //登錄 public String login(){ if("admin".equals(user.getUsername())&&"admin".equals(user.getPassword())){ session.put("user", user); return SUCCESS; } return ERROR; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public void setSession(Map<String, Object> session) { this.session=session; } public Map<String, Object> getSession() { return session; } }攔截器
package com.pb.web.interceptor;import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.pb.entity.User;public class MyInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { Map<String, Object> session=ActionContext.getContext().getSession(); //獲取session中保持的用戶信息 User user=(User) session.get("user"); if(user!=null){ //如果用戶已經登錄,繼續執行剩余的攔截器和Action return invocation.invoke(); }else{ //如果用戶尚未登錄,返回到登錄頁面 return Action.LOGIN; } }}struts.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><struts> <package name="default" namespace="/" extends="struts-default"> <interceptors> <!--定義權限驗證攔截器 --> <interceptor name="myInterceptor" class="com.pb.web.interceptor.MyInterceptor"></interceptor> <!--定義攔截器棧 --> <interceptor-stack name="myStack"> <!--使用默認的攔截器 --> <interceptor-ref name="defaultStack" /> <interceptor-ref name="myInterceptor" /> </interceptor-stack> </interceptors> <!-- 定義全局結果返回login時,返回登錄頁面--> <global-results> <!--以重定向的方式跳轉 --> <result name="login" type="redirect">/login.jsp</result> </global-results> <!-- action--> <action name="login" class="com.pb.web.action.LoginAction" method="login"> <!-- 結果判斷和頁面跳轉--> <result name="success">/loginSuccess.jsp</result> <result name="error">/error.jsp</result> </action> <action name="security"> <interceptor-ref name="myStack" /> <result name="success"> /WEB-INF/page/security.jsp </result> </action> </package></struts>九、攔截器使用和與過濾器的不同之處
與過濾器的相同之處:
- 功能相似
- 原理相似
- 方法相似
與過濾器的不同之處:
- 攔截器用于攔截Action請求,而過濾器幾乎可以過濾所有的請求
- 攔截器中可以獲取Action的當前執行狀態,而過濾器不可以
- 過濾器是Servlet中概念,在Web.xml中配置;攔截器是Struts2/Webwork中的概念在struts.xml中配置
新聞熱點
疑難解答