頁面嵌入iframe Cookie丟失問題解決
遇到的問題
自身頁面以iframe的形式嵌入三方頁面中,雙方域名不一致導致自身頁面的cookie被某些瀏覽器攔截無法正常被保存到客戶端文章來源地址http://www.zghlxwxcb.cn/news/detail-801487.html
解決方案
- 后端將cookie以鏈接參數(shù)的形式帶給前端
- 前端在請求接口的時候?qū)ookie放在請求頭(這里無法直接在請求頭放置Cookie參數(shù),需要使用一個新的參數(shù)來放置Cookie)
- 后端使用攔截器獲獲取請求頭中Cookie副本解析后重新放置到Cookie中
后端部分實現(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]);
}
后端攔截器設置設置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);
//如果校驗通過
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請求頭,直接跳過
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;
}
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-801487.html
到了這里,關于頁面嵌入iframe Cookie丟失問題解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!