在 ASP.NET Core 中启用跨域请求(CORS)
本文介绍如何在 ASP.NET Core 的应用程序中启用 CORS。
浏览器安全可以防止网页向其他域发送请求,而不是为网页提供服务。 此限制称为相同源策略。 同一源策略可防止恶意站点读取另一个站点中的敏感数据。 有时,你可能想要允许其他站点对你的应用进行跨域请求。 有关详细信息,请参阅MOZILLA CORS 一文。
跨源资源共享(CORS):
- 是一种 W3C 标准,可让服务器放宽相同的源策略。
- 不是一项安全功能,CORS 放宽 security。 API 不能通过允许 CORS 来更安全。 有关详细信息,请参阅CORS 的工作原理。
- 允许服务器明确允许一些跨源请求,同时拒绝其他请求。
- 比早期的技术(如JSONP)更安全且更灵活。
同一原点
如果两个 Url 具有相同的方案、主机和端口(RFC 6454),则它们具有相同的源。
这两个 Url 具有相同的源:
https://example.com/foo.htmlhttps://example.com/bar.html
这些 Url 的起源不同于前两个 Url:
https://example.net– 个不同的域https://www.example.com/foo.html– 个不同的子域http://example.com/foo.html– 个不同的方案https://example.com:9000/foo.html– 个不同端口
比较来源时,Internet Explorer 不会考虑该端口。
具有命名策略和中间件的 CORS
CORS 中间件处理跨域请求。 以下代码通过指定源为整个应用启用 CORS:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com");
});
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
} app.UseCors(MyAllowSpecificOrigins); app.UseHttpsRedirection();
app.UseMvc();
}
}
前面的代码:
- 将策略名称设置为 "_myAllowSpecificOrigins"。 策略名称为任意名称。
- 调用 UseCors 扩展方法,这将启用 CORS。
- 使用lambda 表达式调用 AddCors。 Lambda 采用 @no__t 0 对象。 本文稍后将介绍配置选项,如
WithOrigins。
@No__t-0 方法调用将 CORS 服务添加到应用的服务容器:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com");
});
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
有关详细信息,请参阅本文档中的CORS 策略选项。
@No__t-0 方法可以链接方法,如以下代码所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com")
.AllowAnyHeader()
.AllowAnyMethod();
});
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
注意: URL不得包含尾随斜杠(/)。 如果 URL 以 / 终止,比较将返回 false,并且不返回任何标头。
将 CORS 策略应用到所有终结点
以下代码通过 CORS 中间件将 CORS 策略应用到所有应用终结点:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Preceding code ommitted.
app.UseRouting(); app.UseCors(); app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
}); // Following code ommited.
}
警告
通过终结点路由,CORS 中间件必须配置为在对 @no__t 和 UseEndpoints 的调用之间执行。 配置不正确将导致中间件停止正常运行。
请参阅在 Razor Pages、控制器和操作方法中启用 cors,以在页面/控制器/操作级别应用 cors 策略。
有关测试上述代码的说明,请参阅测试 CORS 。
使用终结点路由启用 Cors
使用终结点路由,可以根据每个终结点启用 CORS,使用 @no__t 的扩展方法集。
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/echo", async context => context.Response.WriteAsync("echo"))
.RequireCors("policy-name");
});
同样,也可以为所有控制器启用 CORS:
app.UseEndpoints(endpoints => { endpoints.MapControllers().RequireCors("policy-name"); });
使用属性启用 CORS
@No__t-1EnableCors @ no__t属性提供了一种用于全局应用 CORS 的替代方法。 @No__t-0 特性可为选定的终结点(而不是所有终结点)启用 CORS。
使用 @no__t 指定默认策略,并 [EnableCors("{Policy String}")] 指定策略。
@No__t-0 特性可应用于:
- Razor 页
PageModel - 控制器
- 控制器操作方法
您可以将不同的策略应用于控制器/页面模型/操作,[EnableCors] 属性。 将 [EnableCors] 属性应用于控制器/页面模型/操作方法,并在中间件中启用 CORS 时,将应用这两种策略。 建议不要结合策略。 使用同一个应用中的 [EnableCors] 特性或中间件。
下面的代码将不同的策略应用于每个方法:
[Route("api/[controller]")]
[ApiController]
public class WidgetController : ControllerBase
{
// GET api/values
[EnableCors("AnotherPolicy")]
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "green widget", "red widget" };
}
// GET api/values/5
[EnableCors] // Default policy.
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
switch (id)
{
case :
return "green widget";
case :
return "red widget";
default:
return NotFound();
}
}
}
以下代码创建 CORS 默认策略和名为 "AnotherPolicy" 的策略:
public class StartupMultiPolicy
{
public StartupMultiPolicy(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddDefaultPolicy(
builder =>
{ builder.WithOrigins("http://example.com",
"http://www.contoso.com");
}); options.AddPolicy("AnotherPolicy",
builder =>
{
builder.WithOrigins("http://www.contoso.com")
.AllowAnyHeader()
.AllowAnyMethod();
}); }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
} app.UseHttpsRedirection();
app.UseMvc();
}
}
禁用 CORS
@No__t-1DisableCors @ no__t-2属性对控制器/页模型/操作禁用 CORS。
CORS 策略选项
本部分介绍可在 CORS 策略中设置的各种选项:
Startup.ConfigureServices 中调用 AddPolicy。 对于某些选项,最好先阅读CORS 如何工作部分。
设置允许的来源
AllowAnyOrigin – 允许所有来源的 CORS 请求和任何方案(http 或 https)。 AllowAnyOrigin 不安全,因为任何网站都可以向应用程序发出跨域请求。
备注
指定 @no__t 0 和 @no__t 为不安全配置,可能导致跨站点请求伪造。 使用这两种方法配置应用时,CORS 服务将返回无效的 CORS 响应。
AllowAnyOrigin 会影响预检请求和 @no__t 标头。 有关详细信息,请参阅预检请求部分。
SetIsOriginAllowedToAllowWildcardSubdomains – 将策略的 @no__t 设置为在评估是否允许源时允许源与配置的通配符域匹配的函数。
options.AddPolicy("AllowSubdomain",
builder =>
{
builder.WithOrigins("https://*.example.com")
.SetIsOriginAllowedToAllowWildcardSubdomains();
});
设置允许的 HTTP 方法
- 允许任何 HTTP 方法:
- 影响预检请求和 @no__t 0 标头。 有关详细信息,请参阅预检请求部分。
设置允许的请求标头
若要允许在 CORS 请求中发送特定标头(称为作者请求标头),请调用 WithHeaders 并指定允许的标头:
options.AddPolicy("AllowHeaders",
builder =>
{
builder.WithOrigins("http://example.com")
.WithHeaders(HeaderNames.ContentType, "x-custom-header");
});
若要允许所有作者请求标头,请调用 AllowAnyHeader:
options.AddPolicy("AllowAllHeaders",
builder =>
{
builder.WithOrigins("http://example.com")
.AllowAnyHeader();
});
此设置会影响预检请求和 @no__t 0 标头。 有关详细信息,请参阅预检请求部分。
仅当在 Access-Control-Request-Headers 中发送的标头与 WithHeaders 中指定的标头完全匹配时,才可以使用 CORS 中间件策略与 WithHeaders 指定的特定标头匹配。
例如,考虑按如下方式配置的应用:
CORS 中间件使用以下请求标头拒绝预检请求,因为 WithHeaders 中未列出 Content-Language (HeaderNames):
Access-Control-Request-Headers: Cache-Control, Content-Language
应用返回200 OK响应,但不会向后发送 CORS 标头。 因此,浏览器不会尝试跨域请求。
设置公开的响应标头
默认情况下,浏览器不会向应用程序公开所有的响应标头。 有关详细信息,请参阅W3C 跨域资源共享(术语):简单的响应标头。
默认情况下可用的响应标头包括:
Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma
CORS 规范将这些标头称为简单的响应标头。 若要使其他标头可用于应用程序,请调用 WithExposedHeaders:
options.AddPolicy("ExposeResponseHeaders",
builder =>
{
builder.WithOrigins("http://example.com")
.WithExposedHeaders("x-custom-header");
});
跨域请求中的凭据
凭据需要在 CORS 请求中进行特殊处理。 默认情况下,浏览器不会使用跨域请求发送凭据。 凭据包括 cookie 和 HTTP 身份验证方案。 若要使用跨域请求发送凭据,客户端必须将 XMLHttpRequest.withCredentials 设置为 true。
直接使用 @no__t:
var xhr = new XMLHttpRequest();
xhr.open('get', 'https://www.example.com/api/test');
xhr.withCredentials = true;
使用 jQuery:
$.ajax({
type: 'get',
url: 'https://www.example.com/api/test',
xhrFields: {
withCredentials: true
}
});
使用提取 API:
fetch('https://www.example.com/api/test', {
credentials: 'include'
});
服务器必须允许凭据。 若要允许跨域凭据,请调用 AllowCredentials:
options.AddPolicy("AllowCredentials",
builder =>
{
builder.WithOrigins("http://example.com")
.AllowCredentials();
});
HTTP 响应包含一个 @no__t 0 的标头,该标头通知浏览器服务器允许跨源请求的凭据。
如果浏览器发送凭据,但响应不包含有效的 @no__t 0 标头,则浏览器不会向应用程序公开响应,而且跨源请求会失败。
允许跨域凭据会带来安全风险。 另一个域中的网站可以代表用户将登录用户的凭据发送给该应用程序,而无需用户的知识。
CORS 规范还指出,如果 @no__t 标头存在,则将源设置为 "*" (所有源)是无效的。
预检请求
对于某些 CORS 请求,浏览器会在发出实际请求之前发送其他请求。 此请求称为预检请求。 如果满足以下条件,浏览器可以跳过预检请求:
- 请求方法为 GET、HEAD 或 POST。
- 应用未设置
Accept、Accept-Language、Content-Language、Content-Type或 @no__t 为的请求标头。 - @No__t 的标头(如果已设置)具有以下值之一:
application/x-www-form-urlencodedmultipart/form-datatext/plain
为客户端请求设置的请求标头上的规则适用于应用通过调用 @no__t @no__t 对象上的的标头。 CORS 规范调用这些标头作者请求标头。 规则不适用于浏览器可以设置的标头,如 User-Agent、Host 或 Content-Length。
下面是预检请求的示例:
OPTIONS https://myservice.azurewebsites.net/api/test HTTP/1.1
Accept: */*
Origin: https://myclient.azurewebsites.net
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: accept, x-my-custom-header
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host: myservice.azurewebsites.net
Content-Length: 0
预航班请求使用 HTTP OPTIONS 方法。 它包括两个特殊标头:
Access-Control-Request-Method:将用于实际请求的 HTTP 方法。Access-Control-Request-Headers:应用在实际请求上设置的请求标头的列表。 如前文所述,这不包含浏览器设置的标头,如User-Agent。
CORS 预检请求可能包括一个 @no__t 0 标头,该标头向服务器指示与实际请求一起发送的标头。
若要允许特定标头,请调用 WithHeaders:
options.AddPolicy("AllowHeaders",
builder =>
{
builder.WithOrigins("http://example.com")
.WithHeaders(HeaderNames.ContentType, "x-custom-header");
});
若要允许所有作者请求标头,请调用 AllowAnyHeader:
options.AddPolicy("AllowAllHeaders",
builder =>
{
builder.WithOrigins("http://example.com")
.AllowAnyHeader();
});
浏览器的设置方式并不完全一致 Access-Control-Request-Headers。 如果将标头设置为 @no__t 0 (或使用 AllowAnyHeader)以外的任何内容,则至少应包含 Accept、Content-Type 和 @no__t,以及要支持的任何自定义标头。
下面是针对预检请求的示例响应(假定服务器允许该请求):
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 0
Access-Control-Allow-Origin: https://myclient.azurewebsites.net
Access-Control-Allow-Headers: x-my-custom-header
Access-Control-Allow-Methods: PUT
Date: Wed, 20 May 2015 06:33:22 GMT
响应包括一个 @no__t 0 标头,该标头列出了允许的方法,还可以选择一个 @no__t 标头,其中列出了允许的标头。 如果预检请求成功,则浏览器发送实际请求。
如果预检请求被拒绝,应用将返回200 OK响应,但不会向后发送 CORS 标头。 因此,浏览器不会尝试跨域请求。
设置预检过期时间
@No__t 的标头指定可缓存对预检请求的响应的时间长度。 若要设置此标头,请调用 SetPreflightMaxAge:
options.AddPolicy("SetPreflightExpiration",
builder =>
{
builder.WithOrigins("http://example.com")
.SetPreflightMaxAge(TimeSpan.FromSeconds());
});
CORS 如何工作
本部分介绍 HTTP 消息级别的CORS请求中发生的情况。
- CORS不是一种安全功能。 CORS 是一种 W3C 标准,可让服务器放宽相同的源策略。
- 例如,恶意执行组件可能会对站点使用阻止跨站点脚本(XSS) ,并对启用了 CORS 的站点执行跨站点请求,以窃取信息。
- API 不能通过允许 CORS 来更安全。
- 它由客户端(浏览器)来强制执行 CORS。 服务器执行请求并返回响应,这是返回错误并阻止响应的客户端。 例如,以下任何工具都将显示服务器响应:
- Fiddler
- Postman
- .NET HttpClient
- Web 浏览器,方法是在地址栏中输入 URL。
- 它由客户端(浏览器)来强制执行 CORS。 服务器执行请求并返回响应,这是返回错误并阻止响应的客户端。 例如,以下任何工具都将显示服务器响应:
- 这是一种方法,使服务器能够允许浏览器执行跨源XHR或获取 API请求,否则将被禁止。
- 浏览器(不含 CORS)不能执行跨域请求。 在 CORS 之前,使用JSONP来绕过此限制。 JSONP 不使用 XHR,它使用
<script>标记接收响应。 允许跨源加载脚本。
- 浏览器(不含 CORS)不能执行跨域请求。 在 CORS 之前,使用JSONP来绕过此限制。 JSONP 不使用 XHR,它使用
CORS 规范介绍了几个新的 HTTP 标头,它们启用了跨域请求。 如果浏览器支持 CORS,则会自动为跨域请求设置这些标头。 若要启用 CORS,无需自定义 JavaScript 代码。
下面是一个跨源请求的示例。 @No__t 0 标头提供发出请求的站点的域。 @No__t 的标头是必需的,并且必须与主机不同。
GET https://myservice.azurewebsites.net/api/test HTTP/1.1
Referer: https://myclient.azurewebsites.net/
Accept: */*
Accept-Language: en-US
Origin: https://myclient.azurewebsites.net
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Host: myservice.azurewebsites.net
如果服务器允许该请求,则会在响应中设置 @no__t 的标头。 此标头的值可以与请求中的 @no__t 0 标头匹配,也可以是通配符值 "*",表示允许任何源:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/plain; charset=utf-8
Access-Control-Allow-Origin: https://myclient.azurewebsites.net
Date: Wed, 20 May 2015 06:27:30 GMT
Content-Length: 12
Test message
如果响应不包括 @no__t 的标头,则跨域请求会失败。 具体而言,浏览器不允许该请求。 即使服务器返回成功的响应,浏览器也不会将响应提供给客户端应用程序。
测试 CORS
测试 CORS:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
} // Shows UseCors with CorsPolicyBuilder.
app.UseCors(builder =>
{
builder.WithOrigins("http://example.com",
"http://www.contoso.com",
"https://localhost:44375",
"https://localhost:5001");
}); app.UseHttpsRedirection();
app.UseMvc();
}
警告
WithOrigins("https://localhost:<port>"); 应仅用于测试类似于下载示例代码的示例应用。
- 创建 web 应用项目(Razor Pages 或 MVC)。 该示例使用 Razor Pages。 可以在与 API 项目相同的解决方案中创建 web 应用。
- 将以下突出显示的代码添加到索引 cshtml文件中:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
} <div class="text-center">
<h1 class="display-4">CORS Test</h1>
</div> <div>
<input type="button" value="Test"
onclick="requestVal('https://<web app>.azurewebsites.net/api/values')" />
<span id='result'></span>
</div> <script>
function requestVal(uri) {
const resultSpan = document.getElementById('result'); fetch(uri)
.then(response => response.json())
.then(data => resultSpan.innerText = data)
.catch(error => resultSpan.innerText = 'See F12 Console for error');
}
</script>
在上面的代码中,将
url: 'https://<web app>.azurewebsites.net/api/values/1',替换为已部署应用的 URL。部署 API 项目。 例如,部署到 Azure。
从桌面运行 Razor Pages 或 MVC 应用,然后单击 "测试" 按钮。 使用 F12 工具查看错误消息。
从 @no__t 中删除 localhost 源,并部署应用。 或者,使用其他端口运行客户端应用。 例如,在 Visual Studio 中运行。
与客户端应用程序进行测试。 CORS 故障返回一个错误,但错误消息不能用于 JavaScript。 使用 F12 工具中的 "控制台" 选项卡查看错误。 根据浏览器,你会收到类似于以下内容的错误(在 F12 工具控制台中):
使用 Microsoft Edge:
SEC7120: [CORS] 源
https://localhost:44375在 @no__t 上找不到跨源资源的访问控制允许源响应标头中的https://localhost:44375使用 Chrome:
对源
https://localhost:44375https://webapi.azurewebsites.net/api/values/1的 XMLHttpRequest 的访问已被 CORS 策略阻止:请求的资源上没有 "访问控制-允许" 标头。
可以使用工具(如Fiddler或Postman)测试启用 CORS 的终结点。 使用工具时,@no__t 的标头指定的请求源必须与接收请求的主机不同。 如果请求不是基于 Origin 标头的值跨域的,则:
- 不需要 CORS 中间件来处理请求。
- 不会在响应中返回 CORS 标头。
在 ASP.NET Core 中启用跨域请求(CORS)的更多相关文章
- ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS)
ylbtech-ASP.NET Core-Docs:在 ASP.NET Core 中启用跨域请求(CORS) 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. ...
- 第十四节:Asp.Net Core 中的跨域解决方案(Cors、jsonp改造、chrome配置)
一. 整体说明 1. 说在前面的话 早在前面的章节中,就详细介绍了.Net FrameWork版本下MVC和WebApi的跨域解决方案,详见:https://www.cnblogs.com/yaope ...
- asp.net core webapi之跨域(Cors)访问
这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...
- ASP.NET Core中防跨站点请求伪造
CSRF(Cross-site request forgery)利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的. 例子 在某个 ...
- asp.net core 创建允许跨域请求的api, cors.
配置应用方域名. 在webapi中引用cors包,在startup的Configure\ConfigServices中增加启动项配置,在api中增加EnableCors的Attribute属性.即可. ...
- ASP.NET Core 启用跨域请求
本文翻译整理自:https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1 一 .Cross-Orig ...
- ASP.NET Core Web API 跨域(CORS) Cookie问题
身为一个Web API,处理来自跨域不同源的请求,是一件十分合理的事情. 先上已有的文章,快速复制粘贴,启用CORS: Microsoft:启用 ASP.NET Core 中的跨域请求 (CORS) ...
- 在ASP.NET 5应用程序中的跨域请求功能详解
在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...
- ASP.NET MVC中设置跨域
ASP.NET MVC中设置跨域 1.什么是跨域请求 js禁止向不是当前域名的网站发起一次ajax请求,即使成功respone了数据,但是你的js仍然会报错.这是JS的同源策略限制,JS控制的并不是我 ...
随机推荐
- js-编程练习题-输出年月日以及练习字符串分割,检索,转换整数(int)
这是在慕课网上看到的编程题-如有侵权,请联系本人删除. 当然:题是他们的,做题是我的...嘿嘿嘿 某班的成绩出来了,现在老师要把班级的成绩打印出来. 效果图: XXXX年XX月X日 星期X--班级总分 ...
- python使用mysql的一些坑
注意:如果你用的是python3.x,直接去看第四个问题 遇到的第一个问题 正常来说直接执行pip安装,就是可以的,但是MySQL-python偏偏比较独特 pip install MySQL-pyt ...
- .Net Core使用Ocelot网关(一) -负载,限流,熔断,Header转换
1.什么是API网关 API网关是微服务架构中的唯一入口,它提供一个单独且统一的API入口用于访问内部一个或多个API.它可以具有身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理等.API ...
- 本土化App名稱和icon
本土化app名稱這個容易 第一步配置工程需要本土化的語言. 第二步,新建本土化文件,文件名稱是有要求的,文件名字命名为InfoPlist,且必须是这个名字.這樣系統會自動去讀取該文件中的內容 對新建的 ...
- Python获取 bing 地图发布自己的 TMS 服务(二)解决海量瓦片存取问题
金字塔结构的瓦片数量有多大 以目前互联网常用的WebMecator为例 第一层:4幅256*256影像瓦片(JPG或PNG等) 第二层:42 第三层:43 依次类推比如计算第1层至第18层的瓦片总数目 ...
- 回文自动机(PAM) 入门讲解
处理回文串,Manacher算法也是很不错,但在有些问题的处理上比较麻烦,比如求本质不同的子串的数量还需要结合后缀数组才能解决.今天的们介绍一种能够方便的解决关于回文串的问题的算法--PAM. 一些功 ...
- THREE.js 笔记
1.加载3d模型,obj格式,方式一: 加载obj,自行指定material贴图:方式二: 同时加载obj和mtl,此时为了正确加载贴图,最好指定统一的baseUrl: 2.canvas.toData ...
- vue中$attrs和$listeners以及inheritAttrs的用法
官方文档说明: 一.解释:包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外). 意思就是父组件往子组件传没有在props里声明过的值时,子组件可以通 ...
- JS-选择排序
选择排序 选择排序的原理如下.遍历数组,设置最小值的索引为 0,如果取出的值比当前最小值小,就替换最小值索引,遍历完成后,将第一个元素和最小值索引上的值交换.如上操作后,第一个元素就是数组中的最小值, ...
- Spring Ioc Configration - Annotation
1.配置类注解@Configuration. 2.Bean注解 @Bean. 3.导入其他配置类@Import. 4.回调函数 @Bean(initMethod = "init", ...