`
jiangwt100
  • 浏览: 37789 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

J2EE+Flex的菜单及权限控制实践

 
阅读更多

本文讲述了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. }  

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

分享到:
评论

相关推荐

    j2ee+flex+blazeds 配置实践

    《J2EE+Flex+BlazeDS 配置实践详解》 在当今互联网技术日新月异的时代,企业级应用开发对于交互性和实时性的需求日益增强。Java 2 Enterprise Edition (J2EE) 作为后端开发的强大平台,与Adobe Flex前端框架的结合...

    j2ee+flex4

    为了尊重原作者 紧用来java+flex小菜鸟学习使用 此项目使用 JAVA JDK1.6 Tomcat6.0/7.0 java+flex4 使用的是BlazeDS方式中得 remoting方式与JAVA交互 由于没有美工 UI十分丑陋望学者见谅 目前功能只实现了这些 ...

    J2EE+Flex+Blazeds配置实例

    至此,你已经成功配置了一个J2EE+Flex+Blazeds的实例。通过Flex客户端发送请求到Blazeds,Blazeds再转发给J2EE服务器处理,服务器响应后再通过Blazeds返回给Flex客户端显示结果。这种架构为开发交互性强、用户体验...

    j2ee+FLEX实现在线拍照

    在这个“j2ee+FLEX实现在线拍照”的项目中,Flex将提供拍照和图像处理的功能,用户可以直接在Web浏览器中进行拍照或选择本地图片上传;而后端的J2EE服务器则处理图片上传、存储和可能的进一步处理。 为了实现这一...

    J2EE+FLEX+LCDS实现数据通信(带图,超详细)

    【J2EE+FLEX+LCDS实现数据通信详解】 在当今的Web开发中,Java企业版(J2EE)和Adobe Flex经常被结合使用来构建富互联网应用程序(RIA)。Flex作为客户端的用户界面技术,而J2EE则作为后端服务提供数据支持。...

    开发者突击·Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)源码

    《开发者突击:Java Web主流框架整合开发(J2EE+Struts+...随书附赠光盘内容包括《开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)》10种架构原型程序包、个人通讯录及办公自动化系统源程序。

    Flex4+J2EE+Blazeds配置jspweb工程

    配置Flex4+J2EE+Blazeds的JSP Web工程步骤如下: 1. **环境准备**:首先,确保安装了Adobe Flex SDK、Java JDK、Eclipse IDE(带有Flex和Java插件)、Tomcat或其他J2EE服务器,以及Blazeds库。 2. **创建Flex项目*...

    Wrox+-+Expert+One-on-One+J2EE+Design+and+Development

    Wrox+-+Expert+One-on-One+J2EE+Design+and+Development

    开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)(第2版) 带封面和目录、前言(6/6)

    开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)(第2版)的完整版本,带封面和目录、前言,一共六个压缩文件,这是第6个。

    开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)(第2版) 带封面和目录、前言(4/6)

    开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)(第2版)的完整版本,带封面和目录、前言,一共六个压缩文件,这是第4个。

    开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)(第2版) 带封面和目录、前言(3/6)

    开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)(第2版)的完整版本,带封面和目录、前言,一共六个压缩文件,这是第3个。

    基于java+J2EE+sqlserver的在线考试系统设计与实现(源码+文档)

    资源名字:基于java+J2EE+sqlserver的在线考试系统设计与实现(源码+文档)_java_J2EE_BS架构_在线考试系统.zip 资源内容:项目全套源码+完整文档 源码说明: 全部项目源码都是经过测试校正后百分百成功运行。 适合...

    flex + j2ee+blazeds 配置

    Flex + J2EE + BlazeDS 配置是一个用于构建富互联网应用程序(RIA)的技术组合,它将客户端的Flex界面与服务器端的Java EE服务紧密结合。本文将详细介绍如何配置这一技术栈,帮助开发者快速上手。 首先,我们需要...

    J2EE+WEB+架构+研究文集知识及案例

    最后,《J2EE+WEB端知识及案例使用顺序.pdf》可能是对整个学习路径的指导,它可能建议了一个逐步学习的顺序,从基础概念到高级主题,再到具体的案例实践,帮助读者系统地掌握J2EE和Web开发技能。 总结来说,这个...

    Flex + j2ee + sh 的电子作业管理系统

    《基于Flex + J2EE + SH的电子作业管理系统详解》 在信息技术日新月异的今天,电子作业管理系统已经成为教育领域的重要工具,它为教师和学生提供了便捷的在线作业提交与批改平台。本文将详细解析一个以"Flex + J2EE...

    BlazeDS+Flex+Tomcat开发J2EE

    ### BlazeDS+Flex+Tomcat 开发 J2EE 模块整合实例详解 #### 一、准备工作 在开始使用BlazeDS、Flex与Tomcat进行J2EE开发之前,需确保以下系统软件和工具已安装并配置妥当: 1. **JDK1.5或以上版本**:作为Java...

    j2ee+JSP树型菜单组件tigra_menu

    本文将深入探讨“j2ee+JSP树型菜单组件tigra_menu”,并围绕其核心概念、功能及应用进行详细介绍。 首先,我们要理解的是“j2ee”(Java 2 Enterprise Edition)是一个企业级的Java开发平台,它提供了各种服务和...

    J2EE+设计开发编程指南

    J2EE+设计开发编程指南 J2EE+设计开发编程指南 J2EE+设计开发编程指南

    Expert+One-On-One+J2Ee+Design+And+Development.chm

    Expert+One-On-One+J2Ee+Design+And+Development.chm

Global site tag (gtag.js) - Google Analytics