From 277adebe62e6f8cf68f9365bd70ca5d475b7f556 Mon Sep 17 00:00:00 2001 From: "LAPTOP-SB56SG4Q\\86185" Date: Sun, 1 Aug 2021 19:46:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BC=80=E6=BA=90=E6=9D=90?= =?UTF-8?q?=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JSD-7449需求确认书.docx | Bin 0 -> 39780 bytes README.md | 5 +- plugin.xml | 23 ++ .../config/simple/DemoInitializeMonitor.java | 22 ++ .../simple/PluginInitializeFilterBridge.java | 22 ++ .../simple/PluginLocaleFinderBridge.java | 10 + .../simple/account/PluginSimpleConfig.java | 46 ++++ .../com/fr/plugin/sso/filter/SSOFilter.java | 90 +++++++ src/main/java/com/fr/plugin/sso/test.java | 32 +++ .../java/com/fr/plugin/sso/utils/FRUtils.java | 158 ++++++++++++ .../com/fr/plugin/sso/utils/HttpUtils.java | 229 ++++++++++++++++++ .../fr/plugin/sso/utils/ResponseUtils.java | 80 ++++++ .../java/com/fr/plugin/sso/utils/Utils.java | 92 +++++++ 13 files changed, 808 insertions(+), 1 deletion(-) create mode 100644 JSD-7449需求确认书.docx create mode 100644 plugin.xml create mode 100644 src/main/java/com/fr/plugin/sso/config/simple/DemoInitializeMonitor.java create mode 100644 src/main/java/com/fr/plugin/sso/config/simple/PluginInitializeFilterBridge.java create mode 100644 src/main/java/com/fr/plugin/sso/config/simple/PluginLocaleFinderBridge.java create mode 100644 src/main/java/com/fr/plugin/sso/config/simple/account/PluginSimpleConfig.java create mode 100644 src/main/java/com/fr/plugin/sso/filter/SSOFilter.java create mode 100644 src/main/java/com/fr/plugin/sso/test.java create mode 100644 src/main/java/com/fr/plugin/sso/utils/FRUtils.java create mode 100644 src/main/java/com/fr/plugin/sso/utils/HttpUtils.java create mode 100644 src/main/java/com/fr/plugin/sso/utils/ResponseUtils.java create mode 100644 src/main/java/com/fr/plugin/sso/utils/Utils.java diff --git a/JSD-7449需求确认书.docx b/JSD-7449需求确认书.docx new file mode 100644 index 0000000000000000000000000000000000000000..e8be409041fed97e530cf34bffdfd4b54ca09ba1 GIT binary patch literal 39780 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 + com.fr.plugin.sso + + yes + 1.0.6 + 10.0 + 2018-07-31 + fr.open + + + com.fr.plugin.sso + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/sso/config/simple/DemoInitializeMonitor.java b/src/main/java/com/fr/plugin/sso/config/simple/DemoInitializeMonitor.java new file mode 100644 index 0000000..63ee106 --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/config/simple/DemoInitializeMonitor.java @@ -0,0 +1,22 @@ +package com.fr.plugin.sso.config.simple; + +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; +import com.fr.plugin.sso.config.simple.account.PluginSimpleConfig; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2018-12-04 + */ +public class DemoInitializeMonitor extends AbstractPluginLifecycleMonitor { + @Override + public void afterRun(PluginContext pluginContext) { + PluginSimpleConfig.getInstance(); + } + + @Override + public void beforeStop(PluginContext pluginContext) { + + } +} diff --git a/src/main/java/com/fr/plugin/sso/config/simple/PluginInitializeFilterBridge.java b/src/main/java/com/fr/plugin/sso/config/simple/PluginInitializeFilterBridge.java new file mode 100644 index 0000000..863f7de --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/config/simple/PluginInitializeFilterBridge.java @@ -0,0 +1,22 @@ +package com.fr.plugin.sso.config.simple; + +import com.fr.decision.fun.impl.AbstractEmbedRequestFilterProvider; +import com.fr.plugin.sso.config.simple.account.PluginSimpleConfig; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class PluginInitializeFilterBridge extends AbstractEmbedRequestFilterProvider { + + @Override + public void init(FilterConfig filterConfig) { + PluginSimpleConfig.getInstance(); + } + + @Override + public void filter(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException, ServletException { + + } +} diff --git a/src/main/java/com/fr/plugin/sso/config/simple/PluginLocaleFinderBridge.java b/src/main/java/com/fr/plugin/sso/config/simple/PluginLocaleFinderBridge.java new file mode 100644 index 0000000..ea49b11 --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/config/simple/PluginLocaleFinderBridge.java @@ -0,0 +1,10 @@ +package com.fr.plugin.sso.config.simple; + +import com.fr.stable.fun.impl.AbstractLocaleFinder; + +public class PluginLocaleFinderBridge extends AbstractLocaleFinder { + @Override + public String find() { + return "conf"; + } +} diff --git a/src/main/java/com/fr/plugin/sso/config/simple/account/PluginSimpleConfig.java b/src/main/java/com/fr/plugin/sso/config/simple/account/PluginSimpleConfig.java new file mode 100644 index 0000000..57bbc45 --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/config/simple/account/PluginSimpleConfig.java @@ -0,0 +1,46 @@ +package com.fr.plugin.sso.config.simple.account; + +import com.fr.config.*; +import com.fr.config.holder.Conf; +import com.fr.config.holder.factory.Holders; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.record.analyzer.EnableMetrics; + +@Visualization(category = "单点登录配置") +@EnableMetrics +public class PluginSimpleConfig extends DefaultConfiguration { + + private static volatile PluginSimpleConfig config = null; + + @Focus(id="com.fr.plugin.sso.config.simple", text = "单点登录配置", source = Original.PLUGIN) + public static PluginSimpleConfig getInstance() { + if (config == null) { + config = ConfigContext.getConfigInstance(PluginSimpleConfig.class); + } + return config; + } + + @Identifier(value = "单点env和url配置", name = "单点env和url配置", description = "格式env1,url1;env2,url2", status = Status.SHOW) + private Conf url = Holders.simple("env1,url1;env2,url2"); + + public String getUrl() { + return url.get(); + } + + public void setUrl(String url) { + this.url.set(url); + } + + @Override + public Object clone() throws CloneNotSupportedException { + PluginSimpleConfig cloned = (PluginSimpleConfig) super.clone(); +// cloned.text = (Conf) text.clone(); +// cloned.count = (Conf) count.clone(); +// cloned.price = (Conf) price.clone(); +// cloned.time = (Conf) time.clone(); +// cloned.student = (Conf) student.clone(); + return cloned; + } + +} diff --git a/src/main/java/com/fr/plugin/sso/filter/SSOFilter.java b/src/main/java/com/fr/plugin/sso/filter/SSOFilter.java new file mode 100644 index 0000000..a38a32a --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/filter/SSOFilter.java @@ -0,0 +1,90 @@ +package com.fr.plugin.sso.filter; + +import com.fr.decision.fun.impl.AbstractEmbedRequestFilterProvider; +import com.fr.json.JSONObject; +import com.fr.plugin.sso.config.simple.account.PluginSimpleConfig; +import com.fr.plugin.sso.utils.FRUtils; +import com.fr.plugin.sso.utils.HttpUtils; +import com.fr.plugin.sso.utils.ResponseUtils; +import com.fr.plugin.sso.utils.Utils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.Map; + +public class SSOFilter extends AbstractEmbedRequestFilterProvider { + + @Override + public void filter(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { + String url = FRUtils.getAllUrl(httpServletRequest); + FRUtils.FRLogInfo("url:"+url); + FRUtils.FRLogInfo("url2"+httpServletRequest.getRequestURL().toString()); + String token = httpServletRequest.getParameter("c_token"); + String env = httpServletRequest.getParameter("application_env"); + + FRUtils.FRLogInfo("token:"+token+";env:"+env); + + boolean isLogin = FRUtils.isLogin(httpServletRequest); + if(isLogin){ + return; + } + + if(Utils.isNotNullStr(token) && Utils.isNotNullStr(env)){ + Map envConfig = this.getEnvConfig(); + String postUrl = envConfig.get(env); + FRUtils.logout(httpServletRequest,httpServletResponse); + Map header=new HashMap(); + header.put("Conetent-type","application/json"); + header.put("h-app-id","100"); + header.put("h-token",token); + + String result = HttpUtils.HttpPostJson(postUrl,"",header); + + if(Utils.isNullStr(result)){ + ResponseUtils.failedResponse(httpServletResponse,"获取用户信息失败!"); + return; + } + + JSONObject json = new JSONObject(result); + String desc = json.getString("desc"); + + if(!desc.equals("OK")){ + ResponseUtils.failedResponse(httpServletResponse,"获取用户信息失败!"); + return; + } + + JSONObject data = json.getJSONObject("data"); + String username = data.getString("name"); + + String redirectURL = ""; + + if(url.contains("?c_token")){ + redirectURL = url.substring(0,url.indexOf("?c_token")); + }else{ + redirectURL = url.substring(0,url.indexOf("&c_token")); + } + + FRUtils.FRLogInfo("redirectUrl:"+redirectURL); + + FRUtils.login(httpServletRequest,httpServletResponse,username,""); + } + + + } + + private Map getEnvConfig() { + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + String url = psc.getUrl(); + FRUtils.FRLogInfo("config:"+url); + String[] urls = url.split(";"); + Map result = new HashMap(); + + for(String config : urls){ + String[] configs = config.split(","); + result.put(configs[0],configs[1]); + } + + return result; + } +} \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/sso/test.java b/src/main/java/com/fr/plugin/sso/test.java new file mode 100644 index 0000000..20efea9 --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/test.java @@ -0,0 +1,32 @@ +package com.fr.plugin.sso; + +import com.fr.plugin.sso.config.simple.account.PluginSimpleConfig; +import com.fr.plugin.sso.utils.FRUtils; + +import java.util.HashMap; +import java.util.Map; + +public class test { + public static void main(String[] args) { + String env = "https://test-traffic-dashboard.weimiaocaishang.com"; + String config = "https://test-traffic-dashboard.weimiaocaishang.com,http://test-internal-open.weimiaocaishang.com/api/auth/account/verify;https://traffic-dashboard.weimiaocaishang.com,http://internal-open.weimiaocaishang.com/api/auth/account/verify"; + Map result =getEnvConfig(); + String url = result.get(env); + System.out.println(); + } + + private static Map getEnvConfig() { + PluginSimpleConfig psc = PluginSimpleConfig.getInstance(); + String url = "https://test-traffic-dashboard.weimiaocaishang.com,http://test-internal-open.weimiaocaishang.com/api/auth/account/verify;https://traffic-dashboard.weimiaocaishang.com,http://internal-open.weimiaocaishang.com/api/auth/account/verify"; + FRUtils.FRLogInfo("config:"+url); + String[] urls = url.split(";"); + Map result = new HashMap(); + + for(String config : urls){ + String[] configs = config.split(","); + result.put(configs[0],configs[1]); + } + + return result; + } +} diff --git a/src/main/java/com/fr/plugin/sso/utils/FRUtils.java b/src/main/java/com/fr/plugin/sso/utils/FRUtils.java new file mode 100644 index 0000000..90bb8db --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/utils/FRUtils.java @@ -0,0 +1,158 @@ +package com.fr.plugin.sso.utils; + +import com.fr.decision.authority.AuthorityContext; +import com.fr.decision.authority.data.User; +import com.fr.decision.webservice.login.LogInOutResultInfo; +import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.decision.webservice.v10.login.LoginService; +import com.fr.decision.webservice.v10.login.event.LogInOutEvent; +import com.fr.decision.webservice.v10.user.UserService; +import com.fr.event.EventDispatcher; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; +import com.fr.stable.query.QueryFactory; +import com.fr.stable.query.restriction.RestrictionFactory; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.util.List; + +public class FRUtils { + /** + * 判断用户是否存在 + * @param userName + * @return + */ + public static boolean isUserExist(String userName){ + if (StringUtils.isEmpty(userName)) { + return false; + } else { + try { + List var1 = AuthorityContext.getInstance().getUserController().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName))); + return var1 != null && !var1.isEmpty(); + } catch (Exception var2) { + FineLoggerFactory.getLogger().error(var2.getMessage()); + return false; + } + } + } + + /** + * 判断是否登录FR + * @param req + * @return + */ + public static boolean isLogin(HttpServletRequest req){ + return LoginService.getInstance().isLogged(req); + } + + /** + * 帆软登录 + * @param httpServletRequest + * @param httpServletResponse + * @param userName + * @param url + */ + public static void login(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String userName,String url){ + + FineLoggerFactory.getLogger().info("FRLOG:用户名:"+userName); + FineLoggerFactory.getLogger().info("FRLOG:跳转链接:"+url); + + + //判断用户名是否为空 + if(!Utils.isNullStr(userName)){ + if(isUserExist(userName)){ + String FRToken = ""; + + try { + HttpSession session = httpServletRequest.getSession(true); + + FRToken = LoginService.getInstance().login(httpServletRequest, httpServletResponse, userName); + + httpServletRequest.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,FRToken); + + session.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, FRToken); + EventDispatcher.fire(LogInOutEvent.LOGIN,new LogInOutResultInfo(httpServletRequest,httpServletResponse,userName,true)); + FineLoggerFactory.getLogger().info("FRLOG:登陆成功!"); + + if(!Utils.isNullStr(url)){ + httpServletResponse.sendRedirect(url); + } + } catch (Exception e) { + ResponseUtils.failedResponse(httpServletResponse,"登录异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOG:登录异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"用户在报表系统中不存在!"); + FineLoggerFactory.getLogger().info("FRLOG:用户在报表系统中不存在!"); + } + }else{ + ResponseUtils.failedResponse(httpServletResponse,"用户名不能为空!"); + FineLoggerFactory.getLogger().info("FRLOG:用户名不能为空!"); + } + } + + /** + * + * @param httpServletRequest + * @param httpServletResponse + */ + public static void logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) + { + if(!isLogin(httpServletRequest)){ + return ; + } + + try { + LoginService.getInstance().logout(httpServletRequest,httpServletResponse); + } catch (Exception e) { + ResponseUtils.failedResponse(httpServletResponse,"登出异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOG:登出异常,请联系管理员!"); + FineLoggerFactory.getLogger().info("FRLOGException:"+e.getMessage()); + } + } + + /** + * 打印FR日志 + * @param message + */ + public static void FRLogInfo(String message){ + FineLoggerFactory.getLogger().info("FRLOG:"+message); + } + + /** + * 根据用户名获取用户信息 + * @param userName + * @return + */ + public static User getFRUserByUserName(String userName){ + try { + return UserService.getInstance().getUserByUserName(userName); + } catch (Exception e) { + FRLogInfo("获取用户信息异常:"+e.getMessage()); + } + + return null; + } + + /** + * 解密FR密码 + * @param password + * @return + */ +// public static String decryptFRPsd(String password){ +// FRLogInfo("解密密码:"+password); +// return TransmissionTool.decrypt(password); +// } + + /** + * 获取带参数的访问链接 + * @return + */ + public static String getAllUrl(HttpServletRequest httpServletRequest){ + return WebUtils.getOriginalURL(httpServletRequest); + } +} diff --git a/src/main/java/com/fr/plugin/sso/utils/HttpUtils.java b/src/main/java/com/fr/plugin/sso/utils/HttpUtils.java new file mode 100644 index 0000000..ef076fa --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/utils/HttpUtils.java @@ -0,0 +1,229 @@ +package com.fr.plugin.sso.utils; + +import com.fr.log.FineLoggerFactory; +import com.fr.third.org.apache.http.HttpEntity; +import com.fr.third.org.apache.http.HttpResponse; +import com.fr.third.org.apache.http.HttpStatus; +import com.fr.third.org.apache.http.NameValuePair; +import com.fr.third.org.apache.http.client.CookieStore; +import com.fr.third.org.apache.http.client.entity.UrlEncodedFormEntity; +import com.fr.third.org.apache.http.client.methods.HttpGet; +import com.fr.third.org.apache.http.client.methods.HttpPost; +import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; +import com.fr.third.org.apache.http.entity.StringEntity; +import com.fr.third.org.apache.http.impl.client.BasicCookieStore; +import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; +import com.fr.third.org.apache.http.impl.client.HttpClients; +import com.fr.third.org.apache.http.impl.cookie.BasicClientCookie; +import com.fr.third.org.apache.http.message.BasicNameValuePair; +import com.fr.third.org.apache.http.ssl.SSLContexts; +import com.fr.third.org.apache.http.ssl.TrustStrategy; +import com.fr.third.org.apache.http.util.EntityUtils; + +import javax.net.ssl.SSLContext; +import javax.servlet.http.Cookie; +import java.io.UnsupportedEncodingException; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class HttpUtils { + /** + * httpGet请求 + * @param url + * @return + */ + public static String get(String url,Cookie[] cookies){ + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--url:"+url); + + //创建httpClient + CloseableHttpClient httpclient = createHttpClient(cookies); + + HttpGet getMethod = new HttpGet(url); + + try { + HttpResponse response = httpclient.execute(getMethod); + + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--status:"+response.getStatusLine().getStatusCode()); + + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + HttpEntity entity = response.getEntity(); + String returnResult = EntityUtils.toString(entity, "utf-8"); + + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--returnResult:"+returnResult); + + return returnResult; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--exception:"+e.getMessage()); + } + + return ""; + } + + /** + * HttpPost请求 + * @param postMethod + * @return + */ + private static String HttpPost(HttpPost postMethod){ + CloseableHttpClient httpclient = createHttpClient(null); + + try { + HttpResponse response = httpclient.execute(postMethod); + + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:status:"+response.getStatusLine().getStatusCode()); + + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + HttpEntity entity = response.getEntity(); + String returnResult = EntityUtils.toString(entity, "utf-8"); + + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:returnResult:"+returnResult); + + return returnResult; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPost:exception:"+e.getMessage()); + } + + return ""; + } + + public static String HttpPostXML(String url, String xmlParam){ + FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-type", "text/html"); + HttpEntity entity2 = null; + try { + entity2 = new StringEntity(xmlParam); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity2); + + return HttpPost(postMethod); + } + + public static String HttpPostJson(String url, String param,Map header){ + FineLoggerFactory.getLogger().info("FRLOG:HttpPostJSON:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + postMethod.setHeader("Content-Type","application/json"); + + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + postMethod.setHeader(key,header.get(key)); + } + } + + if(!Utils.isNullStr(param)){ + HttpEntity entity2 = null; + try { + entity2 = new StringEntity(param); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpPostJSON:参数异常:"+e.getMessage()); + return ""; + } + + postMethod.setEntity(entity2); + } + + return HttpPost(postMethod); + } + + public static String HttpPostWWWForm(String url, Map header,Map param){ + FineLoggerFactory.getLogger().info("FRLOG:HttpWWWForm:url:"+url); + + HttpPost postMethod = new HttpPost(url); + + if(header != null && header.size() > 0){ + Set keySet = header.keySet(); + + for(String key : keySet){ + postMethod.setHeader(key,header.get(key)); + } + } + + if(param != null && param.size() > 0){ + List params = new ArrayList(param.size()); + + for(Map.Entry map : param.entrySet()){ + params.add(new BasicNameValuePair(map.getKey(), map.getValue())); + } + + try { + postMethod.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().info("FRLOG:HttpWWWForm:异常:"+e.getMessage()); + return ""; + } + } + + return HttpPost(postMethod); + } + + private static CloseableHttpClient createHttpClient(Cookie[] cookies){ + + SSLContext sslContext = null; + try { + sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { + @Override + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + return true; + } + }).build(); + } catch (NoSuchAlgorithmException e) { + FRUtils.FRLogInfo("createHttpClientException:"+e.getMessage()); + } catch (KeyManagementException e) { + FRUtils.FRLogInfo("createHttpClientException:"+e.getMessage()); + } catch (KeyStoreException e) { + FRUtils.FRLogInfo("createHttpClientException:"+e.getMessage()); + } + + CloseableHttpClient httpclient = null; + + if(cookies != null && cookies.length > 0){ + CookieStore cookieStore = cookieToCookieStore(cookies); + + httpclient = HttpClients.custom().setSslcontext(sslContext). + setSSLHostnameVerifier(new NoopHostnameVerifier()).setDefaultCookieStore(cookieStore).build(); + } + else{ + httpclient = HttpClients.custom().setSslcontext(sslContext). + setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); + } + + return httpclient; + } + + /** + * cookies转cookieStore + * @param cookies + * @return + */ + public static CookieStore cookieToCookieStore(Cookie[] cookies){ + CookieStore cookieStore = new BasicCookieStore(); + + if(cookies != null && cookies.length>0){ + for(Cookie cookie : cookies){ + BasicClientCookie cookie1 = new BasicClientCookie(cookie.getName(), cookie.getValue()); + cookieStore.addCookie(cookie1); + } + } + + return cookieStore; + } +} diff --git a/src/main/java/com/fr/plugin/sso/utils/ResponseUtils.java b/src/main/java/com/fr/plugin/sso/utils/ResponseUtils.java new file mode 100644 index 0000000..7cf4f94 --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/utils/ResponseUtils.java @@ -0,0 +1,80 @@ +package com.fr.plugin.sso.utils; + +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +public class ResponseUtils { + private static final int SUCCESS = 200; + private static final int FAILED = -1; + + public static void successResponse(HttpServletResponse res, String body) { + response(res, body, SUCCESS); + } + + public static void failedResponse(HttpServletResponse res, String body) { + response(res, body, FAILED); + } + + private static void response(HttpServletResponse res, String body, int code) { + JSONObject object = new JSONObject(); + PrintWriter pw; + try { + object.put("code", code); + object.put("data", body); + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("application/json;charset=utf-8"); + String result = object.toString(); + pw.println(result); + pw.flush(); + pw.close(); + } + + public static void response(HttpServletResponse res,JSONObject json){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("application/json;charset=utf-8"); + String result = json.toString(); + pw.println(result); + pw.flush(); + pw.close(); + } + + public static void setCSRFHeader(HttpServletResponse httpServletResponse){ + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH"); + httpServletResponse.setHeader("Access-Control-Max-Age", "36000"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization,authorization"); + } + + public static void responseJsonp(HttpServletRequest req, HttpServletResponse res, JSONObject json){ + PrintWriter pw; + try { + pw = WebUtils.createPrintWriter(res); + } catch (Exception e) { + FineLoggerFactory.getLogger().info(e.getMessage()); + return; + } + res.setContentType("text/javascript;charset=utf-8;charset=utf-8"); + String result = json.toString(); + + String jsonp=req.getParameter("callback"); + + pw.println(jsonp+"("+result+")"); + pw.flush(); + pw.close(); + } +} diff --git a/src/main/java/com/fr/plugin/sso/utils/Utils.java b/src/main/java/com/fr/plugin/sso/utils/Utils.java new file mode 100644 index 0000000..68471ba --- /dev/null +++ b/src/main/java/com/fr/plugin/sso/utils/Utils.java @@ -0,0 +1,92 @@ +package com.fr.plugin.sso.utils; + +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.CodeUtils; +import com.fr.third.org.apache.commons.codec.digest.DigestUtils; +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.IOException; +import java.security.MessageDigest; +import java.util.UUID; + +public class Utils { + + /** + * 判断字符串是否为空 + * @param str + * @return true 空字符串 false 非空字符串 + */ + public static boolean isNullStr(String str){ + return !(str != null && !str.isEmpty() && !"null".equals(str)); + } + + /** + * 判断字符串是否非空 + * @param str + * @return + */ + public static boolean isNotNullStr(String str){ + return !isNullStr(str); + } + + /** + * MD5加密 + * @param str + * @return + */ + public static String getMd5Str(String str) + { + return DigestUtils.md5Hex(str); + } + + + /** + * 获取完整的访问路径 + */ + public static String getAllUrl(HttpServletRequest req, String queryStr){ + String url = req.getRequestURL().toString(); + + if(isNullStr(queryStr)){ + return url; + } + + return url+"?"+queryStr; + } + + /** + * 帆软shaEncode加密 + */ + + public static String shaEncode(String str){ + return CodeUtils.sha256Encode(str); + } + + /** + * 获取uuid + */ + public static String uuid(){ + return UUID.randomUUID().toString(); + } + + public static JSONObject getRequestBody(HttpServletRequest req){ + StringBuffer sb = new StringBuffer(); + String line = null; + try { + BufferedReader reader = req.getReader(); + while ((line = reader.readLine()) != null) + sb.append(line); + } catch (Exception e) { + FRUtils.FRLogInfo("getRequestBody:exception:"+e.getMessage()); + } + //将空格和换行符替换掉避免使用反序列化工具解析对象时失败 + String jsonString = sb.toString().replaceAll("\\s","").replaceAll("\n",""); + + JSONObject json = new JSONObject(jsonString); + + return json; + } +}