Skip to content
loginCA.jsp 5.92 KiB
Newer Older
杨郁彬's avatar
杨郁彬 committed
<!DOCTYPE html>
<html>
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<%@ page import="cn.hutool.core.util.CharsetUtil" %>
<%@ page import="cn.hutool.http.HttpUtil" %>
<%
Du Xingdong's avatar
Du Xingdong committed
  //String ssoUrl = "http://222.73.255.10:10318";
  String ssoUrl = "http://222.73.73.137:8088";
杨郁彬's avatar
杨郁彬 committed
  pageContext.setAttribute("ssoUrl", ssoUrl);

  String randUrl = ssoUrl + "/GeneratorChallenge";
  String rand = "";//随机数
  try {
    rand = HttpUtil.get(randUrl, CharsetUtil.CHARSET_UTF_8);
  } catch (Exception e) {
    System.err.println("[SSO单点登录] 读取随机数失败!");
    e.printStackTrace();
  }
  pageContext.setAttribute("rand", rand);
  //session.setAttribute("ssoLogin", "true");
%>
<head>
  <title>Ukey登录</title>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
  <meta http-equiv="cache-control" content="no-store, no-cache, must-revalidate"/>
  <meta http-equiv="pragma" content="no-cache"/>
  <meta http-equiv="expires" content="0"/>
  <script type="text/javascript" src="${ctx}/static/res/jquery-cui/4.0.2/dev/ui/jquery-1.9.1.min.js"></script>
  <style type="text/css">
    body {
      overflow: hidden;
    }
  </style>
</head>
<body>
<div>
  <div>
    请稍候...
  </div>
  <c:if test="${not empty rand}">
    <object id="AuthClientCtrl" classid="clsid:C966EBD9-49E9-4E9C-B854-270861C58382" width="0" height="0"></object>
  </c:if>
  <form id="loginForm" action="${ctx}/login" method="POST">
    <input type="hidden" id="loginName" name="username"/>
    <input type="hidden" id="pwd" name="password" value="useCaUkey"/>
  </form>
</div>
<script type="text/javascript">
  var rand = '${rand}';//随机数

  $(function () {
    //getSignAndToken(rand);
    getSignAndTokenByWebsocket(rand);
    //loginSso('陈伟');
  });

  function getSignAndToken(randSign) {
    var errorlog;
    try {
      var signTokenArr = AuthClientCtrl.GetSignAndToken(randSign);
      console.log("signTokenArr:", signTokenArr);
      if (AuthClientCtrl.lResult != 0) { // 未登录客户端
        errorlog = '0';
        var errorMsg = AuthClientCtrl.bstrError;
        console.log("获取签名数据失败:", errorMsg);
        xz();
        return;
      } else {
        var signToken = AuthClientCtrl.bstrSignValAndToken;
        //alert("身份票据信息:" + signToken);
        getUserInfo(signToken);
      }
    } catch (e) {
      //alert("票据获取异常!!");
      if (errorlog != '0') {
        //window.location = ''; // 跳转老证书登录
      }
      throw new Error(e.message);
    }
  }

  /**
   * 通过WebSocket获取ukey信息
   * @param randSign
   */
  function getSignAndTokenByWebsocket(randSign) {
    try {
      var bodyx = '<?xml version="1.0" encoding="UTF-8"?>' +
        '<getsignandtokenreq version="1">' +
        '<challenge>' + randSign + '</challenge>' +
        '</getsignandtokenreq>';
      //var bodylen = sendlen(bodyx);
      //套接字单点登录
      var ws = new WebSocket('ws://127.0.0.1:30318');
      ws.onopen = function (event) {
        console.log('已经建立连ws');
        ws.send(bodyx);
      }
      ws.onerror = function (event) {
        console.log('ws:error', event);
        alert('您没有插ukey或没有安装客户端认证工具!');
        xz();
      }
      ws.onclose = function (event) {
        console.log('ws:close');
      }
      ws.onmessage = function (event) {
        var resStr = event.data;
        resStr = resStr.split('</tokeninfo>')[0];
        resStr = resStr.split('<tokeninfo>')[1];
        console.log('signAndToken', resStr);
        ws.close();
        if (resStr.length > 50) {
          getUserInfo(resStr);
        } else {
          alert('登录失败!');
          xz();
        }
      }
    } catch (e) {
      throw new Error(e.message);
    }
  }

  //websocket计算body长度
  function sendlen(str) {
    var s = 0;
    for (var i = 0; i < str.length; i++) {
      if (str.charAt(i).match(/^[\u4e00-\u9fa5]+$/)) {
        s += 3;
      } else {
        s++;
      }
    }
    s = String(s);
    var l = s.length;
    var L = 10 - l;
    var bodylen = bl(L) + s;
    return bodylen;
  }

  function bl(L) {
    var l = '';
    for (var i = 0; i < L; i++) {
      l = l + '0';
    }
    return l;
  }

  function getUserInfo(signToken) {
    if (signToken.length > 50) {
      //传输随机数、票据信息到后台,对信息进行验证
      $.ajax({
        type: 'POST',
        url: '${ctx}/loginCA/getUserInfo',
        dataType: 'json',
        data: {
          verifyUrl: '${ssoUrl}/VerifyIdentityTicket',
          identityticket: signToken,
          challenge: rand
        },
        success: function (data) {
          console.log('获取UKey信息', data);
          var userName = data.userName;
          var userId = data.userId;
          var loginName = data.loginName;
          //alert(ssotoken);
          if (!userName) {
            alert('请插入UKey');
            xz();
          } else if (!loginName) {
            alert('无此用户:' + userName);
            xz();
          } else {
            loginSso(loginName);
          }
        },
        error: function (e) {
          console.log(e);
        }
      });
    } else {
      //alert("signToken 长度错误!!");
      xz();
    }
  }

  function xz() {
    if (confirm('请您先登录“用户认证客户端”后点击“确定”,点击“取消”则使用账号密码登录')) {
      window.location.href = '${ctx}/loginCA.html'; // 新证书登录,登录客户端后刷新本页面
    } else {
      window.location.href = '${ctx}/login.html'; // 跳转账号密码登录
    }
  }

  /**
   * 单点登录
   * @param loginName
   */
  function loginSso(loginName) {
    $('#loginName').val(loginName);
    $('#loginForm').submit();
  }
</script>
</body>
</html>