WKWebView请求添加Cookie

WKWebView请求添加Cookie,第1张

WKWebView 发送请求时不会把 HTTPCookieStorage 中的cookie写入请求中需要手动添加。

iOS11之前实现思路是在原有的URLRequest中注入cookie再load,这种做法只能在webView第一次请求的时候会生效,后续未跨域请求带上cookie需要在 WKWebViewConfiguration 中添加 WKUserScript .

iOS11后通过 WKWebsiteDataStore 管理

通过上述方案修改后的cookie,服务器无法再往请求中添加cookie,所以服务器返回的cookie需要本地记录,后续请求再继续添加.

实现 WKNavigationDelegate

在App中嵌入网页,使用Nativie方式登录,然后将cookie保存到WebView中,实现免登录功能。同步Cookie到WebView的方法可以参考下面的代码:/*** Sync Cookie*/private void syncCookie(Context context, String url){try{Log.d("Nat: webView.syncCookie.url", url) CookieSyncManager.createInstance(context)CookieManager cookieManager = CookieManager.getInstance()cookieManager.setAcceptCookie(true)cookieManager.removeSessionCookie()// 移除cookieManager.removeAllCookie()String oldCookie = cookieManager.getCookie(url)if(oldCookie != null){Log.d("Nat: webView.syncCookieOutter.oldCookie", oldCookie)} StringBuilder sbCookie = new StringBuilder()sbCookie.append(String.format("JSESSIONID=%s","INPUT YOUR JSESSIONID STRING"))sbCookie.append(String.format("domain=%s", "INPUT YOUR DOMAIN STRING"))sbCookie.append(String.format("path=%s","INPUT YOUR PATH STRING"))String cookieValue = sbCookie.toString()cookieManager.setCookie(url, cookieValue)CookieSyncManager.getInstance().sync() String newCookie = cookieManager.getCookie(url)if(newCookie != null){Log.d("Nat: webView.syncCookie.newCookie", newCookie)}}catch(Exception e){Log.e("Nat: webView.syncCookie failed", e.toString())}}使用上面的方法可以将Cookie同步到WebView中,这样浏览网页时即可实现免登录。但是在实际使用过程中会出现Cookie并未保存成功,每次都会跳转到登录页面应为初始化WebView时漏掉了重要的东西。可以参考下面代码设置WebView。/*** init WebView Settings* */private void initWebViewSettings(){//myWebView.getSettings().setSupportZoom(true)//myWebView.getSettings().setBuiltInZoomControls(true)//myWebView.getSettings().setDefaultFontSize(12)//myWebView.getSettings().setLoadWithOverviewMode(true)// 设置可以访问文件myWebView.getSettings().setAllowFileAccess(true)//如果访问的页面中有Javascript,则webview必须设置支持JavascriptmyWebView.getSettings().setJavaScriptEnabled(true)myWebView.getSettings().setUserAgentString(MyApplication.getUserAgent())myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE)myWebView.getSettings().setAllowFileAccess(true)myWebView.getSettings().setAppCacheEnabled(true)myWebView.getSettings().setDomStorageEnabled(true)myWebView.getSettings().setDatabaseEnabled(true)}完成以上两步 *** 作,再次运行程序,就会发现,打开网页后不会再跳转到登录页面了。

ios 中有的请求需要带cookie,  验证登陆等. 

 ios默认是会把url 的cookie保存到本地, 但不是实时保存的, 会有延迟, 一般理解为在系统空闲时去保存 .  所以为了实时给url添加cookie, 我们最好将请求url 后获取到的cookie 保存到本地, 用NSUserDefault即可

在设置Cookie之前,先让我们了解一下通用Cookie格式,多个Cookie的格式通常为:cookie1=value1cookie2=value2cookie3=value3

这里特别要注意,多个cookie之间用分号+空格分隔开,不是&也不是单纯的空格。我所了解到的iOS设置Cookie的方法有两种,分别如下。

方法一:

方法二:

注意: 一定要把cookie设置到request.allHTTPHeaderFields中才会生效.

网上好多的demo都是这样设置cookie的 ---   [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]        亲测不能用

update  于当天下午

现在是这样, 要在每一次请求的时候都要带cookie, 如果要按上面那种写法之有在第一次请求的时候带cookie, 其他请求都带不上了,  

解决方法 :


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11678401.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存