博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2技巧与解惑——使用包(package)和拦截器(interceptor)分配和处理权限
阅读量:5992 次
发布时间:2019-06-20

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

  在学习了struts2框架后,我萌生了一个想法:可不可以使用包(package)分配权限,而在拦截器中拦截到请求来检测权限是否足够?

  ps:希望大家和我一样喜欢多思考。不过在很长一段时间中我都以为是自己发明了这个技术……实际上很多项目都很好地应用了,只是一个小技巧而已……

  废话不多说,我先将struts.xml配置贴上来大家看看:

1 
2 3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/WEB-INF/page/error.jsp
20
toLogin
21
viewAllSubjects
22
23
24
/WEB-INF/page/error.jsp
25
26
28
/index.jsp
29
30
32
/WEB-INF/page/view.jsp
33
34
35
/WEB-INF/page/vote.jsp
36
37
38
/index.jsp
39
40
41
42
43
45
/WEB-INF/page/reg_success.jsp
46
/WEB-INF/page/register.jsp
47
48
49
viewAllSubjects
50
/WEB-INF/page/login.jsp
51
52
53
/WEB-INF/page/register.jsp
54
55
56
/WEB-INF/page/login.jsp
57
58
59
60
61
62
/WEB-INF/page/saveorupdate.jsp
63
64
66
/WEB-INF/page/vote_success.jsp
67
vote
68
69
71
/WEB-INF/page/saveorupdate_success.jsp
72
73
74
/WEB-INF/page/saveorupdate.jsp
75
76
78
/WEB-INF/page/manage.jsp
79
80
81

  上文就用包(package)将不同角色的可做操作“圈”到了一起。

  ps:上文是一个在线投票系统的配置,在做项目时并未加入Spring,因为还没学……

  默认包中有一些公共的属性和普通用户需要登录后才能进行的操作,实际上你可以使用多个包或使用嵌套的方式来约定包。

  而上文引用的拦截器定义如下:

1 package web.interceptor; 2  3 import java.util.Arrays; 4 import java.util.Map; 5  6 import org.apache.struts2.dispatcher.Dispatcher; 7  8 import orm.VoteUser; 9 10 import com.opensymphony.xwork2.Action;11 import com.opensymphony.xwork2.ActionContext;12 import com.opensymphony.xwork2.ActionInvocation;13 import com.opensymphony.xwork2.config.entities.PackageConfig;14 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;15 16 /**17  * 缺省或默认的拦截器,用于拦截用户的未授权权请求 例如未登录用户的各种操作和普通用户的权限分配18  * 19  * @author Johness20  * 21  */22 public class DefaultInterceptor extends AbstractInterceptor {23 24     private static final long serialVersionUID = -2780681965998483504L;25 26     /**27      * 常量值:表示用户用于登录和注册时请求的控制器所在包名 此值可以作为配置参数获取,而此处使用了固定值28      */29     private static final String PACKAGE_NAME_LOGINANDREGISTER = "loginandregister";30     /**31      * 常量值:表示用于管理员用户的特殊权限 此值可以作为配置参数获取,而此处使用了固定值32      */33     private static final String PACKAGE_NAME_ADMINRIGHTS = "adminrights";34 35     /**36      * 登录或注册的请求“动作” 已登录用户不需要进行这些请求 此数组维护的控制器名称需要依靠上文的参数动态获取37      */38     private static String[] loginAndRegister;39     /**40      * 管理员权限“动作” 普通用户不能越权 此数组维护的控制器名称需要依靠上文的参数动态获取41      */42     private static String[] adminRights;43 44     /**45      * 为上文数组填充数据 此方法中使用了一些固定值46      */47     public void preData() {48         Map
map = Dispatcher.getInstance()49 .getConfigurationManager().getConfiguration()50 .getPackageConfigs();51 PackageConfig lar = map.get(PACKAGE_NAME_LOGINANDREGISTER);52 if (null != lar && lar.getActionConfigs().size() > 0)53 loginAndRegister = lar.getActionConfigs().keySet()54 .toArray(new String[] {});55 else56 loginAndRegister = new String[] { "toRegister", "toLogin",57 "register", "login" };58 PackageConfig ar = map.get(PACKAGE_NAME_ADMINRIGHTS);59 if (null != ar && ar.getActionConfigs().size() > 0)60 adminRights = map.get(PACKAGE_NAME_ADMINRIGHTS).getActionConfigs()61 .keySet().toArray(new String[] {});62 else63 adminRights = new String[] { "addSubject", "saveSubject",64 "modifySubjects", "modify" };65 66 // 因为要使用二分查询,所以必须排序67 Arrays.sort(loginAndRegister);68 Arrays.sort(adminRights);69 }70 71 @Override72 public String intercept(ActionInvocation arg0) throws Exception {73 // 登录用户74 VoteUser logUser = (VoteUser) ActionContext.getContext().getSession()75 .get("logUser");76 // 请求的控制器名称77 String actionName = ActionContext.getContext().getName();78 79 // 如需要,则填充数据80 if (null == loginAndRegister)81 this.preData();82 83 // 如果用户没用登录且并不请求登录或注册,则请用户登录84 if (null == logUser85 && Arrays.binarySearch(loginAndRegister, actionName) < 0)86 return Action.LOGIN;87 // 如果用户已经登录并请求登录或注册或者普通用户请求管理员操作,则忽略用户请求88 if (Arrays.binarySearch(loginAndRegister, actionName) >= 0 || (logUser89 .getVuVersion() == 0 && Arrays.binarySearch(90 adminRights, actionName) >= 0))91 return "toIndex";92 return arg0.invoke();93 }94 }

  值得一提的是上文的拦截器属性可以不定义为静态,但是通过struts得到包和包内控制器名称的方法在我的印象中似乎不能写在静态块中(也许我记忆有误)。而数据填充方式大家可以自定义,此类在一个Web进程中有一个实例即可。

  代码肯定是有待改进,不过好歹也是自己想到的并做到了,鼓励一下吧。

 

 欢迎您移步我们的交流群,无聊的时候大家一起打发时间:

 或者通过QQ与我联系:

 (最后编辑时间2012-12-26 15:41:53)

 

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

你可能感兴趣的文章
9月7日学习内容整理:内置函数
查看>>
linux黄金命令[积累中]
查看>>
python 几种不同的格式化输出
查看>>
站立会议(三)
查看>>
MarkdownPad2基础语法
查看>>
mysql 8.0 ~ 存储和账户
查看>>
贪心 Codeforces Round #236 (Div. 2) A. Nuts
查看>>
特定场景下SQL的优化
查看>>
UrlPager免费分页控件2.0版发布!
查看>>
Django介绍&工程搭建
查看>>
解除svn控制下的文件夹的svn的控制
查看>>
P2051 中国象棋
查看>>
AsyncTask 实现异步处理任务
查看>>
sql
查看>>
Python-列表
查看>>
HDU5461 Largest Point 思维 2015沈阳icpc
查看>>
MySQL忘记root密码不重启mysqld的方法
查看>>
2014/12/05 随笔 2014-12-05 12:50 26人阅读 评论(0) 收藏...
查看>>
使用OpenGL一年后
查看>>
快速排序
查看>>