转自:呼啸,原文地址:http://blog.csdn.net/howlaa/article/details/8533180
最近做的项目需要保存从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>