轉發(fā)請注明出處
sso的一種常用做法是,設置一個頂層一級域名(比如:.baidu.com), 這樣其他二級域名,如wenku.baidu.com, pan.baidu.com就能在當前域名的服務節(jié)點獲取其他二級域名設置的cookie, 進而實現(xiàn)sso單點登錄功能
以下是詳細步驟
- 通過域名獲取一級domain LoginController.java
//成員變量
private String reg = "(\\w*\\.?){1,2}\\.(com.cn|net.cn|gov.cn|org\\.nz|org.cn|com|net|org|gov|cc|biz|info|cn|co)$";
private Pattern pattern = Pattern.compile(reg);
/**
* 獲取當前請求網(wǎng)站的一級域名
* @param fullDomain 如:pan.baidu.com
* @return 返回cookie需要的一級domain 如:.baidu.com
*/
private String getDynamicCookieDomain(String fullDomain) {
if(StringUtils.isEmpty(fullDomain)) {
return Strings.EMPTY;
}
Matcher matcher = pattern.matcher(fullDomain);
final List<String> domain = new ArrayList<>();
if(matcher.find()) {
IntStream.rangeClosed(1, matcher.groupCount()).forEach(i ->
domain.add("." + matcher.group(i))
);
}
return String.join("", domain);
}
- 增加設置cookie的方法 LoginController.java
/**
* 登錄時設置sso的cookie
* @param request
* @param response
* @param token
* @param maxAge 單位:秒
*/
private void setCookies(HttpServletRequest request, HttpServletResponse response, String token, Long maxAge) {
String cookieFormat = "token=%s; Path=/;Domain=%s;Max-Age=%s;";
String cookieValue = String.format(cookieFormat, token, getDynamicCookieDomain(request.getHeader("x-forwarded-host")), maxAge);
log.info("set cookie value: {}", cookieValue);
response.setHeader("Set-Cookie", cookieValue);
}
- 登錄成功后調(diào)用setCookies方法在響應中輸出cookie LoginController.java
@Value("${sso.cookie.maxAge}")
private Long cookieMaxAge;
/**
* 登錄
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping(value="/login")
public @ResponseBody ResultEntity<Object> login(HttpServletRequest request, HttpServletResponse response, LoginVo loginVo, String deviceId) throws Exception {
ResultEntity<Object> result = new ResultEntity<Object>();
//...省略業(yè)務代碼
JSONObject jsonObject = ResultEntityHelper.getData(resultEntity, JSONObject.class);
String token = jsonObject.getString("token");
Map<String,Object> data = new HashMap<>();
data.put("userKey", token);
setCookies(request, response, token, cookieMaxAge);
return result.data(data);
}
- 退出時設置cookie過期 LoginController.java
/**
* 退出
* @param request
* @param response
* @return
*/
@RequestMapping(value="/signOut")
public @ResponseBody ResultEntity<Object> signOut(HttpServletRequest request, HttpServletResponse response) throws Exception {
//創(chuàng)建返回結果
ResultEntity<Object> result = new ResultEntity<Object>();
//... 省略退出邏輯
setCookies(request, response, LoginInfoHolder.token(), 0L);
return result;
}
-附加:相關參數(shù)在yml中配置 application.yml 及cookie在瀏覽器的呈現(xiàn)
#配置sso的cookie過期時間,單位:秒
sso:
cookie:
maxAge: 3600
百度cookie截圖.png
聯(lián)系作者:do_believe@163.com