快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

兴发娱乐官网手机版客户端:SSH集成框架下真正实现Spring AOP拦截功能



问题的提出:

在Struts1框架下,有三种类型的Action节制器,分手是MappingDispatchAction、DispatchAction和Action,他们是依次承袭,终极履行的execute措施。但MappingDispatchAction、DispatchAction的子类中没有execute措施,只有参数指定的详细措施,而这些措施是被MappingDispatchAction、DispatchAction本类的execute措施调用履行,分外留意的是它是经由过程反射机制来做的(大年夜家可以看看DispatchAction类的源代码),以是这些被反射调用的措施是不能被Spring AOP拦截的,是以也就无法使用切面编程实现权限节制了。

办理措施:

巴巴运动网经由过程覆盖DelegatingRequestProcessor节制器的processActionPerform措施,是一种抱负的办理规划,但严格来说并不是AOP切面编程措施。是以笔者仅从进修AOP切面编程的角度来提出本文章,对付实用性笔者逝世力保举巴巴运动网的规划。

本措施办理思惟:

1.覆盖execute措施,再仿照DispatchAction反射调用详细的措施;

2.实现Spring AOP拦截点,开始拦截设置设置设备摆设摆设描述的范围内的法度榜样;

3.在切入点法度榜样中再次实现反射机制,获取履行措施上的权限设置设置设备摆设摆设信息;

4.根据权限信息抉择放行照样返回。

终极既可以拦截到execute措施,也可以获得详细措施中的权限评释设置设置设备摆设摆设信息。以本BBS系统为例:

第一步:凡承袭于DispatchAction的类都覆盖execute措施:

@Override

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) throws Exception {

return super.execute(mapping, form, request, r兴发娱乐官网手机版客户端esponse);

}

//要是这个action中有一个详细的措施:

@Privilege(userType=PrivilegeType.Admin,message="需治理员权限!")

public ActionForward addUI(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) throws Exception {

CategoryForm categoryForm = (CategoryForm)form;

categoryForm.setTitle("新增分类");

return mapping.findForward("addUI");

}

第二步:做自己的权限设置设置设备摆设摆设:

看上面addUI措施上的评释应该可以理解这些设置设置设备摆设摆设

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface Privilege {

String message() default "您没有权限履行该操作,请登录后重试!";

PrivilegeType userType();

}

设置设置设备摆设摆设中有个字字段是罗列,源码如下:

publ兴发娱乐官网手机版客户端ic enum PrivilegeType {

LoginUser{

public String getName(){

return "所有登任命户";

}

public int getValue(){

return 1;

}

},

LoginUserSelf{

public String getName(){

return "登任命户自己";

}

public int getValue(){

return 2;

}

},

Moderator{

public String getName(){

return "版主";

}

public int getValue(){

return 3;

}

},

Admin{

public String getName(){

return "治理员";

}

public int getValue(){

return 4;

}

};兴发娱乐官网手机版客户端

public abstract String getName();

public abstract int getValue();

}

第三步:实现AOP切入编程:

@Aspect

@Component()

public class PrivilegeAction {

//拦截com.zjh包下(含子包)所有类能返回ActionForward类型的措施

@Around("execution(org.apache.struts.action.ActionForward com.zjh..*.*(..))")

public Object validatePrivilege(ProceedingJoinPoint pjp) throws Throwable{

// 从拦截的措施中参数中获得四个工具

ActionMapping mapping = (Acti兴发娱乐官网手机版客户端onMapping) pjp.getArgs()[0];

ActionForm form = (ActionForm) pjp.getArgs()[1];

HttpServletRequest request = (HttpServletRequest) pjp.getArgs()[2];

HttpServletResponse response = (HttpServletResponse) pjp.getArgs()[3];

//从拦截点处获取它所处的类名,并颠末反射取得权限设置设置设备摆设摆设信息

Class dispatchAction = Class.forName(pjp.getSignature().getDeclaringTypeName()); Object obj = dispatchAction.newInstance(); String mappingParament = mapping.getParameter()==null ? "execute" : request.getParameter(mapping.getParameter()); Method method = obj.getClass().getDeclaredMethod(mappingParament,

ActionMapping.class,

ActionForm.class,

HttpServle兴发娱乐官网手机版客户端tRequest.class,

HttpServletResponse.class); Privilege privilege = method.getAnnotation(Privilege.class);

//假如措施上没有设置设置设备摆设摆设权限信息,直接放行

if(privilege==null)

return (ActionForward)pjp.proceed();

//否则必须是登任命户,进行第一关粗粒度拦截

User user = WebUtil.getUserInSession(request);

if(user==null){

request.setAttribute("message", privilege.message());

return mapping.findForward("message");

} //再根据用户类型进行细粒度拦截

switch(privilege.userType().getValue()){

//当权限为PrivilegeType.LoginUserSelf(登任命户自己,例如更新文章必须是自

//己的文章才有权限更新)时,须从数据库里取得用户工具再和session顶用

//户匹配,这个没有实现。

case 2:

if(!user.getUsername().equals("数据库里取得某文章的用户名")){

request.setAttribute("message", privilege.message());

return mapping.findForward("message");

}

break;

//版主权限拦截,这个没有实现

case 3:

request.setAttribute("message", privilege.message());

return mapping.findForward("message");

//治理员权限,从application取得治理员用户名,再匹配session登任命户是否相等

case 4:

String admin = ((SystemProperty)request.getSession().getServletContext().getAttribute("config"))

.getAdminUsername();

if(!user.getUsername().equals(admin)){

request.setAttribute("message", privilege.message());

return mapping.findForward("message");

}

break;

}

//当上面没有拦住,表示权限容许,放行

return (ActionForward)pjp.proceed();

}

}

以上细粒度拦截属营业逻辑,不阴碍本文所述的AOP切面编程。笔者仅仅是为进修AOP,真正用在真实项目的权限拦截,规划不太成熟。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: