struts spring aop 权限验证

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将请求发送到控制器时,并不是转给程序员实现的控制器,而是转给了控制器代理 -------------控制器代理会先执行权限检查,如果用户已经登录,回调程序员实现的控制器,否则直接进入登录页面.
    部分源代码如下

[java]  view plain copy
  1. public class AuthorityInterceptor implements MethodInterceptor  
  2. {  
  3.     public Object invoke(MethodInvocation invocation) throws Throwable  
  4.  {  
  5.         HttpServletRequest request = null;  
  6.         ActionMapping mapping = null;  
  7.         Object[] args = invocation.getArguments();  
  8.         for (int i = 0 ; i < args.length ; i++ )  
  9.         {  
  10.             if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];  
  11.             if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];  
  12.         }  
  13.   Object admin = request.getSession().getAttribute("admin");  
  14.         if ( admin != null && ((String)admin).equals("admin"))  
  15.         {  
  16.             return invocation.proceed();  
  17.         }  
  18.         else  
  19.         {  
  20.      request.setAttribute("msg" , "您还没有登录,请先登录");  
  21.             return mapping.findForward("admin");  
  22.         }  
  23.     }  
  24. }  


 

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

 

[html]  view plain copy
  1. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  2.      <property name="beanNames">  
  3.             <list>  
  4.                 <value>/processAddStudent</value>  
  5.                 <value>/listStudent</value>  
  6.                 <value>/delStudent</value>  
  7.                 <value>/processAddTest</value>  
  8.                 <value>/addQuestion</value>  
  9.                 <value>/delQuestion</value>      
  10.                 <value>/processAddQuestion</value>  
  11.             </list>  
  12.      </property>  
  13.         <property name="interceptorNames">  
  14.             <list>  
  15.                 <value>authorityInterceptor</value>  
  16.             </list>  
  17.         </property>  
  18.     </bean>  
  19.   
  20.  <bean id="authorityInterceptor" class="org.yeeku.action.authority.AuthorityInterceptor"/>  



 

 

//解释后的代码

 

 

[java]  view plain copy
  1. public class AuthorityInterceptor implements MethodInterceptor  
  2. {  
  3.     public Object invoke(MethodInvocation invocation) throws Throwable  
  4.  {  
  5.         HttpServletRequest request = null;  
  6.         ActionMapping mapping = null;  
  7.  -----------注解1开始  
  8.        通过invocation.getArguments()可以获取代理对象的参数  
  9.         代理的参数是ActionMapping, ActionForm ,HttpServletRequest , HttpServletResponse 四个  
  10.         只不过,这里根据实际情况,我们只需要使用HttpServletRequest,ActionMapping罢了  
  11.         因为这里你要通过request获取session和通过mapping跳转页面  
  12.         因为 Object[] args = invocation.getArguments(); 规定,返回的必须是一个数组  
  13.         所以,没办法,只能迭代把要用的找出来  
  14.        而我们在XML配置的对象都是Struts Action  
  15.       每一个Struts Action方法都形如这样,  
  16.        public ActionForward addBlog(ActionMapping mapping, ActionForm form,  
  17.    HttpServletRequest request, HttpServletResponse response)  
  18.     所以,通过  
  19.       for (int i = 0 ; i < args.length ; i++ )  
  20.         {  
  21.             if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args [i];  
  22.             if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];  
  23.         }  
  24.   
  25.       可以从那里迭代出来  
  26.      你既然都有调用 Struts 了, mapping, form, request, response 肯定都已经注入了,咱们运行Struts, 是在 mapping, form, request,  
  27.   
  28.      response 都具备的情况下,使用的  
  29.     所以, Object[] args = invocation.getArguments();  
  30.    得到应该对象的所有参数是完全可以的  
  31.    --------注解1结束  
  32.   
  33.    
  34.   
  35.         Object[] args = invocation.getArguments();  
  36.   
  37.   
  38.        ---------加这两句是因为要通过request获取session 并且在判断没有权限的时候要通过mapping跳转页面  
  39.   
  40.         for (int i = 0 ; i < args.length ; i++ )  
  41.         {  
  42.             if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];  
  43.             if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];  
  44.         }  
  45.   Object admin = request.getSession().getAttribute("admin");  
  46.  ----------  
  47.               如果权限有问题,  
  48.               那么invocation.procceed() 就不会执行,意味着你的那个 Action 对象**方法也不会执行, 但此时  
  49.               mapping 是存在的, 来一下findForward("admin");  
  50.         ----------  
  51.         if ( admin != null && ((String)admin).equals("admin"))  
  52.         {  
  53.             return invocation.proceed();  
  54.         }  
  55.         else  
  56.         {  
  57.      request.setAttribute("msg" , "您还没有登录,请先登录");  
  58.             return mapping.findForward("admin");  
  59.         }  
  60.     }  
  61. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值