问题表现
使用Element-admin架构搭建Vue前端项目,在与CefSharp搭配时,出现无法使用cookie的问题。
- 无法将token存入cookie
- cookie无法被读取
如下图,Cookies下显示file://。
正常的Cookies显示,Cookies显示为http://域名,如下图:
解决问题
经过确认,已肯定:
- 以Url加载的服务方式的前端可以通过C#动态添加或删除Cookie。
- 以本地化方式加载的前端无法通过C#动态添加或删除Cookie。
如果你是Url加载服务方式的前端,如下解决
//初始化浏览器对象
string webUrl = "http://127.0.0.1:8080";
chromeBrowser = new ChromiumWebBrowser(webUrl);
chromeBrowser.Dock = System.Windows.Forms.DockStyle.Fill;
this.Controls.Add(chromeBrowser);//加入cookie
CefSharp.Cookie cookie = new CefSharp.Cookie();
cookie.Name = "cookie_name";
cookie.Value = "cookie_value";
cookie.Domain = "";//为空表示使用域名
cookie.Path = "";//为空表示使用/
cookie.Expires = DateTime.Now.AddDays(1);ICookieManager cookieManager = Cef.GetGlobalCookieManager();
//IP或域名必须与实际前端服务保持一致
cookieManager.SetCookie(webUrl, cookie);
如果你是本地化方式加载的前端,如下解决
创建一个Cookie类:
public class CookieUtil{public static CookieUtil Instance = new CookieUtil();private Dictionary<string, string> dicCookie = new Dictionary<string, string>();public string GetCookie(string name){if (dicCookie.ContainsKey(name)){return dicCookie[name];}else{return "";}}public void AddCookie(string name,string value){if (dicCookie.ContainsKey(name)){dicCookie[name]=value;}else{dicCookie.Add(name,value);}}public void RemoveCookie(string name){dicCookie.Remove(name);}public void ClearAll(){dicCookie = new Dictionary<string, string>();}}
创建AppService类:
public class AppService{public string login(string username, string password){string tokenValue = "admin-token";return JsonUtil.Instance.Success(new { token = tokenValue });}public string getCookie(string name){return CookieUtil.Instance.GetCookie(name);}public void setCookie(string name, string value){CookieUtil.Instance.AddCookie(name, value);}public void removeCookie(string name, string value){CookieUtil.Instance.AddCookie(name, value);}public void clearAll(){CookieUtil.Instance.ClearAll();}}
初始化浏览器类:
//初始化浏览器对象
string webUrl = "http://127.0.0.1:8080";
chromeBrowser = new ChromiumWebBrowser(webUrl);
chromeBrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
chromeBrowser.Dock = System.Windows.Forms.DockStyle.Fill;
//声明使用C#端服务对象
chromeBrowser.JavascriptObjectRepository.Register("cefAppService", new AppService(), isAsync: false, options: BindingOptions.DefaultBinder);
this.Controls.Add(chromeBrowser);