FLEX中的Session管理

最近做的项目需要保存从FLEX端登录进来的信息。我最先想到的是HttpServlet的Session来管理。以失败而告终。又试着用全局变量保存,也失败了。折腾的够呛。今天又在苦苦寻找,无意中看到一篇文章,终于解决。非常感谢原文作者!

我的代码因为是实际项目,牵涉点较多,可能影响你观察FLEX中的Session,你可以看原文章,较为简洁。地址:http://blog.csdn.net/zc529739024/article/details/8045227#reply

FLEX中实现Session的一个类是FlexContext类,他将SESSION保存在服务端。

1、首先,确保你的BLAZEDS搭建(将下载得到的blazeds解压,将解压得到的WEB-INF和META-INF两个文件夹拷贝到你的WEB-ROOT文件下)的利用Object 与java通讯正常。

2、新建java类 FlexSession:

package com.greencloud.service;


import flex.messaging.FlexContext;  
public class FlexSession {
	/**
	 * 保存Session
	 * @author wangfeng
	 * @date 2013-01-23 11:12:39
	 * @param name
	 * @param value
	 */
	public void setSession(String name,String value){  
        FlexContext.getFlexSession().setAttribute(name,value);  
    }
	
	/**
	 * 获取Session
	 * @author wangfeng
	 * @date 2013-01-23 11:12:50
	 * @param name
	 * @return
	 */
	public String getSession(String name){  
        String value=(String) FlexContext.getFlexSession().getAttribute(name);  
        return value;  
    } 
	
	/**
	 * 清除Session
	 * @author wangfeng
	 * @date 2013-01-23 11:13:10
	 * @param name
	 */
	 public void removeSession(String name){  
         FlexContext.getFlexSession().removeAttribute(name);  
     }
}

3、在WBE-INF\flex\remoting-config.xml里配置:

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" 
    class="flex.messaging.services.RemotingService">

    <adapters>
        <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
    </adapters>

    <default-channels>
        <channel ref="my-amf"/>
    </default-channels>
    
    <destination id="serviceTest">
		<properties>
			<source>test.ServiceTest</source>
		</properties>
	</destination>
	
	<destination id="UserService">
		<properties>
			<source>com.greencloud.service.UserService</source>
		</properties>
	</destination>
	
	 <destination id="dayReportService">
		<properties>
			<source>com.greencloud.dao.DayreportDao</source>
		</properties>
	</destination>
	
	<destination id="sessionManage">
		<properties>
			<source>com.greencloud.service.FlexSession</source>
		</properties>
	</destination>
</service>

UserService.java:

package com.greencloud.service;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServlet;

import com.greencloud.db.DBUtlie;
import com.greencloud.entity.User;

public class UserService extends HttpServlet{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Connection con = null;
	private PreparedStatement ps;
	private ResultSet rs;
	private User user;
    private FlexSession flexSession;
	public List<User> getUserList()throws SQLException{
		List<User> list = new ArrayList<User>();
		try{
			list = new ArrayList<User>();
			con = new DBUtlie().getConnection();
			String sql = "select * from s_user";
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()){
				User user = new User();
				System.out.println("query it's ok");
				user.setUserId(rs.getInt("userId"));
				user.setLoginName(rs.getString("loginName"));
				user.setPassword(rs.getString("password"));
				user.setRealName(rs.getString("realName"));
				user.setEmail(rs.getString("email"));
				user.setDesc(rs.getString("desc"));
				user.setDeptId(rs.getInt("deptId"));
				user.setDeptName(rs.getString("deptName"));
				user.setOrderBy(rs.getInt("orderBy"));
				user.setIsAdmin(rs.getInt("isAdmin"));
				user.setIsLocked(rs.getInt("isLocked"));
				list.add(user);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			try{
				rs.close();
				ps.close();
				con.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		return list;
	}
	
	public String userLogin(String name,String password){
		String userName = name;
		System.out.println("loginName:"+name);
		System.out.println("password:"+password);
		List<User> list = new ArrayList<User>();
		try{
			list = new ArrayList<User>();
			con = new DBUtlie().getConnection();
			String sql = "select * from s_user where loginName = '"+userName+"'";
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()){
				User user = new User();
				System.out.println("query it's ok");
				user.setUserId(rs.getInt("userId"));
				user.setLoginName(rs.getString("loginName"));
				user.setPassword(rs.getString("password"));
				user.setRealName(rs.getString("realName"));
				user.setEmail(rs.getString("email"));
				user.setDesc(rs.getString("desc"));
				user.setDeptId(rs.getInt("deptId"));
				user.setDeptName(rs.getString("deptName"));
				user.setOrderBy(rs.getInt("orderBy"));
				user.setIsAdmin(rs.getInt("isAdmin"));
				user.setIsLocked(rs.getInt("isLocked"));
				list.add(user);
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			try{
				rs.close();
				ps.close();
				con.close();
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		if(list == null || list.size()<1){
			return "fail";
		}
		
		for(int i=0;i<list.size();++i){
			user = list.get(i);
		}

		System.out.println("password:"+user.getPassword());
		if(user.getPassword().equals(password)){
			flexSession = new FlexSession();
			System.out.println("login success...");
			flexSession.setSession("account", user.getRealName());
			System.out.println("flexSession is ok!");
			return "success";
		}
		else{
			System.out.println("login fail...");
			return "fail";
		}
	}
	
	
}


FLEX端:

登录页:

logClient.mxml:


<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" applicationComplete="application1_applicationCompleteHandler(event)">
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	<!--	<s:RemoteObject id="sessionManage" endpoint="http://localhost:8080/log/messagebroker/amf" destination="sessionManage">
			<s:method name="setSession" result="sessionManage_resultHandler(event)" fault="sessionManage_faultHandler(event)"/>
		</s:RemoteObject>-->
		
		<s:RemoteObject id="UserService" endpoint="http://localhost:8080/log/messagebroker/amf" destination="UserService">
			<s:method name="userLogin" result="userLogin_resultHandler(event)" fault="userLogin_faultHandler(event)"/>
		</s:RemoteObject>
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			import com.greencloud.view.IndexView;
			import com.greencloud.vo.User;
			import mx.charts.CategoryAxis;
			import mx.collections.ArrayList;
			import mx.controls.Alert;
			import mx.controls.Tree;
			import mx.core.Application;
			import mx.events.FlexEvent;
			import mx.events.Request;
			import mx.managers.PopUpManager;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			
			//初始化方法 

			protected function application1_applicationCompleteHandler(event:FlexEvent):void
			{
				
				this.addEventListener(KeyboardEvent.KEY_DOWN,onEnterHandler);
				
			}
			
			//登录
			protected function login_clickHandler(event:MouseEvent):void
			{
				
				
				var strLoginName:String = loginName.text;
				var strPassword:String = password.text;
				if(strLoginName!="" && strPassword!="")
				{
					UserService.userLogin(strLoginName,strPassword);
				}
				else{
					Alert.show("用户名或密码不能为空","系统提示");
				}
			}
			
			//监听回车键
			protected function onEnterHandler(event:KeyboardEvent):void
			{
				if(event.keyCode == Keyboard.ENTER)
				{
					var strLoginName:String = loginName.text;
					var strPassword:String = password.text;
					if(strLoginName!="" && strPassword!="")
					{
						UserService.userLogin(strLoginName,strPassword);
					}
					else{
						Alert.show("用户名或密码不能为空","系统提示");
					}
				}
			}
			
			
			protected function userLogin_resultHandler(event:ResultEvent):void
			{
				var str:String = event.result as String;
				if(str == "success")
				{
					
					Alert.show("this.user is...");
					var indexUrl:URLRequest = new URLRequest("http://localhost:8080/log/logClient-debug/IndexView.html");
					try
					{
						navigateToURL(indexUrl,"_self");
					}
					catch(e:Error){
						Alert.show("跳转页面失败","系统提示");
					}
				}
				else
				{
					Alert.show("登录失败,请检查用户名和密码的正确性","系统提示");
				}
			}
			
			protected function userLogin_faultHandler(event:FaultEvent):void
			{
				Alert.show(event.fault.message,"出错了"); 
			}
			
			
			//重置
			protected function reset_clickHandler(event:MouseEvent):void
			{
				loginName.text=null;
				password.text=null;
			}
			
			
			
		]]>
	</fx:Script>
	<s:Panel width="100%" height="70%"  top="50" bottom="10" left="10" right="10">
		<s:layout>
			<s:HorizontalLayout paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5" gap="10"/>
		</s:layout>
		<s:VGroup width="100%" height="100%">
		</s:VGroup>
		<s:VGroup width="100%" height="100%">
			<s:Spacer width="100%" height="100%">
			</s:Spacer>
			<mx:FormItemLabel text="用户登录:" fontSize="15" fontWeight="normal"/>
			<s:FormItem label="用户名:" textAlign="left" fontSize="13">
				<s:HGroup>
					<s:Spacer width="5" height="100%"/>
					<s:TextInput id="loginName" maxChars="250"/>	
				</s:HGroup>
			</s:FormItem>
			<s:FormItem label="密码:" textAlign="left" fontSize="13">
				<s:HGroup>
					<s:Spacer width="17" height="100%"/>
					<s:TextInput id="password" maxChars="250" displayAsPassword="true"/>	
				</s:HGroup>
			</s:FormItem>
			<s:HGroup  width="100%">
				<s:Spacer width="15" height="100%"/>
				<s:Button id="login" label="登录" click="login_clickHandler(event)"/>
				<s:Spacer width="35" height="100%"/>
				<s:Button id="reset" label="重置" click="reset_clickHandler(event)"/>
			</s:HGroup>
			<s:Spacer width="100%" height="100%">
			</s:Spacer>
		</s:VGroup>
	</s:Panel>
	
</s:Application>

跳转页:IndexView.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx"  minWidth="955" minHeight="600" applicationComplete="application1_applicationCompleteHandler(event)">
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
		<s:RemoteObject id="sessionManage" destination="sessionManage" endpoint="http://localhost:8080/log/messagebroker/amf"> 
			<s:method name="getSession" result="sessionManage_resultHandler(event)" fault="sessionManage_faultHandler(event)"/>
		</s:RemoteObject>
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			import com.greencloud.component.PanelEx;
			import com.greencloud.vo.User;
			
			import mx.collections.ArrayList;
			import mx.controls.Alert;
			import mx.controls.Tree;
			import mx.core.FlexGlobals;
			import mx.events.FlexEvent;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			[Bindable]private var account:String=""; 
			
			protected function sessionManage_resultHandler(event:ResultEvent):void 
			{ 
				//注意获得Session的方式 
				account=event.result as String; 
				message.text=account+",欢迎您归来..." 
			}
			
			protected function sessionManage_faultHandler(event:FaultEvent):void 
			{ 
				Alert.show("获取session失败...","提示"); 
			} 
			
			
			
			protected function application1_applicationCompleteHandler(event:FlexEvent):void
			{
				
				//获取session 
				sessionManage.getSession("account"); 
			}
			
			protected function exist_clickHandler(event:MouseEvent):void 
			{ 
				// TODOAuto-generated method stub 
				//清除session 
				sessionManage.removeSession("account"); 
				var url:URLRequest=new URLRequest("http://localhost:8080/log/logClient-debug/logClient.html"); 
				navigateToURL(url,"_self"); 
			} 
			
		]]>
	</fx:Script>
	<s:Label x="394" y="229" fontSize="18" width="229" height="31" id="message"/>  
	<s:Button x="443" y="283" label="退出" id="exist" fontSize="16" click="exist_clickHandler(event)"/> 
</s:Application>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值