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配置
2.applicationContext.xml配置(考虑使用ProxyFactoryBean配置拦截器, 网上查了很多资料, 但是似乎只能指定一个类,
有知道的朋友请指教:) 向前, 向后拦截器不能控制方法的运行, 所以使用环绕拦截器。
expression中指定的是逻辑层的接口路径, 包括所有的逻辑业务方法, 但需要排除checkLogin方法的拦截,
用“and not”连接指定详细路径。)
下面是后台类代码:
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.");
}
}
layout="absolute" verticalCenter="0" horizontalCenter="0" y="113">
OK, 教程写完了, 不足之处请指正, 大家可以参照模仿自己运行, 有问题留言或加入我的群号:19310171
转载请注明出处.