`
kang275284
  • 浏览: 165333 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Struts-Menu结合角色权限的应用

阅读更多

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

代码
  1. /**   
  2.  *加载菜单静态信息  
  3.  */  
  4. private void loadMenuRepository()   
  5. {   
  6.      MenuConstructor menuConstructor=new MenuConstructor();   
  7.              menuConstructor.createMenuRepository();   
  8. }   
<script type="text/javascript">render_code();</script>
数据库表中一级菜单的roles值按2.4.8.16....增加 这样与用户的roles值进行位运算.只要值为1,就可以显示该菜单.
代码
  1. /**  
  2.  * 加载系统菜单入菜单库  
  3.  * @param defaultRepository :缺省库  
  4.  */  
  5. public void createMenuRepository()    
  6. {   
  7.     ServletContext app=ApplicationContext.getContext();   
  8.        MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);   
  9.     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.    }   
<script type="text/javascript">render_code();</script>

 

 

代码
  1. /**  
  2.  * 根据userId获取用户所能看到的菜单信息  
  3.  * @param   authSet         :用户权限集  
  4.  * @return  MenuRepository  : 用户所能看到的菜单库  
  5.  */  
  6. public MenuRepository getUserMenuRepository(long authSet)    
  7. {   
  8.     Constant constant=Constant.getInstance();   
  9.     //获取系统所有菜单   
  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. }   
<script type="text/javascript">render_code();</script>
显示菜单:
代码
  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>  
<script type="text/javascript">render_code();</script> 

这样的权限系统不通用,且过于简单
第一,不要基于structs,要基于JSP规范才能更通用
第二,不要把控制菜单放在主要位置,把菜单对应URL控制住即可,做一个过滤器即可完成这些工作。
第三、要把系统中的数据资源提取控制住。
第四、要提供丰富的开发接口给别人。比如工作流系统。
权限系统不仅仅是要控制菜单,更多的是企业组织机构模型、
应用模型的建立。

 

public MenuRepository getUserMenuRepository(long authSet)
{
Constant constant=Constant.getInstance();
//获取系统所有菜单
ServletContext app=ApplicationContext.getContext();
MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
MenuRepository menuRepository=constant.getMenuRepository();
MenuRepository userMenuRepository=new MenuRepository();
userMenuRepository.setDisplayers(defaultRepository.getDisplayers());
Set menuSet=menuRepository.getMenuNames();
Iterator itor=menuSet.iterator();
MenuComponent menuComponent =null;
//查找满足用户权限的菜单项
while(itor.hasNext())
{
String menuName=(String)itor.next();
menuComponent = menuRepository.getMenu(menuName);
long roles=Long.parseLong(menuComponent.getRoles());
if((roles&authSet)!=0)
{
userMenuRepository.addMenu(menuComponent);
}
}
//TODO:下面生成用户所能看到的菜单
userMenuRepository=menuRepository;
return userMenuRepository;
}
就代码本身而言,
userMenuRepository=menuRepository;
不久已经全部恢复了?

返回顶端
浏览作者的博客 浏览作者资料 最后更新: 2007-05-10 17:05  
Good(0)    Bad_1(0)   正在投票中...
gch4302
等级: 初级会员
gch4302的博客:gch4302

性别:
文章: 9
积分: 0
来自: 兰州

       时间: 2007-05-21 18:26    收藏     

怎样才能得到任意一个菜单节点在数据库中对应的id号呢?
我想能过节点的id号,在右键中实现删除,更新,添加这三个功能。
可就是不知如何得到节点的id号,请大家帮助兄弟一把。

返回顶端
浏览作者的博客 浏览作者资料 最后更新: 2007-05-21 18:26  
Good(0)    Bad_1(0)   正在投票中...
siyuliu
等级: 初级会员
siyuliu的博客:siyuliu

文章: 9
积分: 52

       时间: 2007-06-28 17:18    收藏     

我在做由数据库动态产生菜单的时候总是提醒我这个错误:
javax.servlet.jsp.JspException: The displayer mapping for the specified MenuDisplayer does not exist

请哪位大侠帮我看看问题,不胜感谢

代码如下:
struts-config.xml 中有:
<plug-in className="net.sf.navigator.menu.MenuPlugIn">
<set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/>
</plug-in>

meny-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<MenuConfig>
<Displayers>
<Displayer name="ListMenu"
type="net.sf.navigator.displayer.ListMenuDisplayer"/>
</Displayers>
</MenuConfig>

Action 类里面已经写入了

MenuRepository repository = new MenuRepository();
.
.
.
request.setAttribute("examplesRepository", repository);

jsp页:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %>

<menu:useMenuDisplayer name="ListMenu" repository="examplesRepository">
<menu:displayMenu name="DatabaseMenu"/>

分享到:
评论

相关推荐

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

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

    Struts-menu例子加视频

    6. **集成与扩展**:Struts-menu可以轻松集成到现有的Struts应用中,同时也允许开发者进行扩展,例如添加新的菜单样式、行为或者与第三方权限框架的整合。 7. **实践应用**:通过提供的例子,学习者可以了解如何在...

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

    Struts-menu正是为了解决这一问题而诞生的,它将权限按钮的展示与用户的权限紧密结合起来。 Struts是Apache软件基金会下的一个开源MVC框架,用于构建基于Java的、可维护性高的Web应用程序。在Struts框架中,开发者...

    权限控制(struts2+hibernate+spring+struts-menu+valuelist)

    在项目中,struts-menu会基于用户的角色和权限信息,生成仅包含用户有权访问的菜单,这样可以确保用户界面的简洁性和安全性。 最后,valuelist是实现信息分页的一种机制,它帮助在大量数据列表中分页展示结果,提升...

    基于数据库的struts-menu.rar

    4. **Action类**:在Struts框架中创建一个Action,负责调用DAO获取当前用户有权访问的菜单,可能需要结合用户登录信息和角色权限。 5. **Session Action**:可能需要使用Session Action将菜单数据保存在用户的会话...

    J2EE 0.4—加入批量CRUD功能、加入框架页面、加入struts-menu等

    在实际开发中,这三部分的结合意味着开发者正在构建一个具有高效数据管理能力的J2EE应用,用户界面通过框架页面保持一致性和易用性,同时通过Struts Menu提供基于角色的动态菜单导航。这样的系统既满足了业务需求,...

    初涉StrutsMenu

    在Struts2框架中,StrutsMenu还支持与Struts2的拦截器结合,实现动态加载用户权限相关的菜单。你可以在用户的登录信息中存储权限标识,然后在拦截器中根据这些权限过滤掉无权访问的菜单项。 总的来说,StrutsMenu是...

    struts_menu源码web集成

    Struts_Menu则是针对Struts框架的一个扩展,主要用于生成动态的、可配置的菜单结构,这在大型企业级应用中十分常见,因为它可以灵活地根据用户角色和权限展示不同的菜单项。 Struts_Menu的核心组件包括以下几个部分...

    struts+hibernate的一个菜单框架

    而在Struts层面,可能会有一个专门的Action来处理菜单的请求,根据用户角色和权限动态生成菜单结构。这可能涉及到Session级的缓存或者拦截器来实现权限检查。 项目中的`webModel`目录可能包含了Struts的模型组件,...

    struts做的权限设计

    ### Struts实现的权限设计详解 #### 一、资源(Resource) 在系统权限设计中,**...通过上述介绍,我们可以看到,通过配置文件的方式定义角色和资源,并结合框架本身的扩展,可以灵活地实现各种复杂的权限控制需求。

    SSH的用户角色菜单管理

    SSH(Struts2 + Spring + Hibernate)是Java开发中常用的一个集成框架,它结合了Struts的MVC设计模式、Spring的依赖注入以及Hibernate的对象关系映射,为开发者提供了一个强大的企业级应用开发基础。在"SSH的用户...

    java的细粒度权限和shiro权限校验 ssh

    5. **细粒度权限实现**:在Hibernate层面,可以为每个数据实体定义权限字段,比如在User表中添加角色和权限关联,同时在Menu或Resource表中添加对应的操作权限。在用户登录后,根据其角色加载相应的权限,以便在...

    JSF+SSH开发应用实例

    3. **Struts框架**: Struts是基于MVC设计模式的Web应用框架,主要用于控制应用程序的流程。它通过Action类来处理用户的请求,并决定接下来的视图。在JSF+SSH集成中,Struts通常用作连接JSF和Spring的桥梁,处理HTTP...

    lams.rar_java权限 源码_权限管理系统

    《基于Struts2、Hibernate3和Spring3的Java权限管理系统详解》 在现代软件开发中,权限管理是不可或缺的一部分,它确保了系统安全性和数据隐私。本文将详细讲解一个使用Struts2、Hibernate3和Spring3框架构建的Java...

    ssh框架下用ajax动态从数据库查询的菜单

    在SSH(Spring、Struts和Hibernate)框架下,利用AJAX动态从数据库查询并加载菜单是一种常见的需求,尤其是在开发Web应用程序时,为了提供用户友好的交互体验。下面将详细讲解如何实现这一功能。 首先,我们需要...

Global site tag (gtag.js) - Google Analytics