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

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

我们提供的服务有:成都做网站、网站制作、微信公众号开发、网站优化、网站认证、长丰ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的长丰网站制作公司

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

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

网站栏目:J2EE+Flex的菜单及权限控制实践
网站地址:http://www.csdahua.cn/qtweb/news44/159244.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网