FLEX权限--使用RemoteObject交互结合spring AOP控制项目权限教程

转载:http://blog.csdn.net/hxx688/archive/2009/06/10/4258765.aspx

FLEX权限--使用RemoteObject交互结合spring AOP控制项目权限教程 

FLEX使用remoteobject交互结合spring AOP思想控制项目权限

本文介绍如何用FLEX+SPRING 使用remoteobject交互方式, 而不是用HttpService,URLRequest方式控制用户权限。
remoteobject交互效率高, 因此选用该方式开发项目并探讨如何控制权限。

FLEX项目不同于传统的WEB B/S设计,不能像struts那样方便存取权限于session中。

网上有文章介绍可以把用户权限状态存储在FLEX 全局变量中,把安全性的东西放在客户端多少有点不够妥善,
如果FLEX被反编译,造成损 失, 后悔也没用啊。。。

这里的思路是把权限通过FlexContext存储在服务器session中, FLEX 调用逻辑业务的时候再从SESSION中调用判断,
如 果有很多业务需要调用,一个一个判断不但繁琐, 而且造成代码冗余,
不像struts调用excute或者直接设置拦截器那么方便, 所以使用AOP技术编写拦截器即可判断所有方法的调用权限。


看代码吧:

1.WEB.XML配置
 <!-- 这个需要配置, 否则FlexContext将不能得到服务器SESSION-->
    <listener>
        <listener-class>flex.messaging.HttpFlexSession</listener-class>
    </listener>

2.applicationContext.xml配置(考虑使用ProxyFactoryBean配置拦截器, 网上查了很多资料, 但是似乎只能指定一个类,
有知道的朋友请指教:) 向前, 向后拦截器不能控制方法的运行, 所以使用环绕拦截器。
expression 中指定的是逻辑层的接口路径, 包括所有的逻辑业务方法, 但需要排除checkLogin方法的拦截,
用“and not”连接指定详细路径。)

<!-- 配置拦截器 (实现权限判断管理功能)-->  
    <bean id="authInterceptor" class="cn.flex.web.util.AuthPermission">
    </bean>
    <aop:config>
     <aop:aspect id="authI" ref="authInterceptor">
      <aop:pointcut id="logicMethods"   expression="execution (* cn.flex.logic.service.*.*(..)) and not execution

(* cn.flex.logic.service.UserService.checkLogin(..))"/>
      <aop:around pointcut-ref="logicMethods"  method="testAuth" />
     </aop:aspect>
    </aop:config>

下面是后台类代码:

3. 拦截器代码
import org.aspectj.lang.ProceedingJoinPoint;
import flex.messaging.FlexContext;

public class AuthPermission {
 public Object testAuth(ProceedingJoinPoint point) throws Throwable {
  String user = (String)FlexContext.getFlexSession().getAttribute("userName");
  if(user != null){
   System.out.println("executing...");
   return point.proceed();
  }else {
   System.out.println("You have no permission...");
   return null;
  }
  
 }
}

4. 逻辑业务管理类代码, 所有与flex交互的类都继承该类, 这样可以方便调用逻辑层的所有业务

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import cn.flex.logic.service.UserService;
import cn.flex.logic.service.base.ServiceManager;
import flex.messaging.FlexContext;

public class BaseLogicImpl {
 
 private ServiceManager srvManager;
 
 public HttpServletRequest getRequest() {
  
  return FlexContext.getHttpRequest();
  
 }
 
 public HttpSession getSession() {
 
  return FlexContext.getHttpRequest().getSession(); //FlexContext.getFlexSession()同理
 }

 public void setSrvManager(ServiceManager srvManager) {
  this.srvManager = srvManager;
 }
 
 public UserService getUserService() {
  return srvManager.getUserService();
 }
 
}

4. 用户业务逻辑处理代码:


 import cn.flex.web.BaseLogicImpl;

 public class UserActive extends BaseLogicImpl{
 
 /**
  * 用户登陆
  * @param name
  * @param psw
  * @return
  */
 public Integer login(String name, String psw) {
  
  Integer result = getUserService().checkLogin(name, psw);
  //result整型标识处理接口, 0 为登陆成功, 1为错误, null为用户名不存在.
  if(result!=null && result == 0) {
   getSession().setAttribute("userName", name);
  }
  
  return result;
 }
 
 }

5. FLEX主要代码:

 private function toLogin():void {
    var name:String = ui_name.text;
    var psw:String = ui_pass.text;
    userSv.login(name, psw);
    
   }


 private function loginResult(event:ResultEvent):void {
    var data:Object = event.result;
    //trace(data);
    if(data == 0){
     Alert.show("login success.");
     showMainFM();
    }else if(data == 1){
     Alert.show("The password is wrong.");
    }else if(data == null ){
     Alert.show("The user account doesn't exsit.");
    }
    
   }

 <mx:RemoteObject id="userSv" destination="userActive"
   endpoint="/FlexWeb/messagebroker/amf" >
   <mx:method name="login" result="loginResult(event)"  />
 </mx:RemoteObject>
 
 <mx:Panel id="loginPanel" title="User Login" showEffect="{irisLoginEffect}"
  width="300" height="230" creationCompleteEffect=""
  layout="absolute" verticalCenter="0" horizontalCenter="0" y="113">
  <mx:Canvas borderColor="#ffffff" y="19" x="16.5">
   <mx:Label text="UserName:" x="10" y="31"/>
   <mx:TextInput id="ui_name"  x="87" y="29"/>
   <mx:Label text="Password:"  x="15" y="70"/>
   <mx:TextInput id="ui_pass" x="87" y="68"/>
   <mx:Button click="toLogin()" label="确定"  x="87" y="101"/>
   <mx:Button click="showRegisterFM()" label="注册"  x="169" y="101"/>
  </mx:Canvas>
 </mx:Panel>

OK, 教程写完了, 不足之处请指正, 大家可以参照模仿自己运行, 有问题留言或加入我的群号:19310171
 
转载请注明 出处.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值