頁(yè)面嵌入iframe Cookie丟失問題以及解決過程
頁(yè)面嵌入iframe Cookie丟失問題
遇到的問題
自身頁(yè)面以iframe的形式嵌入三方頁(yè)面中,雙方域名不一致導(dǎo)致自身頁(yè)面的cookie被某些瀏覽器攔截?zé)o法正常被保存到客戶端
解決方案
- 后端將cookie以鏈接參數(shù)的形式帶給前端
- 前端在請(qǐng)求接口的時(shí)候?qū)ookie放在請(qǐng)求頭(這里無法直接在請(qǐng)求頭放置Cookie參數(shù),需要使用一個(gè)新的參數(shù)來放置Cookie)
- 后端使用攔截器獲獲取請(qǐng)求頭中Cookie副本解析后重新放置到Cookie中
后端部分實(shí)現(xiàn)示例代碼
解析獲取Response中的Cookie
// 從Response Header 中的 Set-Cookie解析
for (String cookie : response.getHeaders("Set-Cookie")) {
cookie = cookie.split(";")[0];
String[] split = cookie.split("=", 2);
cookieMap.put(split[0], split[1]);
}
后端攔截器設(shè)置設(shè)置Coookie
@Component
@Order(1)
public class HeaderCookieFilter implements Filter {
private static final Logger log = LoggerFactory.getLogger(HeaderCookieFilter.class);
private final String HEADER_COOKIE_KEY = "identityKey";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequestWrapper customRequest = (HttpServletRequestWrapper)request;
JSONObject cookieInfo = check(request);
//如果校驗(yàn)通過
if(cookieInfo!=null) {
Cookie[] cookies = new Cookie[cookieInfo.size()];
// 修改cookie
Iterator<String> iterator = cookieInfo.keySet().iterator();
for (int i = 0; i < cookieInfo.keySet().size(); i++) {
String key = iterator.next();
String value = cookieInfo.getString(key);
Cookie cookie = new Cookie(key, value);
cookies[i] = cookie;
}
request = new CustomRequest(customRequest, cookies);
}
}catch (Exception e){
log.error("header transfor cookie error",e);
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
private JSONObject check(ServletRequest request) throws UnsupportedEncodingException {
HttpServletRequestWrapper customRequest = (HttpServletRequestWrapper)request;
// 不存在identityKey請(qǐng)求頭,直接跳過
String allCookieStrEncode = customRequest.getHeader(HEADER_COOKIE_KEY);
boolean hasHeaderCookie = StringUtils.isNotEmpty(allCookieStrEncode);
if(!hasHeaderCookie){
return null;
}
String cookieStr = URLDecoder.decode(allCookieStrEncode, CharEncoding.UTF_8);
JSONObject cookieInfo = JSON.parseObject(cookieStr);
return cookieInfo;
}
class CustomRequest extends HttpServletRequestWrapper {
Cookie[] cookies;
public CustomRequest(HttpServletRequest request, Cookie[] cookies) {
super(request);
this.cookies = cookies;
}
@Override
public Cookie[] getCookies(){
return cookies;
}
}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決static類使用@Value獲取yml文件獲取不到的問題
在靜態(tài)類中直接使用@Value注解無法獲取yml文件中的配置,解決方案是在工具類Utils中創(chuàng)建靜態(tài)的setter方法,并從外部類ServiceClass中調(diào)用這個(gè)方法來設(shè)置值,這種方法通過外部調(diào)用來間接設(shè)置靜態(tài)變量的值,從而成功讀取yml配置2024-09-09
mybatis不加@Parm注解報(bào)錯(cuò)的解決方案
這篇文章主要介紹了mybatis不加@Parm注解報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
Java實(shí)現(xiàn)班級(jí)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)班級(jí)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Spring Cloud實(shí)現(xiàn)提供API給客戶端的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring Cloud實(shí)現(xiàn)提供API給客戶端的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
從原理到實(shí)戰(zhàn)深入理解Java 斷言assert
本文深入解析Java斷言機(jī)制,涵蓋語(yǔ)法、工作原理、啟用方式及與異常的區(qū)別,推薦用于開發(fā)階段的條件檢查與狀態(tài)驗(yàn)證,并強(qiáng)調(diào)生產(chǎn)環(huán)境應(yīng)使用參數(shù)驗(yàn)證工具類替代,附常見問題解答及實(shí)踐案例,感興趣的朋友一起看看吧2025-06-06
SpringBoot整合Spring?Data?JPA的詳細(xì)方法
JPA全稱為Java Persistence API(Java持久層API),是一個(gè)基于ORM的標(biāo)準(zhǔn)規(guī)范,在這個(gè)規(guī)范中,JPA只定義標(biāo)準(zhǔn)規(guī)則,不提供實(shí)現(xiàn),本文重點(diǎn)給大家介紹SpringBoot整合Spring?Data?JPA的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-02-02
JAVA JNI函數(shù)的注冊(cè)過程詳細(xì)介紹
這篇文章主要介紹了JAVA JNI函數(shù)的注冊(cè)過程詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-11-11

