跨源访问 (CORS) 存在问题
最近在解决一个跨域访问问题的时候。 浏览器一直报错chrome浏览器跨域怎么解决,谷歌浏览器安全浏览设置在哪里,报错信息如下:
从“URL A”到“URL B”已通过 CORS:to 未通过检查:没有“--Allow-”在 .
这里有一些解释 CORS 工作原理的好文章
1.错误信息的来源
访问检查会在cors中进行,这里报错是因为没有cors。
base::Optional<CorsErrorStatus> CheckAccessInternal(
const GURL& response_url,
const int response_status_code,
const base::Optional<std::string>& allow_origin_header,
const base::Optional<std::string>& allow_credentials_header,
mojom::CredentialsMode credentials_mode,
const url::Origin& origin) {
...
else if (!allow_origin_header) {
return CorsErrorStatus(mojom::CorsError::kMissingAllowOriginHeader);
}
...
}
2.尝试解决方法
1.
URL 中有一个 **--web-** 开关,官方的意思是 Don’t the same- 。 (由他们的网站使用。)
在启动浏览器的时候加上这个参数,未能解决问题。 怀疑是这个开关不起作用。
2.一些在 code.h中定义
它包含; 这个名字感觉与-web-有关
3. 调查这个偏好是如何运作的
进行中
控股成员
std::unique_ptr<WebPreferences> web_preferences_;
进行中
控股成员
WebPreferences webkit_preferences_;
当前进程中有s获取
const WebPreferences RenderViewHostImpl::ComputeWebPreferences() {
TRACE_EVENT0("browser", "RenderViewHostImpl::GetWebkitPrefs");
WebPreferences prefs;
const base::CommandLine& command_line =
*base::CommandLine::ForCurrentProcess();
SetSlowWebPreferences(command_line, &prefs);
//在command_line中检查是否含有开关kDisableWebSecurity
//如果command_line中含有该开关就会把web_security_enabled置为false
//至于为什么加了该command_line却不起作用,这个还需调查一下
prefs.web_security_enabled =
!command_line.HasSwitch(switches::kDisableWebSecurity);
...
return prefs;
}
void RenderViewHostImpl::OnWebkitPreferencesChanged() {
...
UpdateWebkitPreferences(ComputeWebPreferences());
...
}
void RenderViewHostImpl::UpdateWebkitPreferences(const WebPreferences& prefs) {
web_preferences_.reset(new WebPreferences(prefs));
Send(new ViewMsg_UpdateWebPreferences(GetRoutingID(), prefs));
}
更新后chrome浏览器跨域怎么解决,谷歌浏览器安全浏览设置在哪里,会向进程发送IPC消息
IPC 在 src///.h 中定义
// This passes a set of webkit preferences down to the renderer.
IPC_MESSAGE_ROUTED1(ViewMsg_UpdateWebPreferences,
content::WebPreferences)
进程中会接受并处理相应的IPC报文
IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences)
void RenderViewImpl::OnUpdateWebPreferences(const WebPreferences& prefs) {
webkit_preferences_ = prefs;
ApplyWebPreferences(webkit_preferences_, webview());
}
void RenderView::ApplyWebPreferences(const WebPreferences& prefs,
WebView* web_view) {
WebSettings* settings = web_view->GetSettings();
settings->SetWebSecurityEnabled(prefs.web_security_enabled);
...
}
void WebSettingsImpl::SetWebSecurityEnabled(bool enabled) {
//WebSettingsImpl持有Settings* settings_;这个Setting是CORE_EXPORT的
settings_->SetWebSecurityEnabled(enabled);
}
大部分参数和Get、Set方法都以宏定义.h的形式放在一个宏中
void Settings::SetWebSecurityEnabled(bool web_security_enabled) {
if (web_security_enabled_ == web_security_enabled)
return;
web_security_enabled_ = web_security_enabled;
}
bool GetWebSecurityEnabled() const { return web_security_enabled_; }
这里也有一个方法
bool GetAllowUniversalAccessFromFileURLs() const { return allow_universal_access_from_file_urls_; }
在 src//blink//core/dom/
void InitializeOrigin(const DocumentInit& initializer) {
...
if (initializer.HasSecurityContext()) {
if (Settings* settings = initializer.GetSettings()) {
if (!settings->GetWebSecurityEnabled()) {
// Web security is turned off. We should let this document access
// every other document. This is used primary by testing harnesses for
// web sites.
//这里是把SecurityOrigin持有的通用访问权限universal_access_ 置为true默认是false
security_origin_->GrantUniversalAccess();
} else if (security_origin_->IsLocal()) {
if (settings->GetAllowUniversalAccessFromFileURLs()) {
// Some clients want local URLs to have universal access, but that
// setting is dangerous for other clients.
security_origin_->GrantUniversalAccess();
} else if (!settings->GetAllowFileAccessFromFileURLs()) {
// Some clients do not want local URLs to have access to other local
// URLs.
security_origin_->BlockLocalAccessFromLocalOrigin();
}
}
}
}
...
}
(未完)