`

在Struts中基于Spring的AOP MethodInterceptor(拦截器)的权限验证

阅读更多

程序是关于"某考试系统"中的aop应用.说实话,aop在spring应该算是个难点,它主是起到了"代理"的作 用,aop会为你调用的方法的对象生成代理,这个代理是继承调用 MethodInterceptor这个拦截器的对象的,所以,具备原有对象的所有方法与特性.AOP不神秘,它就是EJB的进化,只是EJB需要显式的实现接 口,而AOP不用,它会自动帮你生成代理,来做很多事情,AOP,我觉得它在处理事务 的时候用的比较多所谓声明式的事务就是由此而来.

   系统管理员进行后台管理或考生前台进行考试时,提交的请求都交给系统的控制器处理.例如在struts- config.xml文件中并未配置Action的实现类,仅仅配置了每个Action的url以及对应的局部forward映射.
   有的Action都交给Spring容器进行管理,用户请求发送到ActionServlet 后,ActionServlet将请求转发到Spring容器里的控制器.Spring的AOP 魔法发生在这个地方,当ActionServlet将请求发送到控制器时,并不是转给程序员实现的控制器,而是转给了控制器代理 -------------控制器代理会先执行权限检查,如果用户已经登录,回调程序员实现的控制器,否则直接进入登录页面.
    部分源代码如下

public class AuthorityInterceptor implements MethodInterceptor
{
    public Object invoke(MethodInvocation invocation) throws Throwable
 {
        HttpServletRequest request = null;
        ActionMapping mapping = null;
        Object[] args = invocation.getArguments();
        for (int i = 0 ; i < args.length ; i++ )
        {
            if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
            if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
        }
  Object admin = request.getSession().getAttribute("admin");
        if ( admin != null && ((String)admin).equals("admin"))
        {
            return invocation.proceed();
        }
        else
        {
     request.setAttribute("msg" , "您还没有登录,请先登录");
            return mapping.findForward("admin");
        }
    }
}

 

     该应用是在*.xml中来调用的..(用struts的mvc,然后托管给spring的ioc容器来管理的,配置也是由spring来处理的)

 

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
     <property name="beanNames">
            <list>
                <value>/processAddStudent</value>
                <value>/listStudent</value>
                <value>/delStudent</value>
                <value>/processAddTest</value>
                <value>/addQuestion</value>
                <value>/delQuestion</value>    
                <value>/processAddQuestion</value>
            </list>
     </property>
        <property name="interceptorNames">
            <list>
                <value>authorityInterceptor</value>
            </list>
        </property>
    </bean>

 <bean id="authorityInterceptor" class="org.yeeku.action.authority.AuthorityInterceptor"/>

 

 

//解释后的代码

 

 

public class AuthorityInterceptor implements MethodInterceptor
{
    public Object invoke(MethodInvocation invocation) throws Throwable
 {
        HttpServletRequest request = null;
        ActionMapping mapping = null;
 -----------注解1开始
       通过invocation.getArguments()可以获取代理对象的参数
        代理的参数是ActionMapping, ActionForm ,HttpServletRequest , HttpServletResponse 四个
        只不过,这里根据实际情况,我们只需要使用HttpServletRequest,ActionMapping罢了
        因为这里你要通过request获取session和通过mapping跳转页面
        因为 Object[] args = invocation.getArguments(); 规定,返回的必须是一个数组
        所以,没办法,只能迭代把要用的找出来
       而我们在XML配置的对象都是Struts Action
      每一个Struts Action方法都形如这样,
       public ActionForward addBlog(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
    所以,通过
      for (int i = 0 ; i < args.length ; i++ )
        {
            if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args [i];
            if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
        }

      可以从那里迭代出来
     你既然都有调用 Struts 了, mapping, form, request, response 肯定都已经注入了,咱们运行Struts, 是在 mapping, form, request,

     response 都具备的情况下,使用的
    所以, Object[] args = invocation.getArguments();
   得到应该对象的所有参数是完全可以的
   --------注解1结束

 

        Object[] args = invocation.getArguments();


       ---------加这两句是因为要通过request获取session 并且在判断没有权限的时候要通过mapping跳转页面

        for (int i = 0 ; i < args.length ; i++ )
        {
            if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];
            if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];
        }
  Object admin = request.getSession().getAttribute("admin");
 ----------
              如果权限有问题,
              那么invocation.procceed() 就不会执行,意味着你的那个 Action 对象**方法也不会执行, 但此时
              mapping 是存在的, 来一下findForward("admin");
        ----------

        if ( admin != null && ((String)admin).equals("admin"))
        {
            return invocation.proceed();
        }
        else
        {
     request.setAttribute("msg" , "您还没有登录,请先登录");
            return mapping.findForward("admin");
        }
    }
}

分享到:
评论

相关推荐

    spring 配置aop时需要的jar包

    这个库包括了如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.aop.Advice`等接口,它们定义了拦截器和通知(advice)的基本行为。在Spring AOP中,你需要实现这些接口来创建自定义的切面...

    java 拦截器例子

    Java拦截器(Interceptor)是Java应用开发中一种重要的设计模式,尤其在企业级应用和框架中,如Spring、Struts2、MyBatis等。它主要用于在方法执行前后添加额外的功能,比如日志记录、性能统计、事务管理、权限验证...

    aopalliance-1

    这些接口被Spring和Struts 2等框架使用,以实现切面的定义和拦截器的插入。 综合这些信息,我们可以了解到这个压缩包是为了解决Struts 2与Spring的集成问题,通过AOP Alliance来实现两者之间的兼容性。这有助于...

    com.springsource.org.aopalliance-1.0.0的jar包

    例如,在Spring框架中,我们可以通过实现这个接口来创建自定义的AOP拦截器,实现如事务管理、缓存控制等功能。 `Interceptor`接口则是AOP联盟的通用拦截器接口,它可以被任何AOP框架所使用。虽然`Interceptor`接口...

    ssh框架使用spring配置事务所需的jar包

    在Spring中,AOP Alliance的`org.aopalliance.intercept.MethodInterceptor`接口是所有拦截器必须实现的,它是Spring AOP和AspectJ AOP之间交互的基础。 其次,`aspectjrt.jar`是AspectJ运行时库,包含了运行时需要...

    Struts-Spring-JDK-MySql-的API

    - `Interceptor`接口:提供拦截器功能,可以在Action执行前后插入自定义逻辑,如日志、权限检查等。 - `Result`接口:定义了动作执行后如何展示结果,如转发、重定向等。 **Spring API** Spring是一个全面的Java...

    hibernate mybatis spring struts2 API

    在IT行业中,四个知名的Java框架——Hibernate、MyBatis、Spring和Struts2,是开发企业级应用的重要工具。这些框架分别专注于不同的领域,如对象关系映射(ORM)、依赖注入(DI)与面向切面编程(AOP)、Web应用程序...

    Spring所用Jar包

    在拦截器中,你可以通过这个接口获取方法参数、返回值等信息。 3. **AOP在Spring中的应用**: Spring的AOP模块允许开发者定义切面,这些切面可以包含通知(advisors),即在特定点(如方法调用前、后或异常时)...

    SSM事务管理所需jar包

    Spring的AOP模块就是基于这个库实现的,通过这些接口来定义拦截器和通知,实现事务管理的切面逻辑。 2. aspectjrt-1.2.jar:这是AspectJ运行时库,包含运行时支持类,使得我们可以在不改变原有代码的情况下添加新的...

    Java Web程序设计教程

    6.1.2拦截器及拦截器栈的应用 111 6.1.3自定义拦截器 115 6.2类型转换器 117 6.2.1struts2内置类型转换器 117 6.2.2引用类型的转换方式 117 6.2.3特殊对象的类型转换 118 6.2.4类型转换的错误处理 121 6.3...

Global site tag (gtag.js) - Google Analytics