博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决Spring中AOP不能切入Struts的DispatchAction方法的问题
阅读量:4047 次
发布时间:2019-05-25

本文共 2156 字,大约阅读时间需要 7 分钟。

在开发过程中,对于一系列的处理方 法,我们如果采用Action作为直接父类覆盖Execute方法直接处理的话,可能会造成Action子类过多,代码结构复杂,配置文件臃肿,代码阅读 困难等问题,因此对于同一系列的方法,我们可能采用将其放入DispatchAction的子类中去做,这样的话配置没那么麻烦,相同系列的方法放在一 起,这样解决了结构问题,可是新的问题又来了:Spring 的AOP在默认配置情况下是无法切入DispatchAction的方法的,因为DispatchAction内部的方法是通过策略设计模式实现的(根据 请求利用反射得到方法对象),为此,我想到了一种方法(在做权限管理的时候):

1、在struts-config.xml中加入下列控制器:

<controller>

   <set-property property="processorClass"  value="believems.hexun.com.web.action.privilege.PrivilegeInterceptor"/>
 </controller>

2、believems.hexun.com.web.action.privilege.PrivilegeInterceptor实现代码如下:

public class PrivilegeInterceptor extends org.springframework.web.struts.DelegatingRequestProcessor {

 @Override

 protected ActionForward processActionPerform(HttpServletRequest request,
   HttpServletResponse response, Action action, ActionForm form,
   ActionMapping mapping) throws IOException, ServletException {
  if(validatePrivilege(request, action, mapping)){//如果用户有权限,往后执行
   return super.processActionPerform(request, response, action, form, mapping);
  }else{
   request.setAttribute("message", "你没有权限执行该操作");
   request.setAttribute("urladdress", SiteUrl.readUrl("control.control.right"));
   return mapping.findForward("message");
  }  
 }
 /**
  * 验证用户权限
  * @return
  */
 private boolean validatePrivilege(HttpServletRequest request,
   Action action, ActionMapping mapping) {  
  Method method = getCurrentMethodName(request, action, mapping);//获取当前执行的方法

  //判断用户权限

  //如果有权限,返回true,否则返回false

  }
 /**
  * 获取当前执行的方法
  * @return
  */
 private Method getCurrentMethodName(HttpServletRequest request, Action action, ActionMapping mapping){
  String methodname = "execute";
  if(DispatchAction.class.isAssignableFrom(action.getClass()))//判断DispatchAction是否是所传过来的Action指向对象的父类
  //如果是,则根据请求参数,取得将要执行的方法名称,并且通过反射技术取得这个方法,采用AOP切入!如果不是的话,则证明是执行的是Action的execute方法,返回execute的方法的对象。
  {
   methodname = request.getParameter(mapping.getParameter());//根据struts配置文件中dispatchAction的Parameter取得要执行的方法名称
  }
  Method method = null;
  try {
   method = action.getClass().getDeclaredMethod(methodname, ActionMapping.class, ActionForm.class,
     HttpServletRequest.class,HttpServletResponse.class);//返回要执行的方法
  } catch (Exception e) {}
  return method;
 }

}

利用这种方法,就可以实现spring的AOP对dispatchAction的切入了!

转载地址:http://jefci.baihongyu.com/

你可能感兴趣的文章
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret&nbsp;1.1&nbsp;正在审核中
查看>>
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>