From 9277a5a2226b7c7e0082f480eac2bc7f66e0751f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Thu, 25 Jul 2024 10:17:24 +0800 Subject: [PATCH] 'commit' --- .../Sso/Controller/WebLoginController.java | 8 +- .../java/com/dsideal/Sso/Model/BaseModel.java | 19 +- src/main/java/com/dsideal/Start.java | 10 +- .../java/com/dsideal/Util/CommonUtil.java | 546 +----------------- .../Sso/Controller/WebLoginController.class | Bin 10026 -> 10061 bytes .../com/dsideal/Sso/Model/BaseModel.class | Bin 3451 -> 3336 bytes target/classes/com/dsideal/Start.class | Bin 4224 -> 4131 bytes .../classes/com/dsideal/Util/CommonUtil.class | Bin 21066 -> 6576 bytes 8 files changed, 23 insertions(+), 560 deletions(-) diff --git a/src/main/java/com/dsideal/Sso/Controller/WebLoginController.java b/src/main/java/com/dsideal/Sso/Controller/WebLoginController.java index e111ef4..0585efb 100644 --- a/src/main/java/com/dsideal/Sso/Controller/WebLoginController.java +++ b/src/main/java/com/dsideal/Sso/Controller/WebLoginController.java @@ -32,7 +32,7 @@ public class WebLoginController extends Controller { Set _set = RedisKit.SMembers(PropKit.get("SYS_JRXT")); boolean found = false; for (String s : _set) { - if (redirect_url.indexOf(s) >= 0) { + if (redirect_url.contains(s)) { found = true; break; } @@ -48,7 +48,7 @@ public class WebLoginController extends Controller { Kv kv = SsoLoginHelper.loginCheck(getRequest()); if (kv.getBoolean("success")) { String ssoSessionId = PropKit.get("sso.sessionid"); - if (redirect_url.indexOf("?") == -1) { + if (!redirect_url.contains("?")) { redirect301(redirect_url + "?" + ssoSessionId + "=" + kv.getStr("session_id")); } else { redirect301(redirect_url + "&" + ssoSessionId + "=" + kv.getStr("session_id")); @@ -152,7 +152,7 @@ public class WebLoginController extends Controller { BaseModel bm = new BaseModel(); Record loginMap = bm.getLoginInfoByUserName(username); - if (loginMap == null || !passwordEncode.equals(loginMap.get("pwd").toString())) { + if (passwordEncode != null && (loginMap == null || !passwordEncode.equals(loginMap.get("pwd").toString()))) { //扩展支持连续输入用户名密码错误,停用账号5分钟功能 2022.06.07 cntNum = 1; if (RedisKit.Exists(PassWordKey)) @@ -227,10 +227,8 @@ public class WebLoginController extends Controller { /** * 功能:委托登录 * http://10.10.21.20:9001/dsssoserver/login?redirect_url=http://www.163.com/&random=123 需要加上随机数,否则会有浏览器缓存影响测试 - *

* 功能:票据验证 * http://10.10.21.20:9001/dsssoserver/check?token=2b4e9cc4-9357-45bf-a367-b61b0b5f4387 - *

* 上线前根据t_datashare_system中配置的服务器ip地址进行访问权限验证,目前不加限制 */ @Before({GET.class}) diff --git a/src/main/java/com/dsideal/Sso/Model/BaseModel.java b/src/main/java/com/dsideal/Sso/Model/BaseModel.java index 0fadb9b..e7a48ec 100644 --- a/src/main/java/com/dsideal/Sso/Model/BaseModel.java +++ b/src/main/java/com/dsideal/Sso/Model/BaseModel.java @@ -21,14 +21,10 @@ public class BaseModel { String redisKey = "global_" + key; if (RedisKit.Exists(redisKey)) return RedisKit.Get(redisKey); String result = ""; - try { - String sql = "select * from t_base_global where global_code=?"; - List list = Db.find(sql, key); - if (list.size() > 0) { - result = list.get(0).getStr("global_value"); - } - } catch (Exception e) { - e.printStackTrace(); + String sql = "select * from t_base_global where global_code=?"; + List list = Db.find(sql, key); + if (!list.isEmpty()) { + result = list.getFirst().getStr("global_value"); } RedisKit.Set(redisKey, result); return result; @@ -39,16 +35,15 @@ public class BaseModel { if (RedisKit.Exists(redisKey)) { Map _map = RedisKit.HGetAll(redisKey); Record record = new Record(); - for (Map.Entry entry : _map.entrySet()) { - String key = entry.getKey().toString(); - String value = entry.getValue().toString(); + for (var entry : _map.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); record.set(key, value); } return record; } String sql = "select login_name,pwd,identity_id,person_id from t_sys_loginperson where login_name=? and b_use=1"; Record record = Db.findFirst(sql, username); - RedisKit.HSet(redisKey, "login_name", record.getStr("login_name")); RedisKit.HSet(redisKey, "pwd", record.getStr("pwd")); RedisKit.HSet(redisKey, "identity_id", record.getStr("identity_id")); diff --git a/src/main/java/com/dsideal/Start.java b/src/main/java/com/dsideal/Start.java index 2fff933..39b3ae6 100644 --- a/src/main/java/com/dsideal/Start.java +++ b/src/main/java/com/dsideal/Start.java @@ -2,14 +2,11 @@ package com.dsideal; import Plugin.LogBackLogFactory; import cn.hutool.core.io.FileUtil; -import com.dsideal.Const.OsSystemConst; import com.dsideal.Interceptor.EmptyInterceptor; import com.dsideal.Sso.Controller.CommomController; import com.dsideal.Sso.Controller.WebLoginController; -import com.dsideal.Util.CommonUtil; import com.jfinal.config.*; import com.jfinal.kit.PropKit; -import com.jfinal.log.Log; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.druid.DruidPlugin; import com.jfinal.plugin.redis.RedisPlugin; @@ -17,9 +14,9 @@ import com.jfinal.server.undertow.UndertowServer; import com.jfinal.template.Engine; import java.io.File; +import java.util.Objects; public class Start extends JFinalConfig { - private static Log log = Log.getLog(Start.class); public static void main(String[] args) { UndertowServer.create(Start.class, "undertow.properties").start(); @@ -27,7 +24,7 @@ public class Start extends JFinalConfig { public void onStart() { //打印 启动Logo - String path = Start.class.getClassLoader().getResource("logo.txt").getPath(); + String path = Objects.requireNonNull(Start.class.getClassLoader().getResource("logo.txt")).getPath(); File file = new File(path); System.out.println(FileUtil.readUtf8String(file)); } @@ -39,7 +36,7 @@ public class Start extends JFinalConfig { //配置日志框架logback me.setLogFactory(new LogBackLogFactory()); PropKit.use("application.properties"); - } + } /** * 配置路由 @@ -74,7 +71,6 @@ public class Start extends JFinalConfig { * 配置全局拦截器 */ public void configInterceptor(Interceptors me) { - //注册非空拦截器 me.add(new EmptyInterceptor()); } diff --git a/src/main/java/com/dsideal/Util/CommonUtil.java b/src/main/java/com/dsideal/Util/CommonUtil.java index 302a8be..bec9ee1 100644 --- a/src/main/java/com/dsideal/Util/CommonUtil.java +++ b/src/main/java/com/dsideal/Util/CommonUtil.java @@ -1,24 +1,12 @@ package com.dsideal.Util; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.io.FileUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.dsideal.Const.OsSystemConst; -import com.jfinal.kit.PathKit; import com.jfinal.kit.PropKit; -import com.jfinal.kit.StrKit; -import com.jfinal.plugin.activerecord.Page; -import com.jfinal.plugin.activerecord.Record; import com.jfinal.plugin.hikaricp.HikariCpPlugin; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.*; -import java.net.URISyntaxException; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; @@ -29,39 +17,10 @@ public class CommonUtil { //在独立的main函数中,使用下面的方式进行声明logback对象 private static Logger log = LoggerFactory.getLogger(CommonUtil.class); - //获取当前年份 - public static String getCurrentYear() { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); - Date date = new Date(); - return sdf.format(date); - } - - /** - * 功能:校验密码强度 - * 作者:吴缤 - * 日期:2019-01-19 - * - * @param pwd - * @return - */ - public static boolean getPwdLegal(String pwd) { - boolean flag = false; - try { - String regExp = "[a-z0-9A-Z]+"; - Pattern p = Pattern.compile(regExp); - Matcher m = p.matcher(pwd); - return m.matches(); - } catch (Exception e) { - return false; - } - } private static String TruncateUrlPage(String strURL) { String strAllParam = null; - String[] arrSplit = null; - strURL = strURL.trim(); - - arrSplit = strURL.split("[?]"); + String[] arrSplit = strURL.split("[?]"); if (strURL.length() > 1) { if (arrSplit.length > 1) { if (arrSplit[1] != null) { @@ -69,14 +28,12 @@ public class CommonUtil { } } } - return strAllParam; } + private static Map URLRequest(String URL) { Map mapRequest = new HashMap(); - - String[] arrSplit = null; - + String[] arrSplit; String strUrlParam = TruncateUrlPage(URL); if (strUrlParam == null) { return mapRequest; @@ -93,7 +50,7 @@ public class CommonUtil { mapRequest.put(arrSplitEqual[0], arrSplitEqual[1]); } else { - if (arrSplitEqual[0] != "") { + if (!Objects.equals(arrSplitEqual[0], "")) { // 只有参数没有值,不加入 mapRequest.put(arrSplitEqual[0], ""); } @@ -110,10 +67,10 @@ public class CommonUtil { Map parasMap = URLRequest(redirect_url); for (Map.Entry entry : parasMap.entrySet()) { if (!entry.getKey().equals(PropKit.get("sso.sessionid"))) { - if (uri.indexOf("?") == -1) { - uri += "?"+entry.getKey()+"="+entry.getValue(); - }else{ - uri += "&"+entry.getKey()+"="+entry.getValue(); + if (!uri.contains("?")) { + uri += "?" + entry.getKey() + "=" + entry.getValue(); + } else { + uri += "&" + entry.getKey() + "=" + entry.getValue(); } } } @@ -123,202 +80,6 @@ public class CommonUtil { return redirectUrl; } - /** - * 功能:获取操作系统类型 - * 作者:黄海 - * 时间:2019-04-22 - * - * @return - */ - public static int getOsSystemType() { - String os = System.getProperty("os.name"); - if (os.toLowerCase().startsWith("win")) { - return OsSystemConst.WINDOWS; - } else { - return OsSystemConst.CENTOS; - } - } - - /** - * 功能:删除指定目录下所有的文件 - * 作者:黄海 - * 时间:2019-01-03 - * - * @param tempPath - */ - public static void clearFile(String tempPath) { - File file = new File(tempPath); - File[] tempList = file.listFiles(); - if (tempList != null) { - for (int i = 0; i < tempList.length; i++) { - if (tempList[i].isFile()) { - tempList[i].delete(); - } - } - } - } - - /** - * 功能:判断是不是合法的日期格式 - * 作者:黄海 - * 时间:2018-12-20 - * - * @param str - * @return - */ - public static boolean isValidDate(String str) { - boolean convertSuccess = true; - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - try { - format.setLenient(false); - format.parse(str); - } catch (ParseException e) { - convertSuccess = false; - } - return convertSuccess; - } - - /** - * 功能:将用户帐号和原始密码传入,返回是不是修改了密码 - * 作者:黄海 - * 时间:2018-12-12 - * - * @return - */ - public static Page ConvertLoginRs(Page page) { - List list = new ArrayList<>(); - for (int i = 0; i < page.getList().size(); i++) { - Record record = page.getList().get(i); - String original_pwd = record.get("original_pwd"); - String database_pwd = record.get("pwd"); - //将明文密码加密 - String pwd = CommonUtil.getLdapPassword(original_pwd); - if (!pwd.equals(database_pwd)) { - record.set("original_pwd", "用户已修改"); - } - record.remove("pwd"); - list.add(record); - } - Page pageRecords = new Page(list, page.getPageNumber(), page.getPageSize(), page.getTotalPage(), page.getTotalRow()); - return pageRecords; - } - - /** - * 功能:判断一个字符串是不是JSONArray格式 - * 作者:黄海 - * 时间:2018-12-12 - * - * @param content - * @return - */ - public static boolean isJsonArray(String content) { - try { - JSONArray.parseArray(content); - return true; - } catch (Exception e) { - return false; - } - } - - /** - * 功能:获取当前时间,按年月日+时分秒格式返回 - * 作者:黄海 - * 时间:2018-11-30 - * - * @return - */ - public static String GetCurrentTimeString() { - Date date = new Date(); - SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss"); - String nowTime = sdf.format(date); - return nowTime; - } - - /** - * 加签 - * - * @param map - * @return - */ - public static String Sign(Map map, String signKey) { - if (map == null) { - return null; - } - List keyList = new ArrayList<>(map.keySet()); - Collections.sort(keyList); - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < keyList.size(); i++) { - String key = keyList.get(i); - Object value = map.get(key); - sb.append(key + "=" + value + "&"); - } - String signStr = sb.substring(0, sb.length() - 1) + signKey; - String md5Str = DigestUtils.md5Hex(signStr); - return md5Str; - } - - /** - * 按照layUI格式分页获取数据 - */ - public static Map renderJsonForLayUI(List list, int count) { - Map result = new HashMap<>(); - result.put("code", 0); - result.put("msg", ""); - result.put("count", count); - result.put("data", list); - return result; - } - - public static Map renderJsonForLayUI(List list) { - Map result = new HashMap<>(); - result.put("code", 0); - result.put("msg", ""); - result.put("count", list.size()); - result.put("data", list); - return result; - } - - /** - * 按照layUI格式分页获取数据 - * - * @param dataPage - * @return - */ - public static Map renderJsonForLayUI(Page dataPage) { - Map result = new HashMap<>(); - result.put("code", 0); - result.put("msg", ""); - result.put("count", dataPage.getTotalRow()); - result.put("data", dataPage.getList()); - return result; - } - - /** - * 功能:判断一个字符串是不是整数 - * 作者:黄海 - * 时间:2018-11-19 - * - * @param str - * @return - */ - public static boolean isNumeric(String str) { - try { - for (int i = str.length(); --i >= 0; ) { - if (str.charAt(0) == '-') { - continue; - } else { - if (!Character.isDigit(str.charAt(i))) { - return false; - } - } - } - return true; - } catch (Exception err) { - return false; - } - - } - /** * 功能:封装一个返回json信息的函数 * 作者:黄海 @@ -327,26 +88,13 @@ public class CommonUtil { * @param result * @param message */ - public static Map returnMessageJson(boolean result, String message) { - Map map = new HashMap<>(); + public static Map returnMessageJson(boolean result, String message) { + Map map = new HashMap<>(); map.put("success", result); map.put("message", message); return map; } - public static Map returnMessageJson(boolean result, JSONObject jo) { - Map map = new HashMap<>(); - map.put("success", result); - map.put("result", jo); - return map; - } - - public static Map returnMessageJson(boolean result, List list) { - Map map = new HashMap<>(); - map.put("success", result); - map.put("result", list); - return map; - } /** * 功能:简单的md5加密 @@ -382,280 +130,6 @@ public class CommonUtil { } } - /** - * 功能:获取6位随机数 - * 作者:黄海 - * 日期:2018-11-27 - * - * @return - */ - public static String getSixRandom() { - String sources = "0123456789"; - Random rand = new Random(); - StringBuffer flag = new StringBuffer(); - for (int j = 0; j < 6; j++) { - flag.append(sources.charAt(rand.nextInt(9)) + ""); - } - return flag.toString(); - } - - /** - * 功能:执行一个shell指令,直到结束 - * 作者:黄海 - * 时间:2019-01-19 - * - * @param cmd - */ - public static void ExecShellWaitFinish(String cmd) { - Process process = null; - String ls_1; - try { - process = Runtime.getRuntime().exec(cmd); - BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); - while ((ls_1 = bufferedReader1.readLine()) != null) - log.info(ls_1); - bufferedReader1.close(); - process.getOutputStream().close(); - } catch (IOException e) { - e.printStackTrace(); - } - try { - if (process.waitFor() == 0) { - return; - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - /** - * 功能:验证是否为手机号 - * 作者:黄海 - * 日期:2018-11-27 - * 13+任意数 - * 15+除4的任意数 - * 18+除1和4的任意数 - * 17+除9的任意数 - * 147 - * - * @param phoneNum - * @return - */ - public static boolean getIsPhoneLegal(String phoneNum) { - try { - String regExp = "^((13[0-9])|(19[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$"; - Pattern p = Pattern.compile(regExp); - Matcher m = p.matcher(phoneNum); - return m.matches(); - } catch (Exception e) { - return false; - } - } - - /** - * 功能:验证是否为邮箱 - * 作者:黄海 - * 日期:2018-11-27 - * - * @param eMail - * @return - */ - public static boolean getIsEmailLegal(String eMail) { - try { - String regExp = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; - Pattern p = Pattern.compile(regExp); - Matcher m = p.matcher(eMail); - return m.matches(); - } catch (Exception e) { - return false; - } - } - - /** - * 功能:验证是否为日期格式 - * 作者:黄海 - * 日期:2018-12-07 - * - * @param date - * @return - */ - public static boolean getIsDateLegal(String date) { - if (date == null || StrKit.isBlank(date)) return false; - try { - String regExp = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))"; - Pattern p = Pattern.compile(regExp); - Matcher m = p.matcher(date); - return m.matches(); - } catch (Exception e) { - return false; - } - } - - /** - * 功能:判断性别是否在有效范围内 - * 作者:黄海 - * 日期:2018-12-07 - * - * @param xb - * @return - */ - public static boolean getXbCorrectRange(String xb) { - String[] stageArr = new String[]{"1", "2"}; - for (String s : stageArr) { - if (s.equals(xb)) { - return true; - } - } - return false; - } - - /** - * 功能:判断民族是否在有效范围内 - * 作者:黄海 - * 日期:2018-12-07 - * - * @param mz - * @return - */ - public static boolean getMzCorrectRange(String mz) { - String[] stageArr = new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "97", "98"}; - for (String s : stageArr) { - if (s.equals(mz)) { - return true; - } - } - return false; - } - - /** - * 功能:判断是不是合法的政治面貌 - * 作者:黄海 - * 时间:2019-01-05 - * - * @param zzmm - * @return - */ - public static boolean getZzmmCorrectRange(String zzmm) { - String[] stageArr = new String[]{"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13"}; - for (String s : stageArr) { - if (s.equals(zzmm)) { - return true; - } - } - return false; - } - - /** - * 功能:获取查询总数量的SQL语句 - * 作者:黄海 - * 时间:2021-11-01 - * - * @param findSql - * @return - */ - public static String getTotalSql(String findSql) { - String totalRowSql = "select count(*) from (" + findSql + ") as t100"; - return totalRowSql; - } - - /** - * 功能:接字符串,方便IN方式查询 - * 作者:黄海 - * 时间:2021-10-22 - * - * @param list - * @param key - * @return - */ - public static String getIds(List list, String key) { - String s = ""; - if (list.size() == 0) return "-1"; - for (Record record1 : list) s += "'" + record1.getStr(key) + "',"; - s = s.substring(0, s.length() - 1); - return s; - } - - /** - * 功能:输出字符串信息 - * - * @param str - */ - public static void printf(String str) { - System.out.println(DateTime.now() + " " + str); - } - - /*** - * delete CRLF; delete empty line ;delete blank lines - * - * @param input - * @return - */ - private static String deleteCRLFOnce(String input) { - return input.replaceAll("((\r\n)|\n)[\\s\t ]*(\\1)+", "$1"); - } - - /** - * delete CRLF; delete empty line ;delete blank lines - * - * @param input - * @return - */ - public static String deleteCRLF(String input) { - input = deleteCRLFOnce(input); - return deleteCRLFOnce(input); - } - - - public static void changeEncode(String source, String target) throws IOException { - InputStreamReader isr = new InputStreamReader(new FileInputStream(source), "gbk"); - OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(target), "utf-8"); - int len = 0; - char[] chars = new char[1024]; - while ((len = isr.read(chars)) != -1) { - osw.write(chars, 0, len); - } - osw.close(); - isr.close(); - } - - public static boolean checkPass(String pass) { - //注释掉必须要有符号这个要求:&& pass.matches(".*[~!@#$%^&*\\.?]{1,}.*") -// if (pass.matches(".*[a-z]{1,}.*") && pass.matches(".*[A-Z]{1,}.*") && pass.matches(".*\\d{1,}.*") && pass.length()>=7 ) { -// return true; -// } -// return false; - return true; - } - - public static boolean isBase64(String str) { - String base64Rule = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$"; - return Pattern.matches(base64Rule, str); - } - - /** - * 功能:返回当前class的运行路径 - * - * @return - */ - public static String getClassPath() throws URISyntaxException { - String path = PathKit.class.getClassLoader().getResource("").toURI().getPath(); - if (getOsSystemType() == OsSystemConst.WINDOWS) { - if (path.startsWith("/")) path = path.substring(1); - } - return path; - } - - public static void log(String msg) { - System.out.println(DateTime.now() + " " + msg); - } - - public static JSONObject getJsonFile(String filePath) { - return JSONObject.parseObject(FileUtil.readUtf8String((filePath))); - } - - public static void Print(String msg) { - System.out.println(DateTime.now() + " " + msg); - } public static boolean isLinux() { return System.getProperty("os.name").toLowerCase().contains("linux"); diff --git a/target/classes/com/dsideal/Sso/Controller/WebLoginController.class b/target/classes/com/dsideal/Sso/Controller/WebLoginController.class index b6ff55aeec6b0d1bd7fd6ddf03142369c2fcd94e..75528cbc7e4a2399282cf196b3de1f723fee95aa 100644 GIT binary patch delta 2782 zcmb7GYj{)j8UMW}mvfSyByB=k(v-HeP3a|}aw|{}RtrM86hs&lkrLai6xsxmau+Hv z=cd~S_J8&WOhgdGQDK&9OhGPl(h1Jp@UrPpaX2?N1~|Nc!1kWg6!6*hVITVTJ@5bb z-Y@Omnm1~!CvO})0-%z9&|xi>0!n=(+!|~O#|Yk{DT{*3gJsRZaAR53!eI2?(9&h0 zaD8Z0@mv{02{~e)JEwD{6g1J};$1ms(~b;dwSq0;nmo+>V--(en;5PXJGQHM3Ofj9 z)(%3Le@;%ODTuv=_W%FI7eu@~*4TPaN0r=kh_3GSk5Q7OCWd1156paWuo zC6itdYb?1G7f)F7s7oBR+(C!LMN2jv?sQmZ8I*%Ks^S=aCYo*c(9gvYTVFaZ-m&?N zzfkeo5AEr6Qe@Z*Y$sr_;soAM@hkjVOtjZ#{FY!?vZBF?Q+QLxTPoamo8S|x>^^bY zUYhcI{6WUMD&FIiT#h{BJ_YZKk&Z_CQ0#Ez4fsgKpI~Pj<3h~}J|?6zHH5;gO|7fy zn%L;W_(a8D@K&OOp`^K>=bj-0_HDNe2FXKv9t#Uex>3Xt}wX1ITVa4xIwTswFDbO zWs8=C8dC^FGD#{Kv@i?B8FMaMGK)&5E6>E8nH~)`wgeT%K&goY>Vx$QLzb5Qh#hC$c>@asz`$#K)y-^-`1ghLp&r-dnVX7SZO1DTc(G3l<7NSaONrF_q1`EpXoEm z^q3gr9ZTh6sW*MVaNa#Lh-o^FV5;i8iAGWde-Vx1SBbIvy?rNZSSuu^nJo3*hL?Nr zG@9S+taT^NwO-~jh#t5Q&Xhu&lOqV(ERKSoY zQnPosH^(t%c8SLr$K4$sQy`A5aXcxyvwej-=XlJ0@Js^Fx)rzl6nq||v)qut2u*|e zyWD(to)c*~KKiNHoSQ`*VrEW0b&8ca`Kd47X14SoUJ~s&LnkM06Z)MmCvary9w-&6 z^VO;T1iCBKLpV|U5?-&cd2FR|{IbICQM+-#WABFBqk8Pl-^B5|INs4B^yT`BI6_M@ z!W6f47Y6)CgjVB%gZQI}=KAQg7Gv87w}s%bByh%KW>ONzB>q|FJj+hb_Bcu4&o{;A zSbXlLSo2~`)}a@Yz~3tz{BY6Z&^@p*kHce6;L~JnxdrdhM+$w6SGW(uJ4f};r?!6B zCgtKusR-MpVb~#!#7?OaPfOL;!Z zGoF`rp+nk_1JVoVlwL$!;$llj(Ivf&gVK2%lCI!ogBgbnsW@Wr;;5lNj_H$p46Zi3 zh1GN~&4h(M;izWOH=%M657KOwIkXw+9cAX`=%cL3YMJA8G~{6;a|T!pp5z)dNnJFT zWhN|@I_N&;%xIPN(>%5(V};aC_cN!^cD@tysj`wC@1%#Qj)hj*O>1cZb18I@22+rg zRk}jO^Z?bvCK2_g1`5H>*<{hT_|-u*Vq1Py+bhN!7|dHCEL&Xw4>zY#RuA6FpK9r%G$T@{rW@=qZzj$S{FTE4?l0}4JVKlbOX5_LOiToP zL#ApsIk(4YG7A&mt0r2+<*GmdH-0e}p_x%ep6r(Yet{{{Q&_Rjm(doe2{_B+m>I|1 zttjx{IwgMRMK0@@*?t$@;iADBy9c8f(7R)P=h=X^mGwHxc`l&sV$X-JGPFnDW2MBe zT{4b~myBsSY)sEXY2$x3Y`6dqE^_#n;K!$&$YqSjXPAM{QHL+Eh$kV6t5|`r^fs30 z{atypjVp19$BzH_V~IZR5?frXA8~_zu~kUdQ6XapU+Lk=X0t2(JTLs;_n9FETEbyU qw3MR!+Yg!6b6I0LU8d6&I$fpHH9B3Z(>8j9HLQ&OE!O>%G2o1{(pAZ_}PHbvT$f5!~&6*&(=ao`|+rsD{HE?Zo4v)(2solBb?co*-f_@#~vyiW+o z$6WzA;3`e|HGZSww>o~u1zh7EYT2&gLpjIYLVu9^-9v|ctm6~7*hh7!O~a>zl-A}@ zM|W%Y{f({cbS?g*<1>6N?WwD>{!FlUh9X_zj^x>2b^Hx~mp!Q~yeA3P?(mXOhXXV5 zrH)fLEk~tw+0N+r3TNfEw7W)}*YQuBWxa)Mp{9t23j{}Nds9oOd~s)}B?bQ?s6;vm zBcEdFR*U5Vk9VkrV5^HXwX`>BWFu&`;j)EI3m1h915GD8IpkxWanp5zv&xW{RfRjc zBjGlU*p1ea)Yh=oFi6wMgKezZ73!{T>JCi{H8qDK4oasCl`?h8q9HQs&5)(u>3nH9 zD*1KFl`FiX{MnSRQvsgjBwIq=RpDkcfuTATQjt9D9j|3mu};J2YUxV9I=4ipQgF78 zNQiqYQhRS(8v{dSI_hbJ?D1sE*7Qu*NOsm9>gr+)G;XnX&hb0Z$y=RDp>bO&X5^~t^8X=EcgB%cX)X0M#!xOc%DBIZD&&BFMsyv< zpa&J$g>l%8>#!G{j(Nty1I83q(gR5p4_cr#? zO*DmzNWos3O4FdA9rI{9-3$xO;M5EN5?Z$`;>v4Sln?D9yejfYMN#2-h~XD7Ud3z` zW#{1$E~;fED^WF9XdsZyc2^)kGm~g^u?A5c%}StQJ;8~m0!pqNk=K*)gBT_>l=v($ zOxfwPmc{VH7@m@!<^_s-=J;&s*c``}3@t<5h=9-HsZin=XIL&M={}d|7csmO!>^3wrWFJnoSZ$8oLpLvOCQL`3IgMoB3JkIm*tCCY;4_?2`C6i;rIt8>L#3r4FjZ@s~2UKHQMOG09Y*npj4D_#*VqgU)eOuUNSq91+Y9rTOO zu}7T7UWM?Ql7f9oCSF(k*l#xLet4sJAIqtpz6Lve##!A;v!Qbm572Eaa~o|i*saVp znB8i~<}k-2r{rP{a|-NAda~17#V(r5GAr&8+i4ziHgt=vbUXV~u~a-qcQB{X23kpX z(&R}TcoT1s`7CtMW?Dv#%%#vtDx(E#tkXFvq9(cvPC?}7*=>f4tMOBaPu)}__ZL=0 z->_Un88^O)gDT$58o&hNiSU~v;8duAM_>+*z?$SJ{O2;bn`i5*!DWCuxGrOv_%Gk< zKQ6Q9O1SatJNaCYv3NW@+d%Xn5AGpk;xKaXmWgdG+~C2|KDvq!qd-ZFh9?V?b%D_}#@;PR1Wi_9#avoMtqfNsiumFeGYCsq%fg-A z_TRTGbtHh5ZwIoX!P+uUMGUvbFmFAIf|s{N&~t)eozM{UQn{B#8SEBZ&kBPx7W5n~ zGp2H(spUCdX3S#Z#WWe6kSDy91dV0IdGU}jt$>s1320HAWcCaA@Fk~z3PGIaLeAhO zzWsWfMI+8(G0r1`0W9Tj1OtE)^M03Iy2fQV$!*8~?&vi8U9iU`=AKr}rL03-K&6V& zyoj$&UN(m{H}InWy@FXqp)ki2)Jga7Z;(Go9%NV}Cha!qeI{LI(&Z+7z@#hbA+~U^ M_QUi|S_j|10qt-|wEzGB diff --git a/target/classes/com/dsideal/Sso/Model/BaseModel.class b/target/classes/com/dsideal/Sso/Model/BaseModel.class index d5e0ffe205b9eee5e8e03656a3133f6f22778f18..7b1badffb4abfee06ff6770a612a69cfff7d3037 100644 GIT binary patch delta 1306 zcmZ8hTXPd-7=FI&W_Oe9pr!?zTH66io2H3rYo(GZ2Q?8XX_W${SdF0xVcVQYQXrlp z9-*H3@BkiXywD5B!cA#$aJ+P!@ybgb|A04+S1Jzm*`(#dnaumW@4N5e`JQJt*IUoD zx_`WJ^*aE&@cCu;7ouCY%F$f0QWa4AJ%>H$z!no-=oTnunmveN#Kc~EkD5=Ps^}P%*OZo69FLlK%uZ`uKa#HM7#Fy8CV3(m&L;Dj@OY(U zfDsKCuCyZO)hAYhN2 zcK6jTqRHo6MyJ5{@OuM`2#y9rO9+Q9u~e;(?IJ*6J#=h96KyPY67dUdVs&EW*s>#RCS&%y3NoT8_&yAQQ0U6rFY;%PiXWY4nQWJ4qK95c@| z(+tPIXwtFo2Ew%UUk7S@;uPFqU+@K-Zd_0-vdKog(0i5m5DzZFa{*I421mbzfAR|M zji{kzY!g_nVTVA(X;TmtxPU?1+hdavk7zz^8DqA;FQVK2{)TV(RG;oM7BMmL<;o8} z^^*7T(U5u#j!C6=d-Jqr1$dc@BZ7;X3m@SV-rDycqq+EA delta 1496 zcmZWpYf~Fl7=BK&+0A8#YEsZdhF+$&Ap`?Riw!DLOIrlu1zH4)n8G$Jgd|NC3e`4v zuXkl@YrV8;RjPJ|_6vnNI!-@1e({T+^e6NesGZhlH=#P3%Q^4+p7;7ZXZLvMuaNiW z8&`e+(2fh2yywJvsh}Ux1f1d8P9N6cZWWucg?dUe1S-Rw=C5L;O+kY|U_3dUjHQ#A zRIFoWM9Ud^HseJMO)Bn%EU+e**E2@1ksO)m%O^)PFH~$*u?;O|yJNc?SJ8_5%{fPl zuMH0=XjicV51UsVjlK@-Qm|Xa9(0;F9NTmh5(1(5%Pg=e*N9odLy>MVq#Z%ZX;5M?o2D?oO ztPR(8|1((0+G>SAtzy^;cQbrnGCjq4!bqw(fD!gnu;A$lo4+{|LNjZnF*&7T47zzr z8oqNvz?;sd^vrN3IceiCsUm}{S>fu49Ab3t@TeOF0iQmqWenYz9oA`>67b}-d?A~m zs^GAB)OBL4a40R{|9^|bAgveJ#BHTBd;V@(S_K3Nt^8NWExLH-oX}=DR9+j^3q*zR z^O~YZKDN+EXAdOP!@`X-0!nF0u|~$HUVMhn6`WJy z!58K+_wVAoIp~Q<-w4#0L!O#3mg>%CC#G`PfN7FpeVh<*LFPI`Eyi7NcSSBkT%zE> zELZCoyi7;z)po$Mc#fLDQCPe(ScL3Ez+SV$+fY1%wLzD21)CiB5n+F13DLv?ym2Wg zEuk@5zl`Ski;S74pv2xRv^b#EjACtUH$-zQxc!iP^ua<|jO3vXp z<6omC0O>jc3SPgC2Ch34#ALk51D9Yf3y8Pyb{U8Zj466(T&%l-`+%P4GJL18pWF7t zcL)z$#shJwegzK-tYD`=+!b`K;1Pk-Xtt!s1TpK2%RzYs`vjIS5LYaDs3g0CQcwxH zm+(yg!p)z8(nbGhqF(wQjsa&~?=lX?rKrC+9+dp!1brFls6R&~x2oi+3IV0+k7qF;%gBn8Da5t zzRcG+I&89?EZb6!SY^)2HaU+|OlMKI0nVFjUsfs@U*lT@{{|EsDXRbg diff --git a/target/classes/com/dsideal/Start.class b/target/classes/com/dsideal/Start.class index 2850b883a395853b465102849ae048006e425982..bc02b3457ae42ca6d83328d4ca9b7085ac614d83 100644 GIT binary patch delta 1553 zcmZ`(YgZdp6x}zOFvHA{!hjS7EQQq)3?zjX+d`}Ksg@8b6=HnV5F!l?gie53tqoe= zqP1Qh^=+;1SEaR+2wLl-KDzws*ZzX8y@K;S?IjNPs={`D!(i@6`v5UzkxSpyd_F|n^!9RXa7@sGSIcgcfxh-dSu9XRy=4 zO-5H1-Ju03_Z;IY%3qBV(h+Wy=dyAtX+eN#oFQtvQIXAX7GK#q-L_7t*XT7u7Q!K~ zvDb)*%~GKzGS^3Z{yd>lyB#r%X`EZ4lZJ(iE!0ZFq9L|Go10=w9vz#fV?>u-LWi$0 zW3yePNx6tEG>d51h-EQo>=(;0Ef$i-7(FvcPjq=3EgT}$k#J)MlR>VMmQLXY_61l z&>QwUH^-uZu)nQl%!GP41vJQLL=!)$Yc{u_RlxN!)?yw1OE+rXfHnc`GCJVkeflc4 zkx%MZSv#SZa07Y-+$ducdKt?2Kc+H1uWw;D@xS$D=6>8Fz$Ieo&hbbn6bTF1%8QH*>`vY#6!9%aYx!MtI61Ln zd^8%A(2pH5#xcR5_xoZD*YVS=l%FtKw(evw?3wmOMeJe_r@YhCdn3^a36t0@ASfe* zYKDTPrJx`xNk~M5;hKqPV8$2i2~zB!H$+w3hP$;YMtMQrusMc30%kPrd-?7>k6}MU zBd;?zS|sely_(;B3~O!NVXolSLJ7N{GO#rtB=w>FBfg2iw1@{tSyWqY4@`-8h(StQ zQ;}#)%k2>vkK!?YRA@CnfhPq#CF5y4!~Ybj#RGUwqj;V>4aK}dEMc6l7wfEtwSK&W zBLZI5l)b`G&M%qE`4O?(Dd8wy6Y#o>H}EEdLIrkC?hJ&zL1!@Hce)~ehCHfbYEfF8Pdlvhfg)t1TaY6nqtMifKE>WT`Ibj zz9epTFH%`jh&GC^!7|jQSc=n885WAid>kr4XHuLeOojxK8J?jGkJYXWDYvTF?6xZ& zWsA00O4LAQZ6v^^93pF$$clM^sHs~{3j8w$`)9qqui=%nvo7h2GRA^MDsp*NL4OIlAh z0XHS^1tqW=@pbqTUy<;7>eJWwhAKWppx@#GU6m`^@*Td<|zE)l%#FkGPnD|KDb~bKtIQ#!r{w(r6-n&b}s`9Lw5muORmU;YDrzdsWI diff --git a/target/classes/com/dsideal/Util/CommonUtil.class b/target/classes/com/dsideal/Util/CommonUtil.class index 564c927935ec4ccd57d5a98d4811909dbb9d92e2..61324e45ebd3b80b776aafc337a53fba4296d2f7 100644 GIT binary patch literal 6576 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 literal 21066 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