<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    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>  

    posted on 2007-07-16 23:07 paulwong 閱讀(1825) 評論(1)  編輯  收藏 所屬分類: J2EE

    Feedback

    # re: Struts-Menu結合角色權限的應用 2014-03-07 12:20 最代碼

    你好,我根據你的博客整理到了zuidaima.com上,地址:http://www.zuidaima.com/share/1724475036945408.htm,有版權請告知。  回復  更多評論   


    主站蜘蛛池模板: **aaaaa毛片免费同男同女| 亚洲成a人片在线观| 成人片黄网站色大片免费| a视频在线观看免费| 国产亚洲福利一区二区免费看| 亚洲无圣光一区二区| 亚洲日产韩国一二三四区| 免费大学生国产在线观看p| 国拍在线精品视频免费观看| A级毛片高清免费视频在线播放| 色欲aⅴ亚洲情无码AV| 亚洲另类自拍丝袜第1页| 久久综合日韩亚洲精品色| 中文字幕在亚洲第一在线| 国产成人高清精品免费软件| 国产男女爽爽爽爽爽免费视频| 女人体1963午夜免费视频| 国产精品视频全国免费观看| 国产99久久亚洲综合精品| 亚洲熟女乱色一区二区三区| 亚洲日本国产乱码va在线观看| 亚洲国产精品高清久久久| 亚洲七七久久精品中文国产| 国产做床爱无遮挡免费视频| 好吊妞788免费视频播放| 成人AV免费网址在线观看| 久久精品国产免费观看三人同眠| 日本高清免费观看| 免费观看一区二区三区| 中文字幕视频免费在线观看| 一区二区三区免费精品视频 | 日本激情猛烈在线看免费观看| 亚洲日韩精品国产3区| 亚洲第一男人天堂| 亚洲综合色丁香婷婷六月图片| 亚洲最大黄色网址| 亚洲另类古典武侠| 亚洲一区欧洲一区| 亚洲精品无码久久久久秋霞| 亚洲精品无码久久久久YW| 亚洲国产精华液2020|