当前位置: 代码网 > it编程>编程语言>Java > 页面嵌入iframe Cookie丢失问题以及解决过程

页面嵌入iframe Cookie丢失问题以及解决过程

2026年02月07日 Java 我要评论
页面嵌入iframe cookie丢失问题遇到的问题自身页面以iframe的形式嵌入三方页面中,双方域名不一致导致自身页面的cookie被某些浏览器拦截无法正常被保存到客户端解决方案后端将cookie

页面嵌入iframe cookie丢失问题

遇到的问题

自身页面以iframe的形式嵌入三方页面中,双方域名不一致导致自身页面的cookie被某些浏览器拦截无法正常被保存到客户端

解决方案

  1. 后端将cookie以链接参数的形式带给前端
  2. 前端在请求接口的时候将cookie放在请求头(这里无法直接在请求头放置cookie参数,需要使用一个新的参数来放置cookie)
  3. 后端使用拦截器获获取请求头中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;
        }
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com