`
yaerfeng1989
  • 浏览: 233042 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts-Menu角色权限的实例代码

阅读更多

STRUTS-MENU简介:
STRUTS-MENU支持静态和动态菜单,数据来源和显示方式分开,菜单文字国际化,权限。

1 <menu:useMenuDisplayer name="Velocity" config="/framework/res/menucomp/templates/xtree.html" bundle="org.apache.struts.action.MESSAGE" repository="userMenuRepository" permissions="rolesAdapter">
2  <logic:iterate id="menuName" name="userParentMenuNameList" indexId="index">
3  <menu:displayMenu name='<%=menuName.toString()%> ' />
4  </logic:iterate>
5  </menu:useMenuDisplayer>

原创整理不易,转载请注明出处:Struts-Menu角色权限的实例代码

代码下载地址:http://www.zuidaima.com/share/1724475036945408.htm

 

静态:只须在标签内加上

1 <menu:displayMenu name="Home" />


动态:在menu:useMenuDisplayer 中加上:repository="userMenuRepository"

显示样式:在menu:useMenuDisplayer 中加上:name="Velocity"

国际化:在menu:useMenuDisplayer 中加上:bundle="org.apache.struts.action.MESSAGE"

权限:在menu:useMenuDisplayer 中加上:permissions="rolesAdapter",如果名字是"rolesAdapter"则会自动调用
默认的net.sf.navigator.menu.RolesPermissionsAdapter:

01 /*
02  * RolesPermissionsAdapter.java
03  *
04  * Created on December 7, 2002 2:25 PM
05  */
06  
07 package net.sf.navigator.menu;
08  
09 import javax.servlet.http.HttpServletRequest;
10 import java.util.regex.Pattern;
11  
12 /**
13  * This class used container-managed security to check access
14  * to menus.  The roles are set in menu-config.xml.
15  *
16  * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
17  */
18 public class RolesPermissionsAdapter implements PermissionsAdapter {
19     private Pattern delimiters = Pattern.compile("(?<!\\\\),");
20     private HttpServletRequest request;
21  
22     public RolesPermissionsAdapter(HttpServletRequest request) {
23         this.request = request;
24     }
25  
26     /**
27      * If the menu is allowed, this should return true.
28      *
29      * @return whether or not the menu is allowed.
30      */
31     public boolean isAllowed(MenuComponent menu) {
32         if (menu.getRoles() == null) {
33             return true// no roles define, allow everyone
34         else {
35             // Get the list of roles this menu allows
36             String[] allowedRoles = delimiters.split(menu.getRoles());
37             for (int i=0; i < allowedRoles.length; i++) {
38                 if (request.isUserInRole(allowedRoles[i])) {
39                     return true;
40                 }
41             }
42         }
43         return false;
44     }
45 }


在显示菜单项时,会判断菜单所定义的角色是否与用户的角色吻合,是则显示,否则不显示。

如果使用ACEGI作为权限柜架,只须加上securityContextHolderAwareRequestFilter即可。

在前一个项目当中要根据登入用户的权限进行菜单显示:我把其中相关的代码提炼出来.
在系统启动时把菜单信息加载近来.通过扩展ActionServlet进行加载.

1 /**  
2  *加载菜单静态信息 
3  */ 
4 private void loadMenuRepository()  
5 {  
6      MenuConstructor menuConstructor=new MenuConstructor();  
7              menuConstructor.createMenuRepository();  
8 }


数据库表中一级菜单的roles值按2.4.8.16....增加 这样与用户的roles值进行位运算.只要值为1,就可以显示该菜单.

01 /** 
02  * 加载系统菜单入菜单库 
03  * @param defaultRepository :缺省库 
04  */ 
05 public void createMenuRepository()   
06 {  
07     ServletContext app=ApplicationContext.getContext();  
08        MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);  
09     MenuRepository repository = new MenuRepository();  
10        repository.setDisplayers(defaultRepository.getDisplayers());  
11        List list = getMenuComponents();  
12        for (int i=0; i < list.size(); i++)   
13        {  
14            MenuComponent mc = new MenuComponent();  
15            MenuInfo menu=(MenuInfo) list.get(i);  
16            String menuName = menu.getName();  
17            mc.setName(menuName);  
18            String parentName = (String) menu.getParentName();  
19            if (parentName != null)   
20            {  
21                MenuComponent parentMenu = repository.getMenu(parentName);  
22                if (parentMenu == null)   
23                {  
24                    parentMenu = new MenuComponent();  
25                    parentMenu.setName(parentName);  
26                    repository.addMenu(parentMenu);  
27                }  
28                mc.setParent(parentMenu);  
29            }  
30            String title = (String)menu.getTitle();  
31            String location = (String) menu.getLocation();  
32            String target = (String) menu.getTarget();  
33            String description = (String) menu.getDescription();  
34            String action=(String)menu.getAction();  
35            String roles=(String)menu.getRoles();  
36            mc.setTitle(title);                          
37            mc.setLocation(location);  
38            mc.setAction(action);  
39            mc.setTarget(target);              
40            mc.setDescription(description);  
41            mc.setRoles(roles);  
42            repository.addMenu(mc);  
43        }  
44        constant.setMenuRepository(repository);  
45        //因为加载出来的菜单信息被打乱了.  
46        //按照库表菜单顺序保存一级菜单信息,在struts-menu显示时要用  
47        app.setAttribute("OrderMenuList",getOrderMenuList());  
48 }  
49    
50 /** 
51  * 从数据库中读取菜单信息 
52  * @return List :菜单信息 
53  */ 
54    private static List getMenuComponents()   
55    {  
56     PersistenceService service = (PersistenceService)ApplicationContextProvider.getBean("persistenceService");  
57        String hql=QlConstructor.getSqlContent("getMenuInfo");  
58     List menuInfoList = service.list(hql);  
59     return menuInfoList;  
60    }  
61        
62    /** 
63     * 将菜单表中的一级菜单按照显示顺序取出来 
64     * @return List:一级菜单信息 
65     */ 
66    private static List getOrderMenuList()  
67    {  
68        List orderMenuList=new ArrayList();  
69        PersistenceService service = (PersistenceService)ApplicationContextProvider.getBean("persistenceService");  
70        String hql=QlConstructor.getSqlContent("getParentmenuSql");  
71        orderMenuList = service.list(hql);  
72        return orderMenuList;  
73    }
01 /** 
02  * 根据userId获取用户所能看到的菜单信息 
03  * @param   authSet         :用户权限集 
04  * @return  MenuRepository  : 用户所能看到的菜单库 
05  */ 
06 public MenuRepository getUserMenuRepository(long authSet)   
07 {  
08     Constant constant=Constant.getInstance();  
09     //获取系统所有菜单  
10     ServletContext app=ApplicationContext.getContext();  
11     MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);  
12     MenuRepository menuRepository=constant.getMenuRepository();  
13     MenuRepository userMenuRepository=new MenuRepository();  
14     userMenuRepository.setDisplayers(defaultRepository.getDisplayers());  
15     Set menuSet=menuRepository.getMenuNames();  
16     Iterator itor=menuSet.iterator();  
17     MenuComponent menuComponent =null;  
18     //查找满足用户权限的菜单项  
19     while(itor.hasNext())  
20     {  
21         String menuName=(String)itor.next();  
22         menuComponent = menuRepository.getMenu(menuName);  
23         long roles=Long.parseLong(menuComponent.getRoles());  
24         if((roles&authSet)!=0)  
25         {  
26             userMenuRepository.addMenu(menuComponent);                
27         }  
28     }  
29     //TODO:下面生成用户所能看到的菜单  
30     userMenuRepository=menuRepository;  
31     return userMenuRepository;  
32 }  
33    
34    /** 
35     * 获取用户所能看到的一级菜单列表,在画面展示时struts-menu标签需要用到 
36     * @param userMenuRepository    :用户自己的菜单库 
37     * @return  List: 用户能看到的一级菜单名称数组 
38     */ 
39 public List getParentMenuNameList(MenuRepository userMenuRepository) throws Exception  
40 {          
41        ServletContext app=ApplicationContext.getContext();  
42        List orderMenuList=(List)app.getAttribute("OrderMenuList");  
43        List parentMenuNameList=new ArrayList();  
44        for(int i=0;i<orderMenuList.size();i++)  
45        {  
46            String menuName=((MenuInfo)orderMenuList.get(i)).getName();  
47            if(userMenuRepository.getMenu(menuName)!=null)  parentMenuNameList.add(menuName);  
48        }         
49     return parentMenuNameList;  
50 }


显示菜单:

1 <menu:useMenuDisplayer name="Velocity" config="/framework/res/menucomp/templates/xtree.html" bundle="org.apache.struts.action.MESSAGE" repository="userMenuRepository" permissions="menuPermession">
2  <logic:iterate id="menuName" name="userParentMenuNameList" indexId="index">
3  <menu:displayMenu name='<%=menuName.toString()%>' />
4  </logic:iterate>
5  </menu:useMenuDisplayer>
1
0
分享到:
评论
2 楼 yaerfeng1989 2014-04-02  
bewithme 写道
没图没真象的文章,只能你自己欣赏了。

等我有空整理下哈。
1 楼 bewithme 2014-04-02  
没图没真象的文章,只能你自己欣赏了。

相关推荐

    Struts-Menu实例教程

    这个实例教程将深入介绍如何使用Struts-Menu来构建用户界面的导航系统。 1. **Struts框架基础** Struts是Java EE平台上的一款开源MVC框架,它提供了处理HTTP请求、业务逻辑整合以及视图渲染等功能。通过模型-视图-...

    struts-menu文件

    7. **权限控制**:Struts-menu支持与Spring Security或Apache Shiro等权限管理框架集成,可以实现菜单项的动态显示,根据用户的权限来决定哪些菜单可以被看到或点击。 8. **自定义扩展**:除了基本功能,开发者还...

    struts-menu-2.4.1.jar

    struts-menu-2.4.1.jar struts-menu-2.4.1.jar

    struts-menu集成struts2.3.1例子以及注意的地方

    例如,你可以通过在Action中处理用户角色和权限,然后在`struts-menu`的配置中过滤掉用户无权访问的菜单项。 总结一下,`struts-menu`与Struts2.3.1的集成可以帮助开发者快速构建优雅的Web应用菜单,减少页面布局的...

    使用Struts-menu轻松实现网页菜单.doc

    ### 使用Struts-menu实现网页菜单的关键知识点 #### Struts-menu简介 Struts-menu是一个基于Apache Struts框架的扩展,用于简化网页菜单的创建与管理。它不仅提供了多种样式的菜单,如下拉菜单(`DropDownMenu`)、...

    struts-menu实例

    2. **动态生成**:Struts-menu能够根据用户权限动态生成菜单。这意味着,对于不同角色的用户,显示的菜单可能会有所不同。这种功能对于多用户系统尤为重要,因为它可以确保用户只看到他们有权访问的菜单项。 3. **...

    struts-menu 人门 demo

    Struts-menu入门Demo是一个针对Java Web开发人员的实践教程,主要使用了Struts、Hibernate和MySQL这三大核心技术。这个入门示例提供了一个完整的项目结构,包括数据库文件,使得开发者能够直接运行并理解其工作原理...

    struts-menu例子

    这个例子是Struts-menu的一个实例,提供给需要了解或使用Struts-menu的开发者参考。下面将详细介绍Struts-menu及其在实际开发中的应用,以及如何利用提供的"struts-menu例子2"进行学习和实践。 1. **Struts-menu...

    struts-menu 2.4.3

    struts-menu 2.4.3.jar

    struts-menu权限按钮(项目例子)

    1. **配置**:首先,你需要在项目的配置文件中声明Struts-menu的相关配置,如菜单的结构、链接、图标等,并关联到特定的角色和权限。 2. **权限验证**:在用户登录时,系统会获取并存储该用户的角色和权限信息。...

    Struts-menu例子加视频

    4. **动态菜单**:Struts-menu支持动态生成菜单,这意味着菜单内容可以根据用户角色、权限或业务状态动态变化。这在多用户、多权限的复杂应用中非常实用。 5. **视频教程**:“速动画教程第十四集.exe”和“.rtf”...

    项目开发过程中使用Struts-menu

    6. **配置menu-config.xml**:这是Struts-menu的核心配置文件,定义了菜单的结构、显示样式和权限控制等。例如,`DropDownMenuDisplayer`、`SimpleMenuDisplayer`等都是不同的菜单显示方式,可以根据需要选择。 7. ...

    struts-menu-2.0

    范例代码通常会展示如何在JSP页面上使用Struts-menu标签库,比如`&lt;s:menu&gt;`标签,它允许你在页面上直接插入生成的菜单。通过设置不同的属性,你可以定制菜单的显示效果,如是否展开子菜单,菜单项的链接,以及图标等...

    struts-menu-2.4.jar

    struts-menu-2.4.jar,构建强大菜单

    struts-menu

    struts-menu

    Struts-menu源码分析(转贴).rar

    由于Struts-menu可能用于生成动态的用户权限相关的菜单,所以源码中可能会包含对用户角色和权限的判断逻辑。这部分内容可能涉及数据库查询、安全框架(如Spring Security)的集成等。 8. **性能优化**: 分析源码...

    struts-1.3.10 源代码

    struts-1.3.10 源代码struts-1.3.10 源代码struts-1.3.10 源代码struts-1.3.10 源代码struts-1.3.10 源代码struts-1.3.10 源代码

    struts-menu-2.4.3-src

    "struts-menu-2.4.3-src" 是 Struts Menu 的2.4.3版本的源代码包,这对于开发者深入理解其工作原理、进行定制化开发或者修复潜在问题非常有帮助。 在"struts-menu-2.4.3"这个压缩包中,我们可以期待找到以下内容: ...

    Struts-Menu.jar

    Struts-Menu.jar 是一个基于Java的开源项目,主要用于在Struts框架中生成动态菜单。Struts是一个广泛使用的MVC(Model-View-Controller)框架,它帮助开发者构建可维护性和扩展性良好的Web应用程序。StrutsMenu是...

Global site tag (gtag.js) - Google Analytics