1、攔截器與過濾器
1、攔截器屬于struts框架,只能攔截action及其方法 2、過濾器屬于web容器,過濾一切請求(action,servlet,hsp,html等) 3、實現方法:攔截器——動態代理;過濾器——函數回調。2、攔截器與攔截器棧(stark)
1、多個攔截器組成攔截器棧 2、二者的引用方法一致3、攔截器的實現步驟
1、編寫攔截器(接口Interceptor//繼承AbstractInterceptor) 2、在struts.xml中配置攔截器 3、在action中引用配置好的攔截器4、攔截器常用配置
1、當引用了自定義的攔截器后,默認配置攔截器失效; 2、當引用了自定義的攔截器后,又想使默認攔截器,可配置成攔截器棧,再引用到action 3、當多個action都要引用同一個攔截器時,可配置為默認攔截器 <package name="interceptor" namespace="/" extends="struts-default"> <!-- 攔截器/棧配置部分 --> <interceptors> <!-- 配置攔截器 --> <interceptor name="time" class="com.interceptor.TimeInterceptor"></interceptor> <!-- 配置攔截器棧 --> <interceptor-stack name="mystack"> <interceptor-ref name="time"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 配置默認攔截器/棧 --> <default-interceptor-ref name="mystack"></default-interceptor-ref> <action name="hello" class="com.action.HelloAction"> <result>/index.jsp</result> <!-- 攔截器/棧引用部分 --> <interceptor-ref name="time"></interceptor-ref> </action> </package>5、方法攔截器(攔截action的方法)
java類//改為繼承的類是MethodFilterInterceptorpublic class ListInterceptor extends MethodFilterInterceptorstruts.xml需要注意的配置<interceptor name="" class=""> <param name="includeMethods">被攔截的方法名</param> <param name="excludeMethods">不被攔截的方法名</param></interceptor>6、案例:權限控制
login.jsp<body> <form action="login" method="post"> 請輸入姓名<input type="text" name="name"><br> <input type="submit" value="登錄"><br> </form> <a href="hello">去隱藏頁面</a></body>success.jsp為了便與測試該頁放在WEB-INF下(無法直接訪問)<body> <h1>user:${user}name:${name},歡迎您來到登錄后才能顯示的頁面!</h1></body> LoginAction.javapublic class LoginAction extends ActionSupport{ PRivate String name; @Override public String execute() throws Exception { // TODO 自動生成的方法存根 //把用戶名保存到session ActionContext.getContext().getSession().put("user", name); System.out.println("execute----------"+"put(user, name)"); return super.execute(); } public String getName() { return name; } public void setName(String name) { this.name = name; }} LoginInterceptor.javapublic class LoginInterceptor extends AbstractInterceptor{ //注意:如果是接口Interceptor是xwork2包下的 @Override public String intercept(ActionInvocation arg0) throws Exception { // TODO 自動生成的方法存根 //現獲取發起請求的action的名(沒有后綴),判斷是否為登錄的action String ActionName=arg0.getProxy().getActionName(); if (ActionName.equals("login")) { return arg0.invoke(); } Object object=arg0.getInvocationContext().getSession().get("user"); if (object==null) { System.out.println("LoginIntercept----------"+"object==null"); return Action.LOGIN; } return arg0.invoke(); }} HelloAction.javapublic class HelloAction extends ActionSupport{ private String name; @Override public String execute() throws Exception { // TODO 自動生成的方法存根 System.out.println("hello-------name="+ActionContext.getContext().getSession().get("user")); return super.execute(); } public String getName() { return name; } public void setName(String name) { this.name = name; }}struts.xml <package name="interceptor" namespace="/" extends="struts-default"> <interceptors> <interceptor-stack> <interceptor name="loginInterceptor" class="com.interceptor.LoginInterceptor"> </interceptor> <interceptor-stack name="mystack"> <interceptor-ref name="loginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 配置默認攔截器/棧 --> <default-interceptor-ref name="mystack"></default-interceptor-ref> <!-- 配置默認result --> <global-results> <result name="login">/login.jsp</result> </global-results> <action name="hello" class="com.action.HelloAction"> <result>/WEB-INF/success.jsp</result> </action> <action name="login" class="com.action.LoginAction"> <result>/WEB-INF/success.jsp</result> </action> </package>測試hello新聞熱點
疑難解答