14 changed files with 785 additions and 1 deletions
Binary file not shown.
Binary file not shown.
@ -1,3 +1,6 @@
|
||||
# open-JSD-8146 |
||||
|
||||
JSD-8146 开源任务材料 |
||||
JSD-8146 开源任务材料\ |
||||
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 |
Binary file not shown.
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<plugin> |
||||
<id>com.fr.plugin.sso.auth</id> |
||||
<name><![CDATA[单点登陆jsd8164]]></name> |
||||
<active>yes</active> |
||||
<version>1.0.8</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2018-07-31</jartime> |
||||
<vendor>fr.open</vendor> |
||||
<description><![CDATA[单点登陆jsd8164]]></description> |
||||
<change-notes><![CDATA[单点登陆jsd8164]]></change-notes> |
||||
<main-package>com.fr.plugin.sso</main-package> |
||||
<prefer-packages> |
||||
<prefer-package>com.fanruan.api</prefer-package> |
||||
</prefer-packages> |
||||
<lifecycle-monitor class="com.fr.plugin.sso.LifeCycleMonitorImpl"/> |
||||
<extra-core> |
||||
<LocaleFinder class="com.fr.plugin.sso.LocaleFinder"/> |
||||
</extra-core> |
||||
<extra-decision> |
||||
<GlobalRequestFilterProvider class="com.fr.plugin.sso.request.TokenLogin"/> |
||||
</extra-decision> |
||||
<function-recorder class="com.fr.plugin.sso.LocaleFinder"/> |
||||
</plugin> |
@ -0,0 +1,34 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: LifeCycleMonitorImpl |
||||
* Author: Louis |
||||
* Date: 2021/3/30 15:10 |
||||
*/ |
||||
package com.fr.plugin.sso; |
||||
|
||||
import com.fr.plugin.context.PluginContext; |
||||
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||
import com.fr.plugin.sso.config.SsoConfig; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <LifeCycleMonitorImpl> |
||||
* |
||||
* @author fr.open |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class LifeCycleMonitorImpl extends AbstractPluginLifecycleMonitor { |
||||
public LifeCycleMonitorImpl() { |
||||
} |
||||
|
||||
@Override |
||||
public void afterRun(PluginContext pluginContext) { |
||||
SsoConfig.getInstance(); |
||||
} |
||||
|
||||
@Override |
||||
public void beforeStop(PluginContext pluginContext) { |
||||
|
||||
} |
||||
} |
@ -0,0 +1,37 @@
|
||||
/* |
||||
* Copyright (C), 2018-2020 |
||||
* Project: starter |
||||
* FileName: LocaleFinder |
||||
* Author: Louis |
||||
* Date: 2020/8/31 22:19 |
||||
*/ |
||||
package com.fr.plugin.sso; |
||||
|
||||
import com.fr.intelli.record.Focus; |
||||
import com.fr.intelli.record.Original; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.stable.fun.impl.AbstractLocaleFinder; |
||||
|
||||
import static com.fr.plugin.sso.config.SsoConfig.PLUGIN_ID; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <LocaleFinder> |
||||
* |
||||
* @author fr.open |
||||
* @since 1.0.0 |
||||
*/ |
||||
@EnableMetrics |
||||
public class LocaleFinder extends AbstractLocaleFinder { |
||||
|
||||
@Override |
||||
@Focus(id = PLUGIN_ID, text = "Plugin-Sso", source = Original.PLUGIN) |
||||
public String find() { |
||||
return "com/fr/plugin/sso/locale/lang"; |
||||
} |
||||
|
||||
@Override |
||||
public int currentAPILevel() { |
||||
return CURRENT_LEVEL; |
||||
} |
||||
} |
@ -0,0 +1,88 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: OneAccessConfig |
||||
* Author: Louis |
||||
* Date: 2021/3/30 9:38 |
||||
*/ |
||||
package com.fr.plugin.sso.config; |
||||
|
||||
import com.fanruan.api.util.StringKit; |
||||
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; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <SsoConfig> |
||||
* |
||||
* @author fr.open |
||||
* @since 1.0.0 |
||||
*/ |
||||
@Visualization(category = "Plugin-Sso_Group") |
||||
public class SsoConfig extends DefaultConfiguration { |
||||
public static final String PLUGIN_ID = "com.fr.plugin.sso.auth"; |
||||
|
||||
private static volatile SsoConfig config = null; |
||||
|
||||
@Focus(id = PLUGIN_ID, text = "Plugin-Sso", source = Original.PLUGIN) |
||||
public static SsoConfig getInstance() { |
||||
if (config == null) { |
||||
config = ConfigContext.getConfigInstance(SsoConfig.class); |
||||
} |
||||
return config; |
||||
} |
||||
|
||||
@Identifier(value = "appId", name = "Plugin-Sso_Config_AppId", description = "Plugin-Sso_Config_AppId_Description", status = Status.SHOW) |
||||
private Conf<String> appId = Holders.simple(StringKit.EMPTY); |
||||
@Identifier(value = "appKey", name = "Plugin-Sso_Config_AppKey", description = "Plugin-Sso_Config_AppKey_Description", status = Status.SHOW) |
||||
private Conf<String> appKey = Holders.simple(StringKit.EMPTY); |
||||
@Identifier(value = "tokenUrl", name = "Plugin-Sso_Config_TokenUrl", description = "Plugin-Sso_Config_TokenUrl_Description", status = Status.SHOW) |
||||
private Conf<String> tokenUrl = Holders.simple(StringKit.EMPTY); |
||||
@Identifier(value = "userInfoUrl", name = "Plugin-Sso_Config_UserInfoUrl", description = "Plugin-Sso_Config_UserInfoUrl_Description", status = Status.SHOW) |
||||
private Conf<String> userInfoUrl = Holders.simple(StringKit.EMPTY); |
||||
// @Identifier(value = "signOutUrl", name = "Plugin-Sso_Config_SignOutUrl", description = "Plugin-Sso_Config_SignOutUrl_Description", status = Status.SHOW)
|
||||
// private Conf<String> signOutUrl = Holders.simple(StringKit.EMPTY);
|
||||
|
||||
public String getAppId() { |
||||
return appId.get(); |
||||
} |
||||
|
||||
public void setAppId(String appId) { |
||||
this.appId.set(appId); |
||||
} |
||||
|
||||
public String getAppKey() { |
||||
return appKey.get(); |
||||
} |
||||
|
||||
public void setAppKey(String appKey) { |
||||
this.appKey.set(appKey); |
||||
} |
||||
|
||||
public String getTokenUrl() { |
||||
return tokenUrl.get(); |
||||
} |
||||
|
||||
public void setTokenUrl(String tokenUrl) { |
||||
this.tokenUrl.set(tokenUrl); |
||||
} |
||||
|
||||
public String getUserInfoUrl() { |
||||
return userInfoUrl.get(); |
||||
} |
||||
|
||||
public void setUserInfoUrl(String userInfoUrl) { |
||||
this.userInfoUrl.set(userInfoUrl); |
||||
} |
||||
|
||||
// public String getSignOutUrl() {
|
||||
// return signOutUrl.get();
|
||||
// }
|
||||
//
|
||||
// public void setSignOutUrl(String signOutUrl) {
|
||||
// this.signOutUrl.set(signOutUrl);
|
||||
// }
|
||||
} |
@ -0,0 +1,216 @@
|
||||
/* |
||||
* Copyright (C), 2018-2021 |
||||
* Project: starter |
||||
* FileName: TokenLogin |
||||
* Author: Louis |
||||
* Date: 2021/3/30 22:09 |
||||
*/ |
||||
package com.fr.plugin.sso.request; |
||||
|
||||
import com.fanruan.api.decision.login.LoginKit; |
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fanruan.api.net.NetworkKit; |
||||
import com.fanruan.api.util.CodeKit; |
||||
import com.fanruan.api.util.StringKit; |
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||
import com.fr.decision.webservice.utils.DecisionServiceConstants; |
||||
import com.fr.decision.webservice.v10.login.LoginService; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.sso.config.SsoConfig; |
||||
import com.fr.plugin.sso.service.SsoService; |
||||
import com.fr.stable.CodeUtils; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.FilterChain; |
||||
import javax.servlet.FilterConfig; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* <Function Description><br> |
||||
* <TokenLogin> |
||||
* |
||||
* @author fr.open |
||||
* @since 1.0.0 |
||||
*/ |
||||
public class TokenLogin extends AbstractGlobalRequestFilterProvider { |
||||
public static final String TPL_PATH = "/com/fr/plugin/sso/web/codePage.html"; |
||||
public static final String REMOTE_DESIGN = "/remote/design"; |
||||
public static final String RESOURCES_PATH = "/resources"; |
||||
public static final String FILE_PATH = "/file"; |
||||
public static final String SYSTEM_INFO = "/system/info"; |
||||
public static final String SYSTEM_HEALTH = "/system/health"; |
||||
public static final String MATERIALS_MIN_JS_MAP = "/materials.min.js.map"; |
||||
public static final String LOGIN_PATH = "/login"; |
||||
public static final String LOGIN_OTHER = "/login/"; |
||||
public static final String LOGOUT_PATH = "/logout"; |
||||
public static final String USER_LANGUAGE = "/v10/user/language"; |
||||
|
||||
public static final String SSO_CALLBACK = "/sso_callback"; |
||||
public static final String CALLBACK = "callback"; |
||||
public static final String SOURCE_URL = "sourceUrl"; |
||||
|
||||
private SsoService ssoService; |
||||
|
||||
/** |
||||
* 过滤器名称 |
||||
* |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public String filterName() { |
||||
return "SsoFilter"; |
||||
} |
||||
|
||||
/** |
||||
* 过滤规则 |
||||
* |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public String[] urlPatterns() { |
||||
return new String[]{"/*"}; |
||||
} |
||||
|
||||
/** |
||||
* 过滤器初始化 |
||||
* |
||||
* @param filterConfig |
||||
*/ |
||||
@Override |
||||
public void init(FilterConfig filterConfig) { |
||||
ssoService = new SsoService(); |
||||
super.init(filterConfig); |
||||
} |
||||
|
||||
/** |
||||
* 过滤器处理 |
||||
* |
||||
* @param request |
||||
* @param response |
||||
* @param filterChain |
||||
*/ |
||||
@Override |
||||
public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) { |
||||
try { |
||||
if (operation(request, response)) { |
||||
filterChain.doFilter(request, response); |
||||
} |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 用户验证登陆操作 |
||||
* |
||||
* @param req |
||||
* @param res |
||||
* @throws Exception |
||||
*/ |
||||
private boolean operation(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||
String pathInfo = (req.getPathInfo() != null) ? req.getPathInfo() : StringKit.EMPTY; |
||||
LogKit.info("sso-TokenLogin-operation-pathInfo:{}", pathInfo); |
||||
if (pathInfo.startsWith(REMOTE_DESIGN) || pathInfo.startsWith(LOGIN_OTHER) |
||||
|| StringKit.equals(LOGIN_PATH, pathInfo) || pathInfo.startsWith(SYSTEM_HEALTH) |
||||
|| pathInfo.startsWith(RESOURCES_PATH) || pathInfo.startsWith(LOGOUT_PATH) |
||||
|| pathInfo.startsWith(SYSTEM_INFO) || pathInfo.startsWith(MATERIALS_MIN_JS_MAP) |
||||
|| pathInfo.startsWith(USER_LANGUAGE) || pathInfo.startsWith(FILE_PATH)) { |
||||
return true; |
||||
} |
||||
// 已登录
|
||||
if (LoginService.getInstance().isLogged(req)) { |
||||
return true; |
||||
} |
||||
String callback = NetworkKit.getHTTPRequestParameter(req, CALLBACK); |
||||
if (StringKit.isBlank(callback)) { |
||||
loginPage(req, res); |
||||
return false; |
||||
} |
||||
if (!pathInfo.startsWith(SSO_CALLBACK)) { |
||||
return true; |
||||
} |
||||
String ip = ssoService.getIpAddr(req); |
||||
JSONObject ssoToken = ssoService.getSsoToken(callback, ip); |
||||
LogKit.error("sso-TokenLogin-operation-ssoToken:{}", ssoToken); |
||||
if (ssoToken == null || !StringKit.equals(ssoToken.getString("Success"), "true")) { |
||||
return true; |
||||
} |
||||
//获取单点登陆用户的相关信息
|
||||
JSONObject ssoUserInfo = ssoService.getSsoUserInfo(ssoToken.getString("Message"), ip); |
||||
if (ssoUserInfo == null || !StringKit.equals(ssoUserInfo.getString("Success"), "true")) { |
||||
return true; |
||||
} |
||||
//往session设置ssoTokenMessage参数值
|
||||
req.getSession().setAttribute("ssoTokenMessage", ssoToken.get("Message").toString()); |
||||
//往session设置ssoUserInfo参数值
|
||||
req.getSession().setAttribute("ssoUserInfo", ssoUserInfo); |
||||
String username = ssoUserInfo.get("AppAccount").toString(); |
||||
if (StringKit.isBlank(username)) { |
||||
return true; |
||||
} |
||||
LogKit.error("sso-TokenLogin-operation-username:{}", username); |
||||
String tokenFR = LoginKit.login(req, res, username); |
||||
req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, tokenFR); |
||||
String sourceUrl = encodeViewlet(NetworkKit.getHTTPRequestParameter(req, SOURCE_URL)); |
||||
LogKit.error("sso-TokenLogin-operation-sourceUrl:{}", sourceUrl); |
||||
res.sendRedirect(sourceUrl); |
||||
return false; |
||||
} |
||||
|
||||
/** |
||||
* 登陆页面 |
||||
* |
||||
* @param req |
||||
* @param res |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
private void loginPage(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||
Map<String, String> parameterMap = new HashMap<>(); |
||||
parameterMap.put("appId", SsoConfig.getInstance().getAppId()); |
||||
parameterMap.put("sourceUrl", CodeKit.encodeURIComponent(getOriginalURL(req))); |
||||
String codePage = TemplateUtils.renderTemplate(TPL_PATH, parameterMap); |
||||
LogKit.info("sso-TokenLogin-loginPage-codePage:{}", codePage); |
||||
WebUtils.printAsString(res, codePage); |
||||
} |
||||
|
||||
/** |
||||
* 得到请求url和参数 |
||||
* |
||||
* @param request |
||||
* @return |
||||
*/ |
||||
private String getOriginalURL(HttpServletRequest request) { |
||||
StringBuffer url = request.getRequestURL(); |
||||
if (StringKit.isNotBlank(request.getQueryString())) { |
||||
url.append("?").append(request.getQueryString()); |
||||
} |
||||
return url.toString(); |
||||
} |
||||
|
||||
/** |
||||
* viewlet中文处理编码 |
||||
* |
||||
* @param url |
||||
* @return |
||||
*/ |
||||
private String encodeViewlet(String url) { |
||||
if (StringKit.isBlank(url)) { |
||||
return url; |
||||
} |
||||
String paramViewlet = StringUtils.EMPTY; |
||||
if (url.contains("viewlet=")) { |
||||
paramViewlet = url.split("viewlet=")[1]; |
||||
paramViewlet = paramViewlet.split("&")[0]; |
||||
} |
||||
if (StringUtils.isNotEmpty(paramViewlet)) { |
||||
url = url.replaceFirst(paramViewlet, CodeUtils.encodeURIComponent(paramViewlet)); |
||||
} |
||||
return url; |
||||
} |
||||
} |
@ -0,0 +1,171 @@
|
||||
package com.fr.plugin.sso.service; |
||||
|
||||
import com.fanruan.api.log.LogKit; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.sso.config.SsoConfig; |
||||
import com.fr.plugin.sso.utils.HttpRequest; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* 单点登录服务类 |
||||
* |
||||
* @author |
||||
*/ |
||||
public class SsoService { |
||||
|
||||
/** |
||||
* 单点登陆系统appid |
||||
**/ |
||||
private String appid; |
||||
/** |
||||
* 单点登陆系统appkey |
||||
**/ |
||||
private String appkey; |
||||
/** |
||||
* 单点登陆系统tokenurl |
||||
**/ |
||||
private String tokenurl; |
||||
/** |
||||
* 单点登陆系统userinfourl |
||||
**/ |
||||
private String userinfourl; |
||||
/** |
||||
* 单点登陆系统signouturl |
||||
**/ |
||||
private String signouturl; |
||||
|
||||
public SsoService() { |
||||
//初始化加载配置文件中的相关信息
|
||||
SsoConfig config = SsoConfig.getInstance(); |
||||
appid = config.getAppId(); |
||||
appkey = config.getAppKey(); |
||||
tokenurl = config.getTokenUrl(); |
||||
userinfourl = config.getUserInfoUrl(); |
||||
// signouturl = config.getSignOutUrl();
|
||||
} |
||||
|
||||
/** |
||||
* 获取单点登陆用户的相关信息 |
||||
* 由于返回SsoUserInfo首字母大写,javabean处理不方便,直接使用map获取。 |
||||
* 其中map中包括的数值有: |
||||
* boolean Success; |
||||
* String Message; |
||||
* String OpenID; |
||||
* String AppAccount; |
||||
* String EmpID; |
||||
* String Job; |
||||
* String Token; |
||||
* String UserName; |
||||
* String DepartmentID; |
||||
* String DepartmentName; |
||||
* String CompanyID; |
||||
* String CompanyName; |
||||
* String Title; |
||||
* String Office; |
||||
* boolean InService; |
||||
* 为支持jdk1.4版本,不使用泛型 |
||||
* |
||||
* @param token 单点登陆系统token |
||||
* @param ip 用户IP |
||||
* @return |
||||
*/ |
||||
public JSONObject getSsoUserInfo(String token, String ip) { |
||||
String urlString = userinfourl + "?token=" + token + "&appid=" + appid |
||||
+ "&appkey=" + appkey + "&ip=" + ip; |
||||
LogKit.error("sso-SsoService-getSsoUserInfo-urlString:{}", urlString); |
||||
try { |
||||
//获取返还信息
|
||||
String json = HttpRequest.sendGet(urlString); |
||||
LogKit.error("sso-SsoService-getSsoUserInfo-json:{}", json); |
||||
// 对返回的JSON进行转换
|
||||
if (json != null && !"".equals(json.trim())) { |
||||
return new JSONObject(json); |
||||
} |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 获取ssoToken ,callback是单点登录系统中返回的参数 |
||||
* 由于返回token首字母大写,使用map获取。map包含的参数有: |
||||
* String Success; |
||||
* String Message; |
||||
* 为支持jdk1.4版本,不使用泛型 |
||||
* |
||||
* @param callback |
||||
* @return |
||||
*/ |
||||
public JSONObject getSsoToken(String callback, String ip) { |
||||
String urlString = tokenurl + "?callback=" + callback + "&appid=" |
||||
+ appid + "&appkey=" + appkey + "&ip=" + ip; |
||||
LogKit.error("sso-SsoService-getSsoToken-urlString:{}", urlString); |
||||
try { |
||||
//获取返还信息
|
||||
String json = HttpRequest.sendGet(urlString); |
||||
LogKit.error("sso-SsoService-getSsoToken-json:{}", json); |
||||
// 对返回的JSON进行转换
|
||||
if (json != null && !"".equals(json.trim())) { |
||||
return new JSONObject(json); |
||||
} |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} // 使用finally块来关闭输出流、输入流
|
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 注销单点登陆 |
||||
* |
||||
* @param token 单点登陆系统token |
||||
* @param ip 用户IP |
||||
* @return |
||||
*/ |
||||
public boolean signOut(String token, String ip) { |
||||
Map userInfo = null; |
||||
boolean returnFlag = false; |
||||
String urlString = signouturl + "?token=" + token + "&appid=" + appid |
||||
+ "&appkey=" + appkey + "&ip=" + ip; |
||||
try { |
||||
//获取返还信息
|
||||
String json = HttpRequest.sendGet(urlString); |
||||
//判断json是否是true
|
||||
if (json != null && "true".equals(json.trim())) { |
||||
returnFlag = Boolean.valueOf(json).booleanValue(); |
||||
} |
||||
} catch (Exception e) { |
||||
LogKit.error(e.getMessage(), e); |
||||
} |
||||
return returnFlag; |
||||
} |
||||
|
||||
/** |
||||
* 获取登录用户的IP地址 |
||||
* |
||||
* @param request |
||||
* @return |
||||
*/ |
||||
public static String getIpAddr(HttpServletRequest request) { |
||||
String ip = request.getHeader("x-forwarded-for"); |
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
ip = request.getHeader("Proxy-Client-IP"); |
||||
} |
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
ip = request.getHeader("WL-Proxy-Client-IP"); |
||||
} |
||||
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { |
||||
ip = request.getRemoteAddr(); |
||||
} |
||||
if (ip.equals("0:0:0:0:0:0:0:1")) { |
||||
ip = "本地"; |
||||
} |
||||
if (ip.split(",").length > 1) { |
||||
ip = ip.split(",")[0]; |
||||
} |
||||
return ip; |
||||
} |
||||
} |
@ -0,0 +1,164 @@
|
||||
package com.fr.plugin.sso.utils; |
||||
|
||||
import java.io.BufferedReader; |
||||
import java.io.IOException; |
||||
import java.io.InputStreamReader; |
||||
import java.io.PrintWriter; |
||||
import java.net.URL; |
||||
import java.net.URLConnection; |
||||
import java.util.HashMap; |
||||
import java.util.Iterator; |
||||
import java.util.Map; |
||||
|
||||
|
||||
/** |
||||
* http请求工具类,为支持jdk1.4,不使用泛型 |
||||
* |
||||
* @author |
||||
*/ |
||||
public class HttpRequest { |
||||
|
||||
/** |
||||
* 向指定 URL 发送POST方法的请求 |
||||
* |
||||
* @param fullurl 完整的URL,可能包括一些参数如 ?a=B&c=D |
||||
* @return 所代表远程资源的响应结果 |
||||
*/ |
||||
public static String sendGet(String fullurl) { |
||||
StringBuffer result = new StringBuffer(); |
||||
BufferedReader in = null; |
||||
try { |
||||
String urlNameString = fullurl; |
||||
URL realUrl = new URL(urlNameString); |
||||
// 打开和URL之间的连接
|
||||
URLConnection connection = realUrl.openConnection(); |
||||
// 设置通用的请求属性
|
||||
//connection.setRequestProperty("accept", "*/*");
|
||||
//connection.setRequestProperty("connection", "Keep-Alive");
|
||||
//connection.setRequestProperty("user-agent",
|
||||
// "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
||||
|
||||
// connection.setRequestProperty("Authorization", "Basic "+base64(user, password));
|
||||
|
||||
// 建立实际的连接
|
||||
connection.connect(); |
||||
// 获取所有响应头字段
|
||||
Map map = connection.getHeaderFields(); |
||||
// 遍历所有的响应头字段
|
||||
//for (String key : map.keySet()) {
|
||||
// System.out.println(key + "--->" + map.get(key));
|
||||
//}
|
||||
// 定义 BufferedReader输入流来读取URL的响应
|
||||
|
||||
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); |
||||
String line; |
||||
while ((line = in.readLine()) != null) { |
||||
result.append(line); |
||||
} |
||||
} catch (Exception e) { |
||||
System.err.println("发送GET请求出现异常!" + e); |
||||
e.printStackTrace(); |
||||
} |
||||
// 使用finally块来关闭输入流
|
||||
finally { |
||||
try { |
||||
if (in != null) { |
||||
in.close(); |
||||
} |
||||
} catch (Exception e2) { |
||||
e2.printStackTrace(); |
||||
} |
||||
} |
||||
return result.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 向指定 URL 发送POST方法的请求 |
||||
* |
||||
* @param url 发送请求的 URL |
||||
* @param params 请求参数 |
||||
* @return 所代表远程资源的响应结果 |
||||
*/ |
||||
public static String sendPost(String url, HashMap params) { |
||||
PrintWriter out = null; |
||||
BufferedReader in = null; |
||||
StringBuffer result = new StringBuffer(); |
||||
|
||||
try { |
||||
URL realUrl = new URL(url); |
||||
// 打开和URL之间的连接
|
||||
URLConnection connection = realUrl.openConnection(); |
||||
// 设置通用的请求属性
|
||||
// connection.setRequestProperty("accept", "*/*");
|
||||
// connection.setRequestProperty("connection", "Keep-Alive");
|
||||
// connection.setRequestProperty("user-agent",
|
||||
// "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
||||
|
||||
// connection.setRequestProperty("Authorization", "Basic "+base64(user, password));
|
||||
connection.setRequestProperty("Accept-Charset", "utf-8"); |
||||
connection.setRequestProperty("contentType", "utf-8"); |
||||
|
||||
// 发送POST请求必须设置如下两行
|
||||
connection.setDoOutput(true); |
||||
connection.setDoInput(true); |
||||
// 获取URLConnection对象对应的输出流
|
||||
|
||||
out = new PrintWriter(connection.getOutputStream()); |
||||
// 发送请求参数
|
||||
StringBuffer param = new StringBuffer(); |
||||
for (Iterator iterator = params.keySet().iterator(); iterator.hasNext(); ) { |
||||
String key = (String) iterator.next(); |
||||
|
||||
Object obj = params.get(key); |
||||
|
||||
if (obj == null) continue; |
||||
|
||||
if (obj.getClass().isArray()) { |
||||
//数组的处理方式
|
||||
Object[] objs = (Object[]) obj; |
||||
|
||||
for (int i = 0; i < objs.length; i++) { |
||||
param.append(key).append("=").append(objs[i]); |
||||
|
||||
param.append("&"); |
||||
} |
||||
} else { |
||||
param.append(key).append("=").append(obj); |
||||
param.append("&"); |
||||
} |
||||
|
||||
} |
||||
out.print(param.toString()); |
||||
// flush输出流的缓冲
|
||||
out.flush(); |
||||
// 定义BufferedReader输入流来读取URL的响应
|
||||
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); |
||||
|
||||
String line; |
||||
while ((line = in.readLine()) != null) { |
||||
//result += line;
|
||||
result.append(line); |
||||
} |
||||
} catch (Exception e) { |
||||
System.err.println("发送 POST 请求出现异常!" + e); |
||||
e.printStackTrace(); |
||||
|
||||
return "{\"success\": false, \"message\": \"" + e.getMessage() + "\" }"; |
||||
} |
||||
// 使用finally块来关闭输出流、输入流
|
||||
finally { |
||||
try { |
||||
if (out != null) { |
||||
out.close(); |
||||
} |
||||
if (in != null) { |
||||
in.close(); |
||||
} |
||||
} catch (IOException ex) { |
||||
ex.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
return result.toString(); |
||||
} |
||||
} |
@ -0,0 +1,12 @@
|
||||
Plugin-Sso=Sso Plugin |
||||
Plugin-Sso_Group=Sso Plugin |
||||
Plugin-Sso_Config_AppId=AppId |
||||
Plugin-Sso_Config_AppId_Description=AppId |
||||
Plugin-Sso_Config_AppKey=AppKey |
||||
Plugin-Sso_Config_AppKey_Description=AppKey |
||||
Plugin-Sso_Config_TokenUrl=TokenUrl |
||||
Plugin-Sso_Config_TokenUrl_Description=TokenUrl |
||||
Plugin-Sso_Config_UserInfoUrl=UserInfoUrl |
||||
Plugin-Sso_Config_UserInfoUrl_Description=UserInfoUrl |
||||
Plugin-Sso_Config_SignOutUrl=SignOutUrl |
||||
Plugin-Sso_Config_SignOutUrl_Description=SignOutUrl |
@ -0,0 +1,12 @@
|
||||
Plugin-Sso=\u5355\u70B9\u767B\u9646\u63D2\u4EF6 |
||||
Plugin-Sso_Group=\u5355\u70B9\u767B\u9646\u63D2\u4EF6 |
||||
Plugin-Sso_Config_AppId=\u5E06\u8F6F\u7CFB\u7EDF\u4EE3\u7801APPID |
||||
Plugin-Sso_Config_AppId_Description=\u5E06\u8F6F\u7CFB\u7EDF\u4EE3\u7801APPID |
||||
Plugin-Sso_Config_AppKey=\u5E06\u8F6F\u7CFB\u7EDFAPPKEY |
||||
Plugin-Sso_Config_AppKey_Description=\u5E06\u8F6F\u7CFB\u7EDFAPPKEY |
||||
Plugin-Sso_Config_TokenUrl=Token\u63A5\u53E3\u5730\u5740 |
||||
Plugin-Sso_Config_TokenUrl_Description=Token\u63A5\u53E3\u5730\u5740 |
||||
Plugin-Sso_Config_UserInfoUrl=UserInfo\u63A5\u53E3\u5730\u5740 |
||||
Plugin-Sso_Config_UserInfoUrl_Description=UserInfo\u63A5\u53E3\u5730\u5740 |
||||
Plugin-Sso_Config_SignOutUrl=\u767B\u51FA\u5730\u5740 |
||||
Plugin-Sso_Config_SignOutUrl_Description=\u767B\u51FA\u5730\u5740 |
@ -0,0 +1,23 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="zh"> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
||||
<title>登陆中</title> |
||||
<script src="http://wfserver.gree.com/sso/Scripts/jquery-1.6.4.min.js"></script> |
||||
<script src="http://wfserver.gree.com/sso/Scripts/greesso2.js"></script> |
||||
<link href="http://wfserver.gree.com/sso/Content/greesso.css" rel="stylesheet"/> |
||||
<script type="text/javascript"> |
||||
$(document).ready(function () { |
||||
setTimeout(function () { |
||||
$("#message").html('<span style="color:red;">单点登陆超时,请刷新重试。<span/>') |
||||
}, 2000) |
||||
}); |
||||
</script> |
||||
</head> |
||||
<body> |
||||
<span id="message">登陆</span> |
||||
<span id="ssoLogin" appid="${appId}" sourceUrl="${sourceUrl}" autoOpenLoginForm="true"></span> |
||||
</body> |
||||
</html> |
Loading…
Reference in new issue