最近做的项目需要保存从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>
![](https://img-my.csdn.net/uploads/201301/23/1358911494_3647.jpg)