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

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

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

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

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

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


静态:只须在标签内加上

<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:

/*
 * RolesPermissionsAdapter.java
 *
 * Created on December 7, 2002 2:25 PM
 */

package net.sf.navigator.menu;

import javax.servlet.http.HttpServletRequest;
import java.util.regex.Pattern;

/**
 * This class used container-managed security to check access
 * to menus.  The roles are set in menu-config.xml.
 *
 * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
 */
public class RolesPermissionsAdapter implements PermissionsAdapter {
    private Pattern delimiters = Pattern.compile("(?<!\\\\),");
    private HttpServletRequest request;

    public RolesPermissionsAdapter(HttpServletRequest request) {
        this.request = request;
    }

    /**
     * If the menu is allowed, this should return true.
     *
     * @return whether or not the menu is allowed.
     */
    public boolean isAllowed(MenuComponent menu) {
        if (menu.getRoles() == null) {
            return true; // no roles define, allow everyone
        } else {
            // Get the list of roles this menu allows
            String[] allowedRoles = delimiters.split(menu.getRoles());
            for (int i=0; i < allowedRoles.length; i++) {
                if (request.isUserInRole(allowedRoles[i])) {
                    return true;
                }
            }
        }
        return false;
    }
}


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

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

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

/**   
 *加载菜单静态信息  
 */  
private void loadMenuRepository()   
{   
     MenuConstructor menuConstructor=new MenuConstructor();   
             menuConstructor.createMenuRepository();   
}  


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

/**  
 * 加载系统菜单入菜单库  
 * @param defaultRepository :缺省库  
 */  
public void createMenuRepository()    
{   
    ServletContext app=ApplicationContext.getContext();   
       MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);   
    MenuRepository repository = new MenuRepository();   
       repository.setDisplayers(defaultRepository.getDisplayers());   
       List list = getMenuComponents();   
       for (int i=0; i < list.size(); i++)    
       {   
           MenuComponent mc = new MenuComponent();   
           MenuInfo menu=(MenuInfo) list.get(i);   
           String menuName = menu.getName();   
           mc.setName(menuName);   
           String parentName = (String) menu.getParentName();   
           if (parentName != null)    
           {   
               MenuComponent parentMenu = repository.getMenu(parentName);   
               if (parentMenu == null)    
               {   
                   parentMenu = new MenuComponent();   
                   parentMenu.setName(parentName);   
                   repository.addMenu(parentMenu);   
               }   
               mc.setParent(parentMenu);   
           }   
           String title = (String)menu.getTitle();   
           String location = (String) menu.getLocation();   
           String target = (String) menu.getTarget();   
           String description = (String) menu.getDescription();   
           String action=(String)menu.getAction();   
           String roles=(String)menu.getRoles();   
           mc.setTitle(title);                           
           mc.setLocation(location);   
           mc.setAction(action);   
           mc.setTarget(target);               
           mc.setDescription(description);   
           mc.setRoles(roles);   
           repository.addMenu(mc);   
       }   
       constant.setMenuRepository(repository);   
       //因为加载出来的菜单信息被打乱了.   
       //按照库表菜单顺序保存一级菜单信息,在struts-menu显示时要用   
       app.setAttribute("OrderMenuList",getOrderMenuList());   
}   
  
/**  
 * 从数据库中读取菜单信息  
 * @return List :菜单信息  
 */  
   private static List getMenuComponents()    
   {   
    PersistenceService service = (PersistenceService)ApplicationContextProvider.getBean("persistenceService");   
       String hql=QlConstructor.getSqlContent("getMenuInfo");   
    List menuInfoList = service.list(hql);   
    return menuInfoList;   
   }   
      
   /**  
    * 将菜单表中的一级菜单按照显示顺序取出来  
    * @return List:一级菜单信息  
    */  
   private static List getOrderMenuList()   
   {   
       List orderMenuList=new ArrayList();   
       PersistenceService service = (PersistenceService)ApplicationContextProvider.getBean("persistenceService");   
       String hql=QlConstructor.getSqlContent("getParentmenuSql");   
       orderMenuList = service.list(hql);   
       return orderMenuList;   
   }  
/**  
 * 根据userId获取用户所能看到的菜单信息  
 * @param   authSet         :用户权限集  
 * @return  MenuRepository  : 用户所能看到的菜单库  
 */  
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;   
}   
  
   /**  
    * 获取用户所能看到的一级菜单列表,在画面展示时struts-menu标签需要用到  
    * @param userMenuRepository    :用户自己的菜单库  
    * @return  List: 用户能看到的一级菜单名称数组  
    */  
public List getParentMenuNameList(MenuRepository userMenuRepository) throws Exception   
{           
       ServletContext app=ApplicationContext.getContext();   
       List orderMenuList=(List)app.getAttribute("OrderMenuList");   
       List parentMenuNameList=new ArrayList();   
       for(int i=0;i<orderMenuList.size();i++)   
       {   
           String menuName=((MenuInfo)orderMenuList.get(i)).getName();   
           if(userMenuRepository.getMenu(menuName)!=null)  parentMenuNameList.add(menuName);   
       }          
    return parentMenuNameList;   
}   


显示菜单:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值