页面嵌入iframe cookie丢失问题
遇到的问题
自身页面以iframe的形式嵌入三方页面中,双方域名不一致导致自身页面的cookie被某些浏览器拦截无法正常被保存到客户端
解决方案
- 后端将cookie以链接参数的形式带给前端
- 前端在请求接口的时候将cookie放在请求头(这里无法直接在请求头放置cookie参数,需要使用一个新的参数来放置cookie)
- 后端使用拦截器获获取请求头中cookie副本解析后重新放置到cookie中
后端部分实现示例代码
解析获取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;
}
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论