J2EE+Flex的菜单及权限控制实践_import flex.messaging.flexcontext-程序员宅基地

技术标签: spring  flex  struts  session  bean  properties  

本文讲述了J2EE+Flex的一些开发心得。作者一直是搞J2EE的,使用了blazeds,Flex通过RemoteObject调用Java的后台方法。这样的一个最大的好处就是不再需要struts这样之类的框架了,可以直接使用spring中的bean。

AD:

最近学习了下Flex,我一直是搞J2EE的。所以想整合试着开发,J2EE+Flex在网上查了些资料,有好几种方法。我这里使用的是blazeds,Flex通过RemoteObject调用Java的后台方法。我个人觉得这样的一个最大的好处就是不再需要struts这样之类的框架了,可以直接使用spring中的bean。要使用spring就必须先说下spring的整合问题,其实这个网上也有,只要就是一个SpringFactory类,这个类要实现FlexFactory接口,然后在WEB-INF/flex/services-config.xml中注册改factory。代码如下:

   
   
    
  1. < factories> 
  2.  < factory id="springContext" class="com.wangmeng.flex.SpringFactory">< /FACTORY> 
  3. < /FACTORIES> 

这样配置好以后在WEB-INF/flex/remote-config.xml中只要把factory的名字写成和上面配置对应的名字如:springContext,source的值配置为spring中bean的id就可以了。例如:

   
   
    
  1. < destination id="userLoginService"> 
  2.   < properties> 
  3.      < factory>springContext< /FACTORY> 
  4.      userLoginService< /SOURCE> 
  5.   < /PROPERTIES> 
  6.  < /DESTINATION> 

具体SpringFactory类的源代码网上也有。

下面我说下我构思的控制菜单及权限的方法:首先要控制肯定要有用户登录的环节,这里具体怎么实现都可以,当时登陆后要将用户的信息保存在session中,一遍在检查权限是使用。获取request,session都是通过flex.messaging.FlexContext提供的静态方法

首先说菜单的控制,当用户打开首页,客户端远程调用加载菜单信息,当然这是没有登陆,只有一些公开的菜单可以看见,用户登录后可以再重新加载菜单,这是系统会根据用户的特权等级决定要返回的菜单列表(这里菜单的返回的数据来源你可以自己决定,可以放在数据库里也可以是其他的)。

当然,只是这样控制肯定不够安全,那就是后面要说的对用spring中bean调用的控制:

要控制spring中的bean不被越权调用当然要从前面的SpringFactory类着手啦,我们需要在每次调用bean之前通过bean的名字检查该用户是否有权调用,如果有权调用就返回该bean,如果没有权限就抛出一个没有权限的ServiceException类。还是具体看下我的实现代码吧,也许不是很优美,但是功能大致都实现了。

   
   
    
  1. package com.wangmeng.flex;  
  2.  
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5.  
  6. import javax.servlet.http.HttpSession;  
  7.  
  8. import org.springframework.context.ApplicationContext;  
  9. import org.springframework.web.context.support.WebApplicationContextUtils;  
  10. import org.springframework.beans.BeansException;  
  11. import org.springframework.beans.factory.NoSuchBeanDefinitionException;  
  12.  
  13. import com.wangmeng.web.data.SysPrivilege;  
  14. import com.wangmeng.web.data.User;  
  15. import com.wangmeng.web.service.privilege.PrivilegeService;  
  16.  
  17. import flex.messaging.FactoryInstance;  
  18. import flex.messaging.FlexFactory;  
  19. import flex.messaging.config.ConfigMap;  
  20. import flex.messaging.services.ServiceException;  
  21.  
  22. public class SpringFactory implements FlexFactory {  
  23.  private static final String SOURCE = "source";  
  24.  private static HashMap beanMap = new HashMap();//存放权限检查项  
  25.  
  26. //在factory初始化是装在权限信息   
  27.  
  28. public void initialize(String id, ConfigMap configMap) {  
  29.   ApplicationContext appContext = WebApplicationContextUtils  
  30.     .getWebApplicationContext(flex.messaging.FlexContext  
  31.       .getServletConfig().getServletContext());  
  32.   PrivilegeService priviService = (PrivilegeService) appContext  
  33.     .getBean("sysPrivilegeService");  
  34.   List priviList = priviService.listAll();  
  35.   for (Object obj : priviList) {  
  36.    SysPrivilege privi = (SysPrivilege) obj;  
  37.    String name = privi.getServiceName();  
  38.    beanMap.put(name, privi);  
  39.   }  
  40.  }  
  41.  
  42.  public FactoryInstance createFactoryInstance(String id, ConfigMap properties) {  
  43.   SpringFactoryInstance instance = new SpringFactoryInstance(this, id,  
  44.     properties);  
  45.   instance.setSource(properties.getPropertyAsString(SOURCE, instance  
  46.     .getId()));  
  47.   return instance;  
  48.  }  
  49.  
  50.  public Object lookup(FactoryInstance inst) {  
  51.   SpringFactoryInstance factoryInstance = (SpringFactoryInstance) inst;  
  52.   return factoryInstance.lookup();  
  53.  }  
  54.  
  55.  static class SpringFactoryInstance extends FactoryInstance {  
  56.   SpringFactoryInstance(SpringFactory factory, String id,  
  57.     ConfigMap properties) {  
  58.    super(factory, id, properties);  
  59.   }  
  60.  
  61.   public String toString() {  
  62.    return "SpringFactory instance for id=" + getId() + " source=" 
  63.      + getSource() + " scope=" + getScope();  
  64.   }  
  65.  
  66. //在每次查找spring bean之前检查权限。  
  67.  
  68.   public Object lookup() {  
  69.    String beanName = getSource();  
  70.    SysPrivilege privi = (SysPrivilege) beanMap.get(beanName);  
  71.    boolean hasRight = false;  
  72.    if (privi==null||privi.getLevel() <= 0) {  
  73.     hasRight = true;  
  74.    } else {  
  75.     HttpSession session = flex.messaging.FlexContext  
  76.       .getHttpRequest().getSession();  
  77.     User user = (User) session.getAttribute("user");  
  78.     if (user != null && user.getPrivilege() >= privi.getLevel()) {  
  79.      hasRight = true;  
  80.     } else {  
  81.      hasRight = false;  
  82.     }  
  83.    }  
  84.    if (hasRight) {  
  85.     ApplicationContext appContext = WebApplicationContextUtils  
  86.       .getWebApplicationContext(flex.messaging.FlexContext  
  87.         .getServletConfig().getServletContext());  
  88.     try {  
  89.      return appContext.getBean(beanName);  
  90.     } catch (NoSuchBeanDefinitionException nexc) {  
  91.      ServiceException e = new ServiceException();  
  92.      String msg = "Spring service named '" + beanName  
  93.        + "' does not exist.";  
  94.      e.setMessage(msg);  
  95.      e.setRootCause(nexc);  
  96.      e.setDetails(msg);  
  97.      e.setCode("Server.Processing");  
  98.      throw e;  
  99.     } catch (BeansException bexc) {  
  100.      ServiceException e = new ServiceException();  
  101.      String msg = "Unable to create Spring service named '" 
  102.        + beanName + "' ";  
  103.      e.setMessage(msg);  
  104.      e.setRootCause(bexc);  
  105.      e.setDetails(msg);  
  106.      e.setCode("Server.Processing");  
  107.      throw e;  
  108.     }  
  109.    }else{  
  110.     ServiceException e = new ServiceException();  
  111.     String msg = "你没有足够的权限调用'" 
  112.       + beanName + "' ";  
  113.     e.setMessage(msg);  
  114.     e.setRootCause(null);  
  115.     e.setDetails(msg);  
  116.     e.setCode("Server.Processing");  
  117.     throw e;  
  118.    }  
  119.   }  
  120.  }  
  121.  
  122. }  

代码不是很难,稍微看下我想应该没有问题。这就是我的构思,如果真的要应用还有许多细节要考虑,至少一个大致的框架完成了。


转载自:http://developer.51cto.com/art/200906/130840.htm

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xingfeng0501/article/details/7467912

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签