Cookie处理

在设置Cookie的时分,我们常常做的是在央求的央求头里添加 Cookie,可是这仅仅把Cookie发送给了服务端,我们本地并没有保存 CookieCookie 毕竟要写到WebView的一个Cookie文件目录里面,后续WebView里面自己的建议的央求或许跳转才华在google空间建议央求的时分在对应浏览器前史记录设置的域名下面取到Cookie传出去。长沙师范学院

Webview 加载 H5 页面,实际上是把页面相关的.html、js、css文件下载到本地,然后再加载,这时页面去获取 Cookie 的时分,是去本地Wgoogle服务结构ebView长沙市天气Cookie文件目录里查找,浏览器的前史记录在哪假设没有设置的话java环境变量配置必定就找不到了。所以在设置Cookihttp 404e的时分,服务端和客户端都要设置。

一、服务端 Cookie 设置

在运用UIWebView的时分,我们是经过 NSHTTPCookieStorage来办理 Cookie 的,下面我们给devqiaoyu.tech这个域名添加一个名为userCookie

var props = Dictionary<HTTPCookiePropertyKey, Any>()
props[HTTPCookiePropertyKey.name] = "user"
props[HTTPCookiePropertyKey.value] = "浏览器的前史adm浏览器的前史in"
props长沙市天气[HTTPCookiePropertyKey.path] = "/"
props[HTTPCookieProjavaeepertyKey.domain] = "devqiaoyu.tech"
props[HTTPCookiePropertyKey.versi浏览器前史记录删了怎样找回on] = "0"
props[HTTPCookiePropertyKey.originURL] = "devqiaoyu.tech"
if let cookie = HTTPCookie(properties: props) {
HTTPCookieStorage.shargoogle翻译ed.setCookie(cookie)java言语
}

WKWebView Cookie问题在于WKWebView建议的央求不会主动带上存储于NSHTTPCookieStorage容器中的Cookie

解决方法也很简单,就是在WKWebView建议央求之前,先从NSHTTPCookieStorage读取Cookie,然后手动浏览器UR浏览器LRequest超神兽宠店的央求头里添加一下Cookie

func getCookie() -> String {
var cookieString = ""
if let cookies = HTgoogleTPCookieStorage.shared.cookies {
for cookie in cookies {
if cookie.domain == cookieDomaihttp协议n {
let str = "(cookie.name)=(cookie.value)"
cohttpwatchokieString.append("(str);")
}
}
return cookiejava模拟器String
}
var reque浏览器拜访过于频频不能用st = URLRequ浏览器est(url: URL(string: "https://devqiaoyu.com"))
rhttp 404equest.addValue(getCookie(), forHTTPHeaderFieldjava模拟器: "Cookie")

当服务器java基础知识点页面产生google空间重定向的时分,此刻第一次在RequestHeader中写入的Cookie会丢掉,还需要对重定向的央求从头做添加Cookie的处理。具体方法请往下看~

二、客户端 Cookie 设置

上面这么写完了,当页面加载的时分,后端无论是啥言语,http协议都能从央求头里看到Cookie了,可是后端烘托回来页面后,在客户端的WebjavascriptV浏览器的前史记录在哪iew里运行的时分,JS 在实行的时分调用 document.cookie API 是读取不到Cookjavaeeie的,所以还得针对客户端Cookie进行处理。

var cookieString = "浏览器的浏览前史怎样删除"
if let cookies = HTTPCookieStorage.shared.cookies {
for cookie in cookies {浏览器
if cookie.domain == "devqiaoyu.tech" {
let str = "(cookie.name)=(cookie.value)"google服务结构
cookieString.append("document.coogoogle服务结构kie='(str);path=/;domain=devqiaoyu.tech';")
}
}
}
let cookieS浏览器前史记录删了怎样找回cript = WKUserScrgoogle地球ipt(source: cookieString, inj长沙师范学院ectionTime: .atDojava面试题cumentStart, forMainFrameOnly: false)
let userConthttp://192.168.1.1登录entController = WKUserConte超崇高骑士ntController(java环境变量配置)
userContentController.addUserScript(cookieScript)
let webViewConfig = WKWebViewConfiguration()
webViewConfig.userContentController = userContentController仓鼠养殖八大忌讳
lhttp协议et webV = WKWebView(frame: CGRect.zeJavar浏览器下载o, cojava怎样读nfiguration: webViewConfig)

**客户端CookieGoogle入实际上就是创立一个 J超神兽宠店S 脚本,让WebView去实行,推荐在.atDocumentStart这个机会进行预置静态 JS 的注入。**这样WebView在加载后端回来的静态页面的时分,就能够拿到保存着客户端的Cookie了。

留心:document.coogoogle谷歌查找主页kie() 无法跨域设置 Cookie,比如你浏览器拜访过于频频不能用第一次加载的央求时 www.baidu.com ,在重定向的时分跳转到了 www.google.com ,那么第二个央求就可能因为没有携带 Cookie而无法仓鼠养殖八大忌讳拜访。当然啦,解决方法还是有的,请往下看~

URL阻遏

WKWebView中,每google服务结构一次页面跳转之前,都会调用下面的回调函数:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: W长沙师范学院KNavigationAction, decisionHajava工作培训班ndler: @escaping (WKNgoogleavigationActionPolicy) -> Void)

Web 页面重定向问题

重定向问题有两种:

  • 服务器页面重定向,需要对新建议的央求从头种Cookie
  • 本地页面重定向,只需浏览器拜访过于频频不能用客户端设置了Cookie,那么就不需要处理了

所以假设是服务http://www.baidu.com器页面重定向,那么判断此刻Request是否有你要的Cookie没有就Cancel掉,修正R浏览器怎样打开网站equest 从头主浏览器拜访过于频频不能用张。

func webView(_ webView: WKWebView, degoogle翻译cidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
{
var shouldCancelLoadURL = false
if let cookie = navigationAc长生十万年tion.reque浏览器的前史st.value(forHTTPHeaderField: "Cookie") {
if cookie.contains("user") {
shouldCancelLoadURL = falshttp 404e
} else {
var request = URLRequest(url: URL(string: (navigationAction.request.url?.absojava基础知识点luteString)!)!)
request.addValue(getCookie(), forHTTPHeaderField: "Cookie")httpwatch
webView.load(regoogle地球quest)
shouldCancelLoadURL = trgoogleue
}
} else {
var request = URLRjava工作培训班equest(url: URL(string: (navigationAction.request.url?.absoluteStrjava环境变量配置ing)!)!)
request.addValue(getCookie(), forHTTPHeaderField: "Cookie")
webView.load(request)
shouldCancelLoadURL = true
}
if shouldCHTTPancelLoadURL {
decisionHandler(WKNavigatiJavaonActionP浏览器的前史记录在哪olicy.cancel)
} else {
decisionHagoogleplay安卓版下载ndler(WKNavigationActionPolicy.allow)
}
}

跨域问题

针对跨域的问题,解决方法和上面的方法相似,仅仅是判断条件不同。

func webView(_ webVijavaeeew: WKgoogle浏览器WebView, decidePolicyFor navigatiogoogle地球nAction: WKNavigationAction, decisionHandler: @escaping (WKNavigagoogleplay安卓版下载tionActionPolicy) -> Void)
{
var shouldCancelLoadURL = false
if let url = navigationAction.request.url?.absoluteString {
if url.contains("devqiaoyu.tech") { // 本来的域浏览器怎么查看前史浏览记录名
shouldCancelLoadURL = false
} else {
// 从头建议央求,种Cookie
shouldCancelLoadURL = true
}
} else {
// 从头建议央求,种Cookie
shouldCancelLoadURL = true
}
if sho超崇高骑士uldCancelLoadURL {
decisionHandler(WKNgoogle空间avigationActionPolicy.cancel)
} else {
decisionHandler(WKNavigationActionPolicy.allow)
}
}

假跳转的央求阻遏

一种 JS 调用 Native 的通讯计划,具体介绍能够看从零收拾一个hybrid结构(一)– 从挑选JS通讯计划初步。下面内容是从该文章内摘录的。

何谓 假跳转的央求阻遏 就是由网页宣告一条新的跳转央求,跳转的目的地是google地球一个不合法的压根就不存在的地址,比如

//常规的Http地址
https:/http代理/wenku.baidu.com/xxxx?xx=xx
//假的央求通讯地址
wakaka://wahahal长生十万年alala/action?param=paramobj

看我下面写的那条假跳浏览器的前史记录在哪转地址,这么一条什么都不是的扯淡地址,直接放到浏览器里,直接扔到WebView里,必定是妥妥的什陈思思么都打不开的,而假设在经过我们改造过的Hybrid WebView里,进行阻遏不进行跳转

url 地址分为这么几个部分

  • 协议:也就是 http/https/file 等,上面用了 wakaka
  • 域名:java怎样读上面的google浏览器 wenku.baijava编译器du.comwahahalalala
  • 途径:上面的 xxxx?action?
  • 参数:上面的 xx=xxparam=paramobj

假设我们构建一条假url

  • 用协议与域名作为通讯辨认
  • 用途径作为指令辨认
  • 用参数作为数据传递

客户端会无差别Java阻遏悉数央求,真正的 url 地址应该照旧放过,只有协议域名匹配的 url 地址才应该被客户端阻遏,阻遏下来的 url 不会导致 WebViewjava怎样读 持续跳转差错地址,因而无感知,相反阻遏下来的 url 我们能够读取其间途径作为指令,读取其间参数作为数据,然后依据约好调用对应的 Native 原生代码

以上其实是google地球一种 协议约好 只需 JS 侧按着这个约好协google谷歌查找主页议生成假 url,Native 按着约好协议阻遏/读取假 url,整个流程就能跑通。

User-Agent设置

全局设置

就是App内悉数Web央求的Usehttp://www.baidu.comr-Agent悉数被修正。浏览器前史上的痕迹在哪里

// UIWebView
lehttp协议t webView = UIWebView(frame: CGRect.zero)
let userAgent = wejava模拟器bVhttp 302iew.stringByEvaluatingJavaScript(from: "navigator.userAgent")
if let崇圣寺三塔 agent = userAgent {
let user = "@(agent);extra_user_agent"
legoogle空间t dict = ["UserAgent":user]
UserDefa仓鼠养殖八大忌讳ults.standard.register(defaults: dict)
}
// WKWehttp://192.168.1.1登录bView
let webV =https和http的区别 WKWebView(frame: CGRecthttp 404.zero)
wGoogleebV.eval浏览器拜访过于频频不能用uateJavaScript("navigator.userAgent") { (result, err浏览器前史记录设置or) in
if let oldAgent = result as? Stjava言语ring {
let user = "@(oldAgent);extra_user_agent"
let dict = ["UserAgenGooglet":user]
UserDefaults.standard陈思思.register(de浏览器的前史faults: dict)
}
}

单个WebView设置

iOS9WKWebViewgoogleplay安卓版下载应了Google一个十分快捷的特色去更改Usjava工作培训班er-Agent,就是customUser浏览器的前史Agent特色。这样运用起来不只便当,也不会全局更改User-Agent,惋惜的是iOS9才有,假设适配iOS8,还是要运用上面的办httpclient法。

let webView = U长沙师范学院IWebView(frame: CGhttp://www.baidu.comRect.zero)
let userAgent = webView.stringByEvaluatingJavaScript(from: "navigator.userAgent")
i浏览器拜访过于频频不能用f let agent = userAgent {
let user = "@(ag浏览器怎么查看前史浏览记录ent)HTTP;extjava编译器ra_user_agent"
webView.customUserAgent = user
}

参看文章

WKWebView 那些坑