Flex端调rtx接口实现自动登录

本文介绍了一种使用RTX签名进行用户身份验证的方法,并通过Socket实现了前端与后端之间的安全通信。验证过程涉及从前端获取签名,通过Socket发送至后端,后端再利用签名验证服务确认签名的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    首先,前端登陆页面取出地址栏的用户名和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();
    }



 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值