自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

J2EE+Flex的菜單及權(quán)限控制實(shí)踐

開發(fā) 后端
本文講述了J2EE+Flex的一些開發(fā)心得。作者一直是搞J2EE的,使用了blazeds,F(xiàn)lex通過RemoteObject調(diào)用Java的后臺(tái)方法。這樣的一個(gè)最大的好處就是不再需要struts這樣之類的框架了,可以直接使用spring中的bean。

最近學(xué)習(xí)了下Flex,我一直是搞J2EE的。所以想整合試著開發(fā),J2EE+Flex在網(wǎng)上查了些資料,有好幾種方法。我這里使用的是blazeds,F(xiàn)lex通過RemoteObject調(diào)用Java的后臺(tái)方法。我個(gè)人覺得這樣的一個(gè)***的好處就是不再需要struts這樣之類的框架了,可以直接使用spring中的bean。要使用spring就必須先說下spring的整合問題,其實(shí)這個(gè)網(wǎng)上也有,只要就是一個(gè)SpringFactory類,這個(gè)類要實(shí)現(xiàn)FlexFactory接口,然后在WEB-INF/flex/services-config.xml中注冊(cè)改factory。代碼如下:

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

這樣配置好以后在WEB-INF/flex/remote-config.xml中只要把factory的名字寫成和上面配置對(duì)應(yīng)的名字如:springContext,source的值配置為spring中bean的id就可以了。例如:

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

具體SpringFactory類的源代碼網(wǎng)上也有。

下面我說下我構(gòu)思的控制菜單及權(quán)限的方法:首先要控制肯定要有用戶登錄的環(huán)節(jié),這里具體怎么實(shí)現(xiàn)都可以,當(dāng)時(shí)登陸后要將用戶的信息保存在session中,一遍在檢查權(quán)限是使用。獲取request,session都是通過flex.messaging.FlexContext提供的靜態(tài)方法

首先說菜單的控制,當(dāng)用戶打開首頁,客戶端遠(yuǎn)程調(diào)用加載菜單信息,當(dāng)然這是沒有登陸,只有一些公開的菜單可以看見,用戶登錄后可以再重新加載菜單,這是系統(tǒng)會(huì)根據(jù)用戶的特權(quán)等級(jí)決定要返回的菜單列表(這里菜單的返回的數(shù)據(jù)來源你可以自己決定,可以放在數(shù)據(jù)庫里也可以是其他的)。

當(dāng)然,只是這樣控制肯定不夠安全,那就是后面要說的對(duì)用spring中bean調(diào)用的控制:

要控制spring中的bean不被越權(quán)調(diào)用當(dāng)然要從前面的SpringFactory類著手啦,我們需要在每次調(diào)用bean之前通過bean的名字檢查該用戶是否有權(quán)調(diào)用,如果有權(quán)調(diào)用就返回該bean,如果沒有權(quán)限就拋出一個(gè)沒有權(quán)限的ServiceException類。還是具體看下我的實(shí)現(xiàn)代碼吧,也許不是很優(yōu)美,但是功能大致都實(shí)現(xiàn)了。

  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();//存放權(quán)限檢查項(xiàng)  
  25.  
  26. //在factory初始化是裝在權(quán)限信息   
  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之前檢查權(quán)限。  
  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 = "你沒有足夠的權(quán)限調(diào)用'" 
  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. }  

代碼不是很難,稍微看下我想應(yīng)該沒有問題。這就是我的構(gòu)思,如果真的要應(yīng)用還有許多細(xì)節(jié)要考慮,至少一個(gè)大致的框架完成了。

【編輯推薦】

  1. 結(jié)合struts和hibernate談J2EE架構(gòu)的數(shù)據(jù)表示
  2. JAVA J2EE框架一覽
  3. 不同的J2EE項(xiàng)目開發(fā)流程
  4. Java EE = J2EE = Java企業(yè)應(yīng)用
  5. J2EE線程代碼示例
責(zé)任編輯:book05 來源: 新浪博客
相關(guān)推薦

2009-06-23 08:06:46

J2EE體系架構(gòu)J2EE模型J2EE設(shè)計(jì)模式

2009-06-23 08:03:02

2009-06-10 16:35:26

2009-03-31 09:39:13

J2EE事務(wù)并發(fā)并發(fā)訪問

2011-06-07 09:37:32

J2EE

2009-06-10 13:37:06

J2EE可伸縮性J2EE靈活性J2EE維護(hù)

2009-06-10 14:10:23

J2EE學(xué)習(xí)J2EE是什么

2009-06-23 16:48:26

J2EE常見問題J2EE平臺(tái)

2010-09-29 10:15:35

JDKJ2EEJ2SE

2009-06-11 17:06:11

J2EE歷史Java EE概述

2009-07-09 16:06:10

JDK J2EE J2

2009-06-11 17:11:07

J2EE設(shè)計(jì)模式工廠模式

2009-06-22 17:05:41

Java EEJava企業(yè)應(yīng)用

2009-06-08 21:34:09

J2EEJ2SEJ2ME

2009-06-18 15:54:57

J2EE下使用JNDI

2009-06-23 08:12:48

J2EE調(diào)用存儲(chǔ)過程

2009-06-22 17:34:40

J2EE架構(gòu)

2009-06-10 13:30:32

J2EE四層模型客戶層Web層

2019-01-08 16:26:43

Java EEJ2EEJakarta EE

2009-06-19 10:13:00

J2EE開發(fā)亂碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)