首先,前端登陆页面取出地址栏的用户名和rtx签名,用Flex的外部API ExternalInterface 类的call()方法
[Bindable]
private var userName:String="";
[Bindable]
private var sign:String="";
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
var str:String = ExternalInterface.call("window.location.href.toString");
// str="http://10.10.1.88:8012/SignAuth.cgi?rtxid=yuanzhan.yu&sign=Fx%2Fo4YeKF075INAQSBsbRNY9IWwk7C%2B8b9R4hlSLzMs%3D";
var arr:Array = str.split("&");
if(arr.length >= 2)
{
var index1:int = arr[0].indexOf("rtxid=");
userName = arr[0].substr(index1 + 6);
var index2:int = arr[1].indexOf("sign=");
sign = arr[1].substr(index2 + 5);
}
this.currentState = "empty";
userName = userName;
UserSession.getInstance().Socket=new SocketClient();
UserSession.getInstance().Socket.addEventListener("SOCKET_CONNECT", ReturnLoginState);//从SocketClient派发事件,通知Socket已经连上了
UserSession.getInstance().Socket.addEventListener("DotConnectedServer",
function():void {
Alert.show("未连接上服务器!请咨询技术人员!","提示")
this.currentState = "ShowLoginViewPage";
});
}
Socket监听的回调函数,将用户名,密码,rtx签名写入Socket,传到后台:
private function ReturnLoginState(event:RecievePacketEvent):void
{
UserSession.getInstance().Socket.removeEventListener("SOCKET_CONNECT", ReturnLoginState);
UserSession.getInstance().Socket.AddSessionConnect();
var vUserName:String=userName;
var vUserPwd:String="";
var vSign:String=sign;
var vwriteData:WriteDataPacket=new WriteDataPacket(LogicConfig.USER_LOGIN,0);
vwriteData.writeString(vUserName);
vwriteData.writeString(vUserPwd);
vwriteData.writeString(vSign);
UserSession.getInstance().Socket.writeData(vwriteData);
//添加Socket调用用户登录事件
UserSession.getInstance().Socket.addEventListener(LogicConfig.Contract[LogicConfig.USER_LOGIN]+0,this.UserLogin)
}
后台java端接收到数据,调用自定义的rtxValid()方法进行rtx签名验证:
@LogicCode(LogicId = Pact.USER_LOGIN, Desc = "用户登录")
public static void userLogin(IoSession pSession, ReadDataPackage pPackage)
{
try
{
String user = pPackage.GetString().trim();
String pwd = pPackage.GetString();
String sign = pPackage.GetString();
boolean isValid = false;//IsValid(user, pwd);
if(pwd.equals(""))
isValid = rtxValid(user,sign);
else
isValid = IsValid(user, pwd);
String returnInfo = "用户名或密码错误,请重新输入!";
if (isValid)
{
String vViewId = "UserLoginConfirmByUserName";
int vDataCount = 1;
String[] vParams = new String[1];
vParams[0] = user;
List<String> vParaNameArr = Main.DataViewParas.get(vViewId).getParaNames();
ResultSet[] vCachedRowSetImpl = DataHelper.getDate(vViewId, vParaNameArr, vParams, 3, vDataCount);
ResultSet pData = vCachedRowSetImpl[0];
pData.beforeFirst();
if (pData.next())
{
int roleId = pData.getInt(1);
String roleName = pData.getString(2);
int userId = pData.getInt(3);
returnInfo = roleName;
/** 用户信息 */
UserInfoSession.vUserName = user;
UserInfoSession.vPWD = pwd;
UserInfoSession.vLanguage = "CHS";
UserInfoSession.vGame_ID = 0;
UserInfoSession.vRole_ID = roleId;
UserInfoSession.vUsr_ID = userId;
}
else
{
isValid = false;
returnInfo = "账号未激活,请联系管理员!";
}
}
WriteDataPackage vData = new WriteDataPackage(Pact.USER_LOGIN, pPackage.GetMarkId());
vData.SetBoolean(isValid);
if (isValid)
{
vData.SetInt(UserInfoSession.vUsr_ID);
}
vData.SetString(returnInfo);
pSession.write(vData);
}
catch (Exception e)
{
System.out.print(e.toString());
}
}
验证函数为:
private static boolean rtxValid(String user, String sign)
{
String param = "user="+ user + "&sign=" + sign + "";
String result = sendPost("http://10.10.1.88:8012/SignAuth.cgi?"+param); //10.10.1.88 为RTX服务器地址
if("success!".equals(result))
return true;
return false;
}
接下来是一个函数----Java端向一个url发送消息并获得返回值, 返回值为success! 或者 fail! :
public static String sendPost(String targetUrl)
{
URL url;
URLConnection con;
StringBuffer sb=null;
try {
//向targetUrl发送请求
url = new URL(targetUrl);
con=url.openConnection();
//读取响应
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
sb=new StringBuffer();
String temp;
while((temp=reader.readLine())!=null){
sb.append(temp);
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}