Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 717|回复: 0

struts2中的拦截器

[复制链接]

该用户从未签到

发表于 2011-10-12 11:10:44 | 显示全部楼层 |阅读模式
struts2中的拦截器

一.理解拦截器
   1. 拦截器是在防问某个方法,字段之前或之后实施拦截,并且拦截器是可插拔的,拦截器是AOP的一种实现.
   2. 拦截器栈(Interceptor Stack)。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,
拦截器链中的拦截器就会按其之前定义的顺序被调用。

二.实现原理
    Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象

,然后串成一个列表,最后一个一个地调用列表中的拦截器

三.拦截器的配置
  1. 普通的拦截器

Xml代码
<package name="default" extends="struts-default"><BR>   
   <interceptors><BR>   
       <interceptor name="拦截器名1" class="拦截器实现类"/><BR>  
       <interceptor name="拦截器名2" class="拦截器实现类"/><BR>  
   </interceptors><BR>  

   <action name="login" class="com.Logon"><BR>  
  <interceptor-ref name="defaultStack"/><BR>  
        <interceptor-ref name="拦截器名1"/><BR>  
        <interceptor-ref name="拦截器名2"/><BR>  
        <result name="input">logon.jsp</result><BR>  
        <result name="success">/index.jsp</result><BR>  
   </action><BR>  
</package>  

<package name="default" extends="struts-default">
   <interceptors>
       <interceptor name="拦截器名1" class="拦截器实现类"/>
       <interceptor name="拦截器名2" class="拦截器实现类"/>
   </interceptors>
   <action name="login" class="com.Logon">
  <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="拦截器名1"/>
        <interceptor-ref name="拦截器名2"/>
        <result name="input">logon.jsp</result>
        <result name="success">/index.jsp</result>
   </action>
</package>

   2. 拦截器栈
Xml代码
<package name="default" extends="struts-default"><BR>  
   <interceptors><BR>   
        <interceptor name="拦截器名1" class="拦截器实现类"/><BR>   
        <interceptor name="拦截器名2" class="拦截器实现类"/><BR>  
        <interceptor-stack name="myStack"><BR>  
           <interceptor-ref name="拦截器名1"/><BR>  
           <interceptor-ref name="拦截器名2"/><BR>  
        </interceptor-stack><BR>  
    </interceptors><BR>  
    <action name="login" class="com.Logon"><BR>  
     <interceptor-ref name="defaultStack"/><BR>  
         <interceptor-ref name="myStack"/><BR>   
         <result name="input">login.jsp</result><BR>  
         <resultnameresultname="success" >/index.jsp</result><BR>   
    </action><BR>   
</package><BR>  

<package name="default" extends="struts-default">
   <interceptors>
        <interceptor name="拦截器名1" class="拦截器实现类"/>
        <interceptor name="拦截器名2" class="拦截器实现类"/>
        <interceptor-stack name="myStack">
           <interceptor-ref name="拦截器名1"/>
           <interceptor-ref name="拦截器名2"/>
        </interceptor-stack>
    </interceptors>
    <action name="login" class="com.Logon">
     <interceptor-ref name="defaultStack"/>
         <interceptor-ref name="myStack"/>
         <result name="input">login.jsp</result>
         <resultname="success" >/index.jsp</result>
    </action>
</package>
需要注意的是,如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以上面配置文件中手动

引入了默认拦截器

四.自定义拦截器
   1.直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。
   2.或者继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor
   3.通过<interceptor>元素来定义拦截器
   4.通过<interceptor-ref>元素来使用拦截器

五.使用拦截器实现权限控制
  1.功能
    使用自定义拦截器来完成用户权限的控制,当执行操作时,判断用户是否己经登陆,如果没有登陆跳转到登陆页面

  2.拦截器类

java代码
package com.interceptor;   
<BR>   
<BR>import com.opensymphony.xwork2.Action;   
<BR>import com.opensymphony.xwork2.ActionContext;   
<BR>import com.opensymphony.xwork2.ActionInvocation;   
<BR>import com.opensymphony.xwork2.interceptor.AbstractInterceptor;   
<BR>   
<BR>public class AuthorizationInterceptor extends AbstractInterceptor {   
<BR>   
<BR>    private static final long serialVersionUID = 1L;   
<BR>   
<BR>    @Override  
<BR>    public String intercept(ActionInvocation actionInvocation) throws Exception {   
<BR>           
<BR>        ActionContext actionContext = actionInvocation.getInvocationContext();   
<BR>           
<BR>        Object user = actionContext.get("user");   
<BR>           
<BR>        if(user != null){   
<BR>            return actionInvocation.invoke();   
<BR>        } else{   
<BR>            actionInvocation.getInvocationContext().put("nav_title", "你还没有登陆,请先登陆");   
<BR>            return Action.LOGIN;   
<BR>        }   
<BR>    }   
<BR>   
<BR>}   
<BR>  

package com.interceptor;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorizationInterceptor extends AbstractInterceptor {

private static final long serialVersionUID = 1L;

@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
  ActionContext actionContext = actionInvocation.getInvocationContext();
  Object user = actionContext.get("user");
  if(user != null){
   return actionInvocation.invoke();
  } else{
   actionInvocation.getInvocationContext().put("nav_title", "你还没有登陆,请先登陆");
   return Action.LOGIN;
  }
}

}


2.配置

Xml代码
<?xml version="1.0" encoding="UTF-8" ?><BR>  
<!DOCTYPE struts PUBLIC<BR>  
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<BR>  
    "http://struts.apache.org/dtds/struts-2.0.dtd"><BR>  
<struts>  <BR>  
   <package name="user" extends="struts-default">  
        <interceptors>  
            <!-- 定义拦截器  -->  
            <interceptor name="authority" class="com.interceptor.AuthorizationInterceptor"></interceptor>  
        </interceptors><BR>  
        <action name="user" class="com.UserAction"><BR>  
            <!-- 使用拦截器 -->  
            <interceptor-ref name="authority"/>  
            <interceptor-ref name="defaultStack"/>  
            <result name="succee">/logon/welcome.jsp</result><BR>  
            <result name="login">/logon/logon.jsp</result>  
        </action>  
    </package>  
</struts><BR>  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <package name="user" extends="struts-default">

     <interceptors>
      <!-- 定义拦截器  -->
      <interceptor name="authority" class="com.interceptor.AuthorizationInterceptor"></interceptor>
     </interceptors>

        <action name="user" class="com.UserAction">
         <!-- 使用拦截器 -->
         <interceptor-ref name="authority"/>
         <interceptor-ref name="defaultStack"/>
            <result name="succee">/logon/welcome.jsp</result>
            <result name="login">/logon/logon.jsp</result>
        </action>
    </package>
</struts>
访问http://localhost:8080/struts2-interceptor/user.action时,会判断用户是否登陆


六.方法拦截器
  1.Struts2提供MethodFilterInterceptor类,该类是AbstractInerceptor的子类,可以实现对Action方法的拦截.
  2. MethodFilterInterceptor中有两个方法
   setExcludeMethods:排除需要过滤的方法
     setIncludeMethods:设置需要过滤的方法
     如果一个方法同时在excludeMethods和includeMethods中出现,则会被拦截

  3.实现

拦截器

Java代码
package com.interceptor;   
<BR>   
<BR>import com.opensymphony.xwork2.ActionInvocation;   
<BR>import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;   
<BR>   
<BR>public class LogInterceptor extends MethodFilterInterceptor {   
<BR>   
<BR>    private static final long serialVersionUID = 1L;   
<BR>   
<BR>    private String name;   
<BR>      
<BR>    @Override  
<BR>    protected String doIntercept(ActionInvocation actionInvocation) throws Exception {   
<BR>      
<BR>        System.out.println("拦截器名称:" + name);   
<BR>        System.out.println("action:" + actionInvocation.getAction());   
<BR>           
<BR>        return actionInvocation.invoke();   
<BR>    }   
<BR>   
<BR>    public String getName() {   
<BR>        return name;   
<BR>    }   
<BR>   
<BR>    public void setName(String name) {   
<BR>        this.name = name;   
<BR>    }   
<BR>}   
<BR>  

package com.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class LogInterceptor extends MethodFilterInterceptor {

private static final long serialVersionUID = 1L;

private String name;

@Override
protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
  System.out.println("拦截器名称:" + name);
  System.out.println("action:" + actionInvocation.getAction());
  return actionInvocation.invoke();
}

public String getName() {
  return name;
}

public void setName(String name) {
  this.name = name;
}
}


action

Java代码
package com;<BR><BR>   
public class ManageAction {<BR><BR>   
    public String execute(){   
        System.out.println("execute....");<BR>   
        return "succee";   
    }<BR>   
  
    public String search(){<BR>   
        System.out.println("search....");   
        return "succee";   
    }   
    public String add(){   
        System.out.println("add....");   
        return "succee";   
    }   
}<BR>  

package com;
public class ManageAction {
public String execute(){
  System.out.println("execute....");
  return "succee";
}

public String search(){
  System.out.println("search....");
  return "succee";
}
public String add(){
  System.out.println("add....");
  return "succee";
}
}


struts.xml配置

Xml代码
<action name="manage" class="com.ManageAction"><BR>  
            <interceptor-ref name="log"><BR>  
                <param name="name">日志拦截</param><BR>  
                <!-- 设置需要拦截的方法,指定多个方法以逗号隔开 -->  
                <param name="includeMethods">execute,add</param><BR>  
                <!-- 设置不需要拦截的方法,execute在includeMethods中同时存在,execute会被拦截 --><BR>  
                <param name="excludeMethods">search,execute</param>  
            </interceptor-ref><BR>  
            <result name="succee">/welcome.jsp</result>  
         </action>  

<action name="manage" class="com.ManageAction">
          <interceptor-ref name="log">
           <param name="name">日志拦截</param>
           <!-- 设置需要拦截的方法,指定多个方法以逗号隔开 -->

           <param name="includeMethods">execute,add</param>
           <!-- 设置不需要拦截的方法,execute在includeMethods中同时存在,execute会被拦截 -->
           <param name="excludeMethods">search,execute</param>
          </interceptor-ref>
          <result name="succee">/welcome.jsp</result>
         </action>



打开浏览器访问 http://localhost:8080/struts2-interceptor/manage.action
会报执行execute方法,会执行拦截器
拦截器名称:日志拦截
action:com.ManageAction@1a0ae6d
execute....

当访问 http://localhost:8080/struts2-interceptor/manage!search.action
执行search方法,不会执行拦截器
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-22 17:06 , Processed in 0.426219 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表