• 权限管理系统实现:


    1、实现表之间的数据缓存PopedomCache.java

    public class PopedomCache {
        // 日志
        private Logger traceLogger = PafaCoreContexton.getInstance().getTracer();
    
        private static PopedomCache cache;
    
        // 所有菜单
        private Set<MenuInfoDTO> allMenuSet;
    
        // 所有权限
        private Set<OprateInfoDTO> allOperateSet;
        
        // 所有部门
        private List<DeptInfoDTO> allDeptList;
    
        // 所有权限Map<按钮编号, 按钮对象>
        private Map<String, OprateInfoDTO> allOperateMap;
    
        // 所有菜单Map<位置编号, 菜单对象>
        private Map<String, MenuInfoDTO> allMenuMap;
    
        // 所有数据Map<部门编码, 部门对象>
        private Map<String, DeptInfoDTO> allDeptMap;
        
        // 所有角色Map<角色, 角色对象>
        private Map<String, RoleInfoDTO> allRoleMap;
        
        public PopedomCache() {
            init();
        }
    
        /**
         * 获取权限缓存
         */
        public static PopedomCache getInstance() {
            if (cache == null) {
                cache = new PopedomCache();
            }
            return cache;
        }
    
        /**
         * 初始化信息
         * 
         */
        @SuppressWarnings("unchecked")
        private void init() {
            try {
                // 初始化变量
                this.initParameter();
                
                Map<String, String> paginatedMap = new HashMap<String, String>();
    
                paginatedMap.put(RoleMenuConstant.QUERY_ALL_MENUINFODTO_LIST, RoleMenuConstant.QUERY_ALL_MENUINFODTO_LIST);
                paginatedMap.put(RoleMenuConstant.QUERY_ALL_OPRATEINFODTO_LIST, RoleMenuConstant.QUERY_ALL_OPRATEINFODTO_LIST);
                paginatedMap.put(RoleMenuConstant.QUERY_ALL_ROLEINFODTO_LIST, RoleMenuConstant.QUERY_ALL_ROLEINFODTO_LIST);
                paginatedMap.put(RoleMenuConstant.QUERY_ALL_DEPTINFODTO_LIST, RoleMenuConstant.QUERY_ALL_DEPTINFODTO_LIST);
                
                Map<String, Object> resultMap = (Map<String, Object>) CURDUtil.execAction("popedomCacheAction", paginatedMap, null);
                
                // 查询所有菜单
                List menuList = (List) resultMap.get(RoleMenuConstant.QUERY_ALL_MENUINFODTO_LIST);
                
                // 查询所有权限
                List operateList = (List) resultMap.get(RoleMenuConstant.QUERY_ALL_OPRATEINFODTO_LIST);
                // 查询所有角色
                List roleList = (List) resultMap.get(RoleMenuConstant.QUERY_ALL_ROLEINFODTO_LIST);
    
                allMenuSet.addAll(menuList);
                allOperateSet.addAll(operateList);
                allDeptList = (List<DeptInfoDTO>) resultMap.get(RoleMenuConstant.QUERY_ALL_DEPTINFODTO_LIST);
    
                this.initAllOperateMap(allOperateSet);
                this.initAllMenuMap(allMenuSet);
                this.initAllDeptMap(allDeptList);
                this.initAllRoleMap(roleList);
            } catch (Exception e) {
                traceLogger.log("ex-system", Level.COMMON_ERROR, this.getClass()
                        .getName(), "PopedomCache.init()", e + "权限菜单初始化-出现异常!");
            }
    
        }
        
        /**
         * 初始化变量对象
         *
         */
        private void initParameter()
        {
            allMenuSet = SortSet.getMenuInfoDTOSet();
            allOperateSet = SortSet.getOprateInfoDTOSet();
            allMenuMap = new HashMap<String, MenuInfoDTO>();
            allOperateMap = new HashMap<String, OprateInfoDTO>();
            allDeptList = new ArrayList<DeptInfoDTO>();
            allDeptMap = new HashMap<String, DeptInfoDTO>();
            allRoleMap =  new HashMap<String, RoleInfoDTO>();
        }
    
        /**初始化所有权限MAP,以编号为ID
         * 
         * @param allOperateSet
         */
        private void initAllOperateMap(Set set) {
            if (set != null && set.size() > 0) {
                for (Iterator itor = set.iterator(); itor.hasNext();) {
                    OprateInfoDTO dto = (OprateInfoDTO) itor.next();
                    allOperateMap.put(dto.getOperateNo(), dto);
                }
            }
        }
        
        /***
         * 初始化部门Map
         * @param set
         */
        private void initAllDeptMap(List set) {
            if (set != null && set.size() > 0) {
                for (Iterator itor = set.iterator(); itor.hasNext();) {
                    DeptInfoDTO dto = (DeptInfoDTO) itor.next();
                    allDeptMap.put(dto.getDeptCode(), dto);
                }
            }
        }
        
        /**初始化所有菜单MAP,以位置为ID
         * 
         * @param allOperateSet
         */
        private void initAllMenuMap(Set set) {
            if (set != null && set.size() > 0) {
                for (Iterator itor = set.iterator(); itor.hasNext();) {
                    MenuInfoDTO dto = (MenuInfoDTO) itor.next();
                    allMenuMap.put(dto.getMenuPosition(), dto);
                }
            }
        }
        
        /***
         * 初始化部门Map
         * @param set
         */
        private void initAllRoleMap(List list) {
            if (list != null && list.size() > 0) {
                for (Iterator itor = list.iterator(); itor.hasNext();) {
                    RoleInfoDTO dto = (RoleInfoDTO) itor.next();
                    allRoleMap.put(dto.getRoleInfoId(), dto);
                }
            }
        }
        
        /** 角色权限关系集合转换为操作权限对象集合
         * 
         * @param roleOperateRelationDTOList
         * @return
         */
        public List<OprateInfoDTO> changeOperateRelationDTO(List roleOperateRelationDTOList)
        {
            List<OprateInfoDTO> tempList = new ArrayList<OprateInfoDTO>();
            if (roleOperateRelationDTOList != null && roleOperateRelationDTOList.size() > 0)
            {
                for (Iterator itor = roleOperateRelationDTOList.iterator(); itor.hasNext();)
                {
                    RoleOperateRelationDTO dto = (RoleOperateRelationDTO)itor.next();
                    // 到缓存类中寻找权限对象
                    tempList.add(allOperateMap.get(dto.getIdOperateInfo()));
                }
            }
            return tempList;
        }
        
        /** 角色权限关系集合转换为数据权限对象集合--部门
         * 
         * @param roleOperateRelationDTOList
         * @return
         */
        public List<DeptInfoDTO> changeDeptRelationDTO(List roleOperateRelationDTOList)
        {
            Set<DeptInfoDTO> tempSet = new HashSet<DeptInfoDTO>();
            if (roleOperateRelationDTOList != null && roleOperateRelationDTOList.size() > 0)
            {
                for (Iterator itor = roleOperateRelationDTOList.iterator(); itor.hasNext();)
                {
                    RoleDataRelationDTO dto = (RoleDataRelationDTO)itor.next();
    //                 到缓存类中寻找权限对象
                    DeptInfoDTO tempDeptInfoDTO = allDeptMap.get(dto.getDataCode());
                    if (tempDeptInfoDTO == null)
                    {
                        traceLogger.log("ex-system", Level.INFO, this.getClass().getName(), "PopedomCache.changeDeptRelationDTO()", "登陆用户数据权限,编码[" + dto.getDataCode() + "]取到部门对象为空!");
                        continue;
                    }
                    tempSet.add(tempDeptInfoDTO);
                }
            }
            List<DeptInfoDTO> tempList = new ArrayList<DeptInfoDTO>();
            tempList.addAll(tempSet);
            return tempList;
        }
        
        /** 根据角色ID获取角色对象
         * 
         * @param roleOperateRelationDTOList
         * @return
         */
        public RoleInfoDTO getRoleInfoDTOById(String roleId)
        {
            if (!StringUtil.isEmpty(roleId))
            {
                return allRoleMap.get(roleId);
            }
            return null;
        }
        
        /**根据编码获取权限对象
         * 
         * @param operateNo
         * @return
         */
        public OprateInfoDTO getOprateInfoDTOByOperateNo(String operateNo)
        {
            return allOperateMap.get(operateNo);
        }
        
        public Set<MenuInfoDTO> getAllMenuSet() {
            return allMenuSet;
        }
    
        public Set<OprateInfoDTO> getAllOperateSet() {
            return allOperateSet;
        }
    
        public Map<String, OprateInfoDTO> getAllOperateMap() {
            return allOperateMap;
        }
        
        public Map<String, MenuInfoDTO> getAllMenuMap() {
            return allMenuMap;
        }
    
        public Map<String, DeptInfoDTO> getAllDeptMap() {
            return allDeptMap;
        }
    
        public List<DeptInfoDTO> getAllDeptList() {
            return allDeptList;
        }
    
        /**更新部门缓存List与Map
         * 
         * @param allDeptList
         * @throws PafaWebException
         */
        @SuppressWarnings("unchecked")
        public void setAllDeptList() throws PafaWebException {
            Map<String, String> paginatedMap = new HashMap<String, String>();
            paginatedMap.put(RoleMenuConstant.QUERY_ALL_DEPTINFODTO_LIST, RoleMenuConstant.QUERY_ALL_DEPTINFODTO_LIST);
            Map<String, Object> resultMap = (Map<String, Object>) CURDUtil.execAction("popedomCacheAction", paginatedMap, null);
            this.allDeptList = (List<DeptInfoDTO>) resultMap.get(RoleMenuConstant.QUERY_ALL_DEPTINFODTO_LIST);
            this.initAllDeptMap(this.allDeptList);
        }
        
    }

    2、核心拦截处理类:SystemPopedomAccess.java

    public class SystemPopedomAccess {
        
        //     日志对象
        private static Logger traceLogger = PafaCoreContexton.getInstance().getTracer();
        
        /**根据按钮编号<br />
         * 判断当前用户是否有权执行某按钮的某操作
         * 
         * @param operateNo权限编号
         * @return
         */
        public static boolean flagIsAllowAccessByNo(HttpServletRequest request, String operateNo) {
            // 不设置key\value默认为有权限
            if (StringUtil.isEmpty(operateNo)) {
                return true;
            }
    
            HttpSession session = request.getSession();
            
            // 当前登录人信息
            UserInfoDTO userInfo = (UserInfoDTO)session.getAttribute(PopedomConstants.LOGON_INFO);
    
            // 未登陆
            if ( userInfo == null || StringUtil.isEmpty(userInfo.getUserUID())) {
                return true;
            }
            
            // 获取当前用户所拥有的权限集合
            List<OprateInfoDTO> oprateInfoDTOSet = userInfo.getOprates();
            // 从缓存中获取所有权限集合
            Map<String, OprateInfoDTO> allOprateInfoDTOMap = PopedomCache.getInstance().getAllOperateMap();
            // 拆分标签
            String[] operateNoArr = operateNo.split(PopedomConstants.SIGN_OPERATENO);
            
    //         传递参数true,那么当session过期时,新的session被创建,接下来可通过session.isNew()的返回值来判断是不是同一个session
            // 返回值为:true,新的session被创建,action提交执行时的那个用户session已经无效,报异常:java.lang.IllegalStateException:
            // getAttribute: Session already invalidated
            // 返回值为:false,同一个session,仍然有效,
            if (session.isNew()) {
                return false;
            }
            
            Set<String> userOperateNoSet = obj2Str(oprateInfoDTOSet);
            
             // 判断是否能访问
            if (allOprateInfoDTOMap.keySet() == null || allOprateInfoDTOMap.keySet().size() == 0)
            {
                return true;
            }
             //    所有编号中判断是否有控制这个权限,true 有;false 没有
             if (!isSetAllow(operateNoArr, allOprateInfoDTOMap.keySet())) {
                return true;
             }
             // 当前用户权限是否存在
             if (userOperateNoSet == null || userOperateNoSet.size() == 0)
             {
                 return false;
             }
             // 加了权限控制 判断权限是否在当前用户权限内
             if(isSetAllow(operateNoArr, userOperateNoSet))
             {
                return true;
             }
            return false;
        }
        
        
        /**根据按钮编号<br />
         * 判断当前用户是否有权执行某按钮的某操作
         * 
         * @param request 过滤器过来的对象
         * @return
         */
        public static boolean flagIsAllowAccessByUri(HttpServletRequest request) {
    
            HttpSession session = request.getSession();
            
            // 当前登录人信息
            UserInfoDTO userInfo = (UserInfoDTO)session.getAttribute(PopedomConstants.LOGON_INFO);
    
            // 未登陆
            if ( request.getRemoteUser() == null || userInfo == null || StringUtil.isEmpty(userInfo.getUserUID()) || userInfo.getRoles().size() == 0) {
                return true;
            }
            
            // 获取当前用户所拥有的菜单集合
            List<MenuInfoDTO> menuInfoDTOSet = userInfo.getMenus();
            // 获取当前用户所拥有的权限集合
            List<OprateInfoDTO> oprateInfoDTOSet = userInfo.getOprates();
    //         从缓存中获取所有菜单集合
            Set<MenuInfoDTO> allMenuInfoDTOSet = PopedomCache.getInstance().getAllMenuSet();
    //         从缓存中获取所有权限集合
            Set<OprateInfoDTO> allOprateInfoDTOSet = PopedomCache.getInstance().getAllOperateSet();
            // 请求链接
            String requestUri = request.getRequestURI();
            
    //         不设置key\value默认为有权限
            if (StringUtil.isEmpty(requestUri)) {
                return true;
            }
            
    //         传递参数true,那么当session过期时,新的session被创建,接下来可通过session.isNew()的返回值来判断是不是同一个session
            // 返回值为:true,新的session被创建,action提交执行时的那个用户session已经无效,报异常:java.lang.IllegalStateException:
            // getAttribute: Session already invalidated
            // 返回值为:false,同一个session,仍然有效,
            if (session.isNew()) {
                traceLogger.log(SystemPopedomAccess.class.getName(), Level.INFO, "flagIsAllowAccessByUri()", "session.isNew()是新的", "");
                return false;
            }
            
            // 判断 获取所有的菜单权限连接集合 是否控制uri
            Set<String> allUrlSet = getMenuAndOperateUrlSet(allMenuInfoDTOSet, allOprateInfoDTOSet);
            // 判断当前登陆用户是否 有权访问uri
            Set<String> userUrlSet = getMenuAndOperateUrlSet(menuInfoDTOSet, oprateInfoDTOSet);
            if (collectionIsContainsUri(request, requestUri, allUrlSet, userUrlSet))
            {
                return true;
            }
            
            return false;
        }
        
        /***
         * 判断数组中的元素是否有存在集合中
         * @param operateNoArr 多个权限编号
         * @param allowSet 集合
         * @return true 有; false 没有
         */
        private static boolean isSetAllow(String[] operateNoArr, Set<String> allowSet) {
            // 判断所有标签编号中是否包含有这个权限编号
            boolean flag = false;// 没有
            for (String s : operateNoArr) {
                // 权限编号不为空并且 集合包含权限编号
                if (!StringUtil.isEmpty(s) &&  allowSet.contains(s)) {
                    flag = true;
                    break;
                }
            }
            return flag;
        }
        
        /**权限集合对象转换未字符串集合
         * 
         * @param oprateInfoDTOSet
         * @return
         */
        private static Set<String> obj2Str(List<OprateInfoDTO> oprateInfoDTOSet)
        {
            Set<String> set = new HashSet<String>();
    
            if (oprateInfoDTOSet != null)
            {
                for (OprateInfoDTO dto : oprateInfoDTOSet)
                {
                    if (dto == null || StringUtil.isEmpty(dto.getOperateNo()))
                    {
                        continue;
                    }
                    set.add(dto.getOperateNo());
                }
            }
            return set;
        }
        
        /*************************************************************新控制***************************************************************************/
        /**获取菜单和权限连接中的url集合
         * 
         * @param menuInfoDTOList
         * @param oprateInfoDTOList
         * @return
         */
        private static Set<String> getMenuAndOperateUrlSet(Collection<MenuInfoDTO> menuInfoDTOCollection,Collection<OprateInfoDTO> oprateInfoDTOCollection)
        {
            Set<String> tempSet = new HashSet<String>();
            // 菜单加入集合
            if (menuInfoDTOCollection != null && menuInfoDTOCollection.size() > 0)
            {
                for (MenuInfoDTO dto : menuInfoDTOCollection)
                {
                    if (dto == null || StringUtil.isEmpty(dto.getMenuUrl()))
                    {
                        continue;
                    }
                    tempSet.add(dto.getMenuUrl());
                }
            }
            // 权限加入集合
            if (oprateInfoDTOCollection != null && oprateInfoDTOCollection.size() > 0)
            {
                for (OprateInfoDTO dto : oprateInfoDTOCollection)
                {
                    if (dto == null || StringUtil.isEmpty(dto.getOperateUrl()))
                    {
                        continue;
                    }
                    tempSet.add(dto.getOperateUrl());
                }
            }
            return tempSet;
        }
        
        /**判断用户权限是否存在该uri
         * 
         * @param request
         * @param requestUri 请求连接
         * @param allUrlSet
         * @param collection
         * @return
         */
        private static boolean collectionIsContainsUri(HttpServletRequest request, String requestUri, Collection<String> allUrlCollection, Collection<String> userCollection)
        {
            // 如果所有链接为空 ,可以任意访问
            if (allUrlCollection == null || allUrlCollection.size() == 0)
            {
                return true;
            }
            
            //    如果用户拥有链接集合为空 
            if (userCollection == null || userCollection.size() == 0)
            {
                return false;
            }
    
            // 所有链接中是否包含uri
            Set<String> allUrlSet = getCollectionAboutList(requestUri, allUrlCollection);
            // 不包含这个uri,这个uri不在控制范围内
            if (allUrlSet.size() == 0)
            {
                return true;
            }
            // 当前用户权限是否包含这个链接
            Set<String> userUrlSet = getCollectionAboutList(requestUri, userCollection);
            // 如果不包含,则无权访问
            if (userUrlSet.size() == 0)
            {
                return false;
            }
            
            //控制的url是否存在参数
            Map<String, List<String>> mapResult = list2OperateMap(userUrlSet);
            if (mapResult.size() == 0)
            {
                return true;
            }
            
            // 判断参数是否在集合中
            boolean paramFlag = parametersIsInRequest(request, mapResult, userUrlSet, requestUri);
            if (paramFlag)
            {
                return true;
            }
    
            // 如果是无参数链接,用户权限链接是否包含这个无参数的链接
    //        boolean userUrlContainsUriFlag = userUrlSet.contains(requestUri);
    //        if (userUrlContainsUriFlag)
    //        {
    //            return true;
    //        }
            
            return false;
        }
        
        /**
         * 返回oprateInfoDTOList中包含有uri相关的对象集合
         * @param uri 请求连接
         * @param oprateInfoDTOList 当前用户所拥有的所有权限集合
         * @return
         */
        private static Set<String> getCollectionAboutList(String uri, Collection<String> collection)
        {
            Set<String> tempSet = new HashSet<String>();
            if (collection != null && collection.size() > 0)
            {
                for (String str : collection)
                {
                    if (str.contains(uri))
                    {
                        tempSet.add(str);
                    }
                }
            }
            
            return tempSet;
        }
        
        /**返回当前链接中uri对应的参数
         * 
         * @param someUrlSet
         * @return
         */
        private static Map<String, List<String>> list2OperateMap(Set<String> someUrlSet)
        {
            Map<String, List<String>> mapResult = new HashMap<String, List<String>>();
            // 初始化加载信息;
            for (String urlString : someUrlSet)
            {
                splitUrl(mapResult, urlString);
            }
            
            return mapResult;
        }
        
        /**判断参数是否在request中
         * 
         * @param request
         * @param mapResult
         * @return
         */
        private static boolean parametersIsInRequest(HttpServletRequest request, Map<String, List<String>> mapResult, Set<String> userUrlSet, String requestUri)
        {
            //  验证结果
            boolean validateFlag = true;
            // request中包含的参数集合 请求参数集合
            Map<String, String> requestMap = new HashMap<String, String>();
            
            for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {
                String name = (String) e.nextElement();
                String value = request.getParameter(name);
                // 根据传递过来的参数请求获取权限控制的url参数
                List<String> allowValueList = mapResult.get(name);
                if (allowValueList != null && allowValueList.size() > 0)
                {
                    // 如果存在要控制的参数
                    requestMap.put(name, value);
                    if (!allowValueList.contains(value))
                    {
                        validateFlag = false;
                    }
                }
            }
            // 当前是无参数链接请求,拥有权限包含请求uri
            if (requestMap.size() == 0 && userUrlSet.contains(requestUri))
            {
                validateFlag = true;
            }
            
            return validateFlag;
        }
        
        /**
         * 拆分url
         * @author chen_weixian
         * Jul 21, 2012   6:09:33 PM
         * @param mapResult Map<String, String[]>=Map<paraName, paraValues>
         * @param urlString 
         * @return
         */
        private static void splitUrl(Map<String, List<String>> mapResult, String urlString)
        {
            // 根据问号进行拆分
            String[] urlArr = urlString.split(PopedomConstants.SIGN_KEY);
            // 如果存在参数
            if (urlArr.length > 1)
            {
                // 根据 & 拆分有多少参数
                String[] paramArray = urlArr[1].split(PopedomConstants.SIGN_AND);
                // 如果存在参数
                if (paramArray.length > 0)
                {
                    for (String paraAndValue : paramArray)
                    {
                        addParaToMap(mapResult, paraAndValue);
                    }
                }
            }
        }
        
        /**将参数与值放入到map中
         * 
         * @param mapResult
         * @param paraAndValue
         */
        private static void addParaToMap(Map<String, List<String>> mapResult, String paraAndValue)
        {
    //         参数名
            String paraName = null;
            // 参数值
            String paraValue = null;
            if (paraAndValue.contains(PopedomConstants.SIGN_EQUALS))
            {
                String[] para= paraAndValue.split(PopedomConstants.SIGN_EQUALS);
                if (para.length > 0)
                {
                    paraName = para[0];
                }
                if (para.length > 1)
                {
                    paraValue = para[1];
                }
            }
            // 获取集合中参数的值集合
            List<String> tempList = mapResult.get(paraName);
            if (tempList == null)
            {
                tempList = new ArrayList<String>();
            }
            tempList.add(paraValue);
            // 参数加入到集合中
            mapResult.put(paraName, tempList);
        }
        
        
    }

    3、标签处理类:OperateAccessTag

    /***
     * 权限标签控制
     * @author EX-CHENWEIXIAN001
     *
     */
    @SuppressWarnings("unchecked")
    public class OperateAccessTag extends BodyTagSupport {
        private static final long serialVersionUID = -516656449548427206L;
        // 日志
        private Logger traceLogger = PafaCoreContexton.getInstance().getTracer();
    
        private String operateNo; // 权限编号,多个以;相隔
    
        @Override
        public int doStartTag() throws JspException {
            return super.doStartTag();
        }
    
        @Override
        public int doEndTag() throws JspException {
            
            this.showTagInnerHtml();
            
            return SKIP_BODY;
        }
        
        /**
         * 显示出HTML标签体
         * 无权限的按钮 加上属性 disabled="disabled",其他的都去掉
         */
        public void showTagInnerHtml()
        {
            if (this.bodyContent != null)
            {
                JspWriter out = this.pageContext.getOut();
                String JspHtmlString = this.bodyContent.getString();
                boolean isShow = hasPermission();
    //            // 显示无变化
                if (!isShow)
                {
                    // 如果是按钮 在内容中加上 display 在<input 替换为<input disabled="disabled"
                    if (JspHtmlString.contains("<input"))
                    {
                        JspHtmlString = JspHtmlString.replace("<input", "<input disabled=\"disabled\"");
                    }
                    // 其他的,不显示
                    else
                    {
                        JspHtmlString="";
                    }
                }
                try {
                    out.write(JspHtmlString);
                }
                catch (Exception e) {
                    traceLogger.log(this.getClass().getName(), Level.COMMON_ERROR, "OperateAccessTag.hasPermission()", "权限按钮过滤异常:", e.getMessage());
                }
            }
        }
        /**
         * 按钮显示控制
         * @return true 显示;false 隐藏
         */
        protected boolean hasPermission() {
    
            boolean isShow = false;
            try
            {
                // 获取request 对象
                HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
                isShow = SystemPopedomAccess.flagIsAllowAccessByNo(request,operateNo);
            }
            catch (Exception e) {
                traceLogger.log(this.getClass().getName(), Level.COMMON_ERROR, "OperateAccessTag.hasPermission()", "权限按钮过滤异常:", e.getMessage());
            }
            return isShow;
        }
    
        public String getOperateNo() {
            return operateNo;
        }
    
        public void setOperateNo(String operateNo) {
            this.operateNo = operateNo;
        }
    }

    4、标签popedom-tags.tld

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
    <taglib>
        <tlib-version>1.0.1</tlib-version>
        <jsp-version>1.2</jsp-version>
        <short-name>operate</short-name>
        <uri>/WEB-INF/tlds/popedom-tags.tld</uri>
        <info>popedom operate access</info>
    
        <tag>
            <name>access</name>
            <tag-class>
                com.pingan.saims.scms.systemmanage.web.filter.OperateAccessTag
            </tag-class>
            <body-content>tagdependent</body-content>
            <attribute>
                <name>operateNo</name>
                <required>false</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
        </tag>
      <tag>
            <name>commonSelect</name>
            <tag-class>
                com.pingan.saims.scms.systemmanage.web.filter.DictionaryTag
            </tag-class>
            <body-content>tagdependent</body-content>
            <attribute>
                <name>id</name>
                <required>false</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
            <attribute>
                <name>name</name>
                <required>false</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
            <attribute>
                <name>value</name>
                <required>false</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
            <attribute>
                <name>type</name>
                <required>yes</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
            <attribute>
                <name>disabled</name>
                <required>false</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
            <attribute>
                <name>onchange</name>
                <required>false</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
            <attribute>
                <name>class</name>
                <required>false</required>
                <rtexprvalue>false</rtexprvalue>
            </attribute>
        </tag>
        <tag>
            <name>commonName</name>
            <tag-class>
                com.pingan.saims.scms.systemmanage.web.filter.DictionaryTag
            </tag-class>
            <body-content>tagdependent</body-content>
            <attribute>
                <name>value</name>
                <required>yes</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
            <attribute>
                <name>type</name>
                <required>yes</required>
                <rtexprvalue>yes</rtexprvalue>
            </attribute>
        </tag>

    5、权限过滤器:SessionTimeoutFilter.java

    /**
     * 处理session超时重新登录后取不到用户id问题
     * 
     * @author EX-BIANDONGYU001
     * @data 2011-11-14
     */
    @SuppressWarnings("unchecked")
    public class SessionTimeoutFilter implements Filter {
        private Logger traceLogger = PafaCoreContexton.getInstance().getTracer();
    
        public void destroy() {
            // TODO Auto-generated method stub
    
        }
    
        public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException {
    
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;        
            HttpSession session = request.getSession();
            
            // 判断session中是已否保存用户id
            try {
                String requestStr = request.getRequestURI();
                // 不处理登陆界面信息
                if (Pattern.matches("/(logout.do|userlogin.do|main.screen|common.userlogin.do|logonerror.screen|scms_payinform_hongding.do)",requestStr)) {
                    chain.doFilter(req, res);
                    return;
                } 
                else if (session.getAttribute(PopedomConstants.LOGON_INFO) == null) {
                    String logonId = request.getRemoteUser();
                    if (logonId != null) {
                        logonId = logonId.toUpperCase();
                        UserInfoDTO userInfo = null;
                        Map params = new HashMap();
                        // 从UM2读取用户信息
                        userInfo = UserInfoUtil.getUserInfoByUID(logonId);
                        if (userInfo == null || userInfo.getRoles().size() == 0) {
                            session.setAttribute(PopedomConstants.LOGON_INFO, null);
                            request.setAttribute("content", "您登陆超时,请重新登陆!");
                            request.setAttribute("showBtn", "TRUE");// 显示按钮
                            request.setAttribute("toUM2UserLoginIndexUrl", "/");// 按钮点击跳转
                            req.getRequestDispatcher("/common/noPermission.jsp").forward(req, res);
                        }
                        params.put(PopedomConstants.LOGON_INFO, userInfo);
    
                        // 读取用户权限信息                    
                        Map resultMap  = (Map) CURDUtil.execAction("scms.queryUserInfoAction", params, null);
                        Map menuInfos = (Map) resultMap.get("newMenuInfoMap");
                        userInfo = (UserInfoDTO) resultMap.get(PopedomConstants.LOGON_INFO);
                        request.setAttribute("menuInfos", menuInfos);
    
                        Map logonInfo = new HashMap();
                        logonInfo.put("logonId", userInfo.getUserUID());
                        logonInfo.put("logonName", userInfo.getUserName());
    
                        // 取出用户信息,放到session
                        session.setAttribute(PopedomConstants.LOGON_INFO, userInfo);
                        session.setAttribute("validatePendingCountTime", InitConfigParam.get("validatePendingCountTime"));
                        session.setAttribute("logonInfo", logonInfo);
                    } 
                    else {
                        // 清空 session
                        session.setAttribute(PopedomConstants.LOGON_INFO, null);
                        // 跳转到登陆的地方
                        request.setAttribute("content", "您登陆超时,请重新登陆!");
                        request.setAttribute("showBtn", "TRUE");// 显示按钮
                        request.setAttribute("toUM2UserLoginIndexUrl", "/");// 按钮点击跳转
                        req.getRequestDispatcher("/common/noPermission.jsp").forward(req, res);
                    }
                }
                
                // 是否有权访问uri
                boolean validateFlag = true;
                try {
                    validateFlag = SystemPopedomAccess.flagIsAllowAccessByUri(request);
                } catch (Exception e) {
                    traceLogger.log(this.getClass().getName(), Level.COMMON_ERROR,"PopedomFilter.doFilter()", "权限过滤出错,错误信息为:", e.getMessage());
                }
    
                if (!validateFlag) {
                    request.setAttribute("validateFlag", validateFlag);
                    request.setAttribute(PopedomConstants.MESSAGE_TITLE, "操作权限提示:");
                    request.setAttribute(PopedomConstants.MESSAGE_CONTENT,"对不起,您无权执行该操作!");
                    request.getRequestDispatcher("/docc/message_page.jsp").forward(request, response);
                    return;
                }
    
                chain.doFilter(req, res);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        public void init(FilterConfig arg0) throws ServletException {
    
        }
    
    }

    6、排序器:SortSet.java

    /**
     * 排序类
     * @author EX-CHENWEIXIAN001
     *
     */
    @SuppressWarnings("unchecked")
    public class SortSet implements Serializable
    {
        
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        public static TreeSet<MenuInfoDTO> getMenuInfoDTOSet()
        {
            return new TreeSet(new Comparator() {
    
                public int compare(Object o1, Object o2) {
                    MenuInfoDTO t1 = (MenuInfoDTO)o1;
                    MenuInfoDTO t2 = (MenuInfoDTO)o2;
    
                    if (t1.getMenuPosition()==null || t2.getMenuPosition()== null)
                    {
                        return 2;
                    }
                    else if (Integer.parseInt(t1.getMenuPosition()) > Integer.parseInt(t2.getMenuPosition()))
                    {
                        return 1;
                    }
                    else if (Integer.parseInt(t1.getMenuPosition()) < Integer.parseInt(t2.getMenuPosition()))
                    {
                        return -1;
                    }
                    else if (!t1.equals(t2))
                    {
                        return 3;
                    }
                    else
                    {
                        return 0;
                    }
                }
            });
        }
        
        public static TreeSet<OprateInfoDTO> getOprateInfoDTOSet()
        {
            return new TreeSet(new Comparator() {
    
                public int compare(Object o1, Object o2) {
                    OprateInfoDTO t1 = (OprateInfoDTO)o1;
                    OprateInfoDTO t2 = (OprateInfoDTO)o2;
    
                    if (t1.getOperateNo()==null || t2.getOperateNo()== null)
                    {
                        return 2;
                    }
                    else 
                    {
                        String t1MenuPosition = t1.getOperateNo();
                        String t2MenuPosition = t2.getOperateNo();
    
                        t1MenuPosition = t1MenuPosition.replace("_", "");
                        t2MenuPosition = t2MenuPosition.replace("_", "");
                        
                        if (Integer.parseInt(t1MenuPosition) > Integer.parseInt(t2MenuPosition))
                        {
                            return 1;
                        }
                        else if (Integer.parseInt(t1MenuPosition) < Integer.parseInt(t2MenuPosition))
                        {
                            return -1;
                        }
                        else if (!t1.equals(t2))
                        {
                            return 3;
                        }
                        else
                        {
                            return 0;
                        }
                    }
                }
            });
        }
    }

    7、页面控制:例子.jsp

    <operate:access operateNo="0401_06">
              <input type="button" onclick="editToDetailQuota('update')" class="button23" name="updateBtn" id="updateBtn" value="修改"/>&nbsp;
            </operate:access>
            <operate:access operateNo="0401_04">
              <input type="button" onclick="editToDetailQuota('review')" class="button23" name="reviewBtn" id="reviewBtn" value="复核"/>&nbsp;
            </operate:access>
              <operate:access operateNo="0401_07">
                <input type="button" onclick="editToDetailQuota('revoke')" class="button23" name="revokeBtn" id="revokeBtn" value="作废"/>&nbsp;
            </operate:access>
  • 相关阅读:
    Revit二次开发示例:DisableCommand
    Revit二次开发示例:DesignOptions
    C# 非模式窗体show()和模式窗体showdialog()的区别
    Revit二次开发示例:DeleteObject
    被动永远做不好运维
    sudo开发常用命令总结
    ansible 配置了端口在host文件但是还要走22 ip:60001 ansible_ssh_port=60001
    ansible wc -l 对结果值取大小的操作
    mha切换脚本可用的
    mongoDB自动杀执行时间的连接
  • 原文地址:https://www.cnblogs.com/a393060727/p/2840837.html
Copyright © 2020-2023  润新知