index_sso.jsp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
  2. <%@ page import="cn.sinobest.framework.util.ConfUtil,
  3. cn.sinobest.framework.util.Util,
  4. cn.sinobest.framework.comm.iface.IOperator,
  5. cn.sinobest.sysmngr.service.security.ISecurityService,
  6. cn.sinobest.sysmngr.service.security.SecurityDes,
  7. cn.sinobest.sysmngr.service.security.MySessionAttributeListener,
  8. java.util.Random,
  9. java.util.HashMap,
  10. java.util.regex.Matcher,
  11. java.util.regex.Pattern,
  12. org.slf4j.Logger,
  13. org.slf4j.LoggerFactory
  14. "%>
  15. <%!
  16. public String validateParamSaftyByregEx(String strParam){
  17. String regEx="^fwJsonpCallback[0-9]$";
  18. // 编译正则表达式
  19. Pattern pattern = Pattern.compile(regEx);
  20. // 忽略大小写的写法
  21. // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
  22. Matcher matcher = pattern.matcher(strParam);
  23. // 查找字符串中是否有匹配正则表达式的字符/字符串
  24. boolean rs = matcher.find();
  25. if(rs){
  26. return strParam;
  27. }else{
  28. return "";
  29. }
  30. }
  31. %>
  32. <%
  33. //P3P头部,确保能在跨域的情况下,能在IE下设置cookie
  34. response.setHeader("P3P","CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");
  35. response.setHeader("Pragma", "No-cache");
  36. response.setHeader("Cache-Control", "no-cache");
  37. response.setDateHeader("Expires", 0);
  38. response.setContentType("application/json;charset=UTF-8");
  39. response.setHeader("Content-Type", "text/javascript");//周治云测试,在操作系统win10+IE11下,没有这段代码,返回异常。
  40. Logger LOGGER = LoggerFactory.getLogger(this.getClass());
  41. //确保session不为NULL
  42. session=request.getSession(true);
  43. String sessionid=session.getId();
  44. String loginId = request.getParameter("LOGINID") == null? "":request.getParameter("LOGINID");
  45. String password = request.getParameter("UID") == null? "":request.getParameter("UID");
  46. String sid = request.getParameter("SID") == null? "":request.getParameter("SID");
  47. String old_callback = request.getParameter("callback")== null? "":request.getParameter("callback");
  48. //校验callback是否合法,防止XSS
  49. String callback=validateParamSaftyByregEx(old_callback);
  50. String mykey = (String)session.getAttribute("REPORT_DES_KEY");
  51. if(!"".equals(sid)){
  52. HashMap reportKeys = MySessionAttributeListener.getReportKeys();
  53. mykey=(String)reportKeys.get(sid);
  54. }
  55. String resultstr="";
  56. //如果之前已经登陆成功,则直接返回成功信息
  57. if(null != session.getAttribute("OPERID") && !"".equals(session.getAttribute("OPERID"))){
  58. resultstr=callback+"({FHZ:'1',LOGINSTATE:'OK',OPERNAME:'"+session.getAttribute("OPERNAME")+"',MSG:'用户已登陆,系统不再做登陆操作',SID:'"+sessionid+"'})";
  59. //out.print(callback + "({FHZ:'1',LOGINSTATE:'OK',OPERNAME:'"+session.getAttribute("OPERNAME")+"',MSG:'用户已登陆,系统不再做登陆操作'})");
  60. }
  61. //如果之前并没有登陆,这是第一次请求登陆,session中并且没有密钥key,那么产生key,并把key发送到客户端
  62. else if (Util.isEmpty(mykey)) {
  63. String des = String.valueOf(System.currentTimeMillis());
  64. Random r = new Random();
  65. des = String.valueOf(r.nextInt(1000000)+1) + des;
  66. session.setAttribute("REPORT_DES_KEY", des + "hnisi");//密钥
  67. resultstr=callback + "({FHZ:'-1',LOGINSTATE:'CONFIRMERROR',ERRORID:'"+des+"',MSG:'拒绝登陆',SID:'"+sessionid+"'})";
  68. //out.print(callback + "({FHZ:'-1',LOGINSTATE:'CONFIRMERROR',ERRORID:'"+des+"',MSG:'拒绝登陆'})");//ERRORID就是密钥
  69. }
  70. //如果这是是第一次登陆,并且key已经发送到客户端,那么校验用户密码;如果用户密码为空,则重新发送key
  71. else if("".equals(password)||"".equals(loginId)){
  72. String des = mykey.substring(0,mykey.lastIndexOf("hnisi"));
  73. resultstr=callback + "({FHZ:'-1',LOGINSTATE:'CONFIRMERROR',ERRORID:'"+des+"',MSG:'用户或密码为空',SID:'"+sessionid+"'})";
  74. //out.print(callback + "({FHZ:'-1',LOGINSTATE:'CONFIRMERROR',ERRORID:'"+des+"',MSG:'用户或密码为空'})");//ERRORID就是密钥
  75. }
  76. //如果这是第一次登陆,并且key已经发送到客户端,校验用户密码也通过,那么则进行登陆操作
  77. else{
  78. SecurityDes de = new SecurityDes();
  79. password = de.des(mykey, de.HexTostring(password), false);
  80. LOGGER.debug(sessionid +"----------------------"+"LOGINID: " + loginId);
  81. /////////////////////////////////////////////////////
  82. ISecurityService securitySBService = (ISecurityService)Util.getBean("securitySBService");
  83. IOperator Operator = securitySBService.login(loginId, password);
  84. if(Operator.getCheckResult()){
  85. session.setAttribute("OPERNAME", Operator.getOperName());
  86. session.setAttribute("OPERID", Operator.getOperID());
  87. session.setAttribute("OPERATOR", Operator);
  88. session.setAttribute("LOGINTYPE", "loginsb");
  89. session.removeAttribute("REPORT_DES_KEY");
  90. resultstr=callback + "({FHZ:'1',LOGINSTATE:'OK',OPERNAME:'"+Operator.getOperName()+"',MSG:'登陆成功'})";
  91. //out.print(callback + "({FHZ:'1',LOGINSTATE:'OK',OPERNAME:'"+Operator.getOperName()+"',MSG:'登陆成功'})");
  92. }else{
  93. resultstr=callback + "({FHZ:'-1',LOGINSTATE:'ERROR',MSG:'"+Operator.getCheckMsg()+"',SID:'"+sessionid+"'})";
  94. //out.print(callback + "({FHZ:'-1',LOGINSTATE:'ERROR',MSG:'"+Operator.getCheckMsg()+"'})");
  95. session.invalidate();
  96. }
  97. }
  98. //System.out.println(resultstr);
  99. %>
  100. <%=resultstr%>