打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
自定义AOP技术实现对action方法进行拦截并实现权限拦截

(1)@Retention(RetentionPolicy.SOURCE)代表@Permission注解只保留在源代码阶段。@Retention(RetentionPolicy.CLASS)代表@Permission注解既要保留在源代码上面也要保留在编译后的Class文件上面。@Retention(RetentionPolicy.RUNTIME)代表@Permission注解既要保留在源代码上面也要保留在编译后的Class文件上面,并且随着类被装载到虚拟机的时候@Permission注解也要被装载到虚拟机内部。

(2)@Target(ElementType.METHOD)代表@Permission注解只能标注在方法上面。默认情况可以不用这个注解。

(3)@Permission注解属性前面不用加public,在不同包下一样可以访问@Permission注解。属性名后面加();

 

@Retention(RetentionPolicy.RUNTIME)//代表Permission注解保留在的阶段

@Target(ElementType.METHOD)

public @interface Permission {//代表action方法上的注解   

 

String module();

 

String privilege();

}

(4)struts-config.xml在文件中最后内容更换成红色字体部分

<controller><set-property property="processorClass" value="cn.itcast.web.action.privilege.PrivilegeRequestProcessor"/>

</controller> 

(5)继承DelegatingRequestProcessor类并重写processActionPerform方法

package cn.itcast.web.action.privilege

public class PrivilegeRequestProcessoextends DelegatingRequestProcessor {

 

@Override

protected ActionForward processActionPerform(HttpServletRequest request,

HttpServletResponse response, Action action, ActionForm form,

ActionMapping mapping) throws IOException, ServletException {

(6)只对办公平台中的action进行校验

if(WebUtil.getRequestURI(request).startsWith("/control/")) { if(!validate(request, action, mapping)) {//没有权限的时候执行下面这段代码

request.setAttribute("message""你没有执行该操作的权限");

request.setAttribute("urladdress"SiteUrl.readUrl("control.control.right"));

return mapping.findForward("message");

}

}

return super.processActionPerform(request, response, action, form, mapping);

}

 

 

 

private boolean validate(HttpServletRequest request, Action action, ActionMapping mapping) {

Method method getCurrentMethod(request, action, mapping);

(11)判断方法上是否有自定义的权限注解

if(method!=null && method.isAnnotationPresent(Permission.class)){

(12)得到方法上的注解

Permission permission method.getAnnotation(Permission.class);    //下面是得到执行方法需要的权限

SystemPrivilege methodPrivilege new SystemPrivilege(new SystemPrivilegePK(permission.module(), permission.privilege()));

Employee employee WebUtil.getEmployee(request);

for(PrivilegeGroup group employee.getGroups()) {

if(group.getPrivileges().contains(methodPrivilege)) {

return true;

}

}

return false;

}

return true;

}

 

private Method getCurrentMethod(HttpServletRequest request, Action action,ActionMapping mapping) {

String methodName "execute";

(7)判断DispatchAction是否是action.getClass()的父类

Class1.isAssignableFrom(Class2)这个方法在如下情况下返回true (1)class1class2是同一类型 则返回true(2)class1class2的超类或超接口 则返回true. 

(8)action.getClass()请求的action

if(DispatchAction.class.isAssignableFrom(action.getClass())) { methodName 

(9)取得由请求参数指定的方法名称

request.getParameter(mapping.getParameter());

}

try {

(10)取得被拦截Method方法。如果用户在地址栏给method参数乱输入一个字符串,就会报错,返回值为null

Return action.getClass().getMethod(methodName,ActionMapping.class, ActionForm.class,HttpServletRequest.class, HttpServletResponse.class);

catch (Exception e) {

}

return null;

}

}


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python API 接口权限控制思路
DRF之访问权限控制和访问频率控制(节流)
java责任链模式及项目实际运用
python测试开发django-61.权限认证(permission)
Android桌面快捷方式那些事与那些坑 android 模拟点击
自定义action和permission
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服