<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,有版權請告知。  回復  更多評論   


    主站蜘蛛池模板: 成人au免费视频影院| v片免费在线观看| 亚洲综合久久一本伊伊区| 精品日韩亚洲AV无码一区二区三区| 国产亚洲真人做受在线观看| 亚洲熟妇无码乱子AV电影| 亚洲午夜久久久久久噜噜噜| 亚洲色欲久久久综合网| 亚洲乱亚洲乱妇无码麻豆| 亚洲精品国产品国语在线| 亚洲AV无码乱码国产麻豆穿越| 亚洲伦另类中文字幕| 久久青青草原亚洲av无码app| 亚洲黄网站wwwwww| 亚洲理论片中文字幕电影| 亚洲伊人久久大香线蕉| 亚洲日本VA午夜在线影院| 亚洲AV无码一区二区一二区| 美女一级毛片免费观看| 一级一级毛片免费播放| a毛片在线免费观看| 91麻豆国产免费观看| 免费国产成人高清在线观看网站 | 日韩亚洲AV无码一区二区不卡| 亚洲综合色一区二区三区小说| 亚洲免费观看在线视频| 亚洲av永久无码精品网址| 一级特级aaaa毛片免费观看 | 亚洲精品无播放器在线播放| 国产偷国产偷亚洲高清人| 国产免费一级高清淫曰本片| 无码午夜成人1000部免费视频| 无码精品A∨在线观看免费| 国产美女精品久久久久久久免费 | 久久99国产乱子伦精品免费| 91在线视频免费播放| 国产aa免费视频| 亚洲AV无码一区东京热久久| 国产精品亚洲专区在线观看| 免费国产a理论片| 伊人久久免费视频|