我想使用http://5.160.2.148:8091/api/trainTicketing/city/findAll休息区在我的有角项目中获取城市。
我在项目中使用的是angular的7.2.15版本。
当使用httpClient获得此网址时,抛出以下错误:
Access to XMLHttpRequest at 'http://5.160.2.148:8091/api/trainTicketing/city/findAll' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
在浏览器和邮递员中输入url时可以正常工作。
为什么?
答案 0 :(得分:8)
如果使用spring boot,则应在@CrossOrigin批注中添加原始链接
@CrossOrigin(origins = "http://localhost:4200")
@GetMapping("/yourPath")
中找到详细说明
答案 1 :(得分:8)
我在添加 cors中间件之前就使用了 https重定向,并能够通过更改它们的顺序来解决该问题
我的意思是:
更改此项:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseHttpsRedirection();
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
...
}
为此:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseHttpsRedirection();
...
}
顺便说一句,允许来自任何来源和方法的请求在生产阶段可能不是一个好主意,您应该在生产时编写自己的cors政策。
答案 2 :(得分:5)
WebAPI中的Startup.cs。
app.UseCors(options => options.AllowAnyOrigin());
在ConfigureServices方法中:
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
});
在控制器中:
[HttpGet]
[Route("GetAllAuthor")]
[EnableCors("AllowOrigin")]
答案 3 :(得分:5)
你们都擅长Angular,甚至邮递员也没有提出cors政策问题。 在大多数情况下,此类问题可以在后端解决。
如果您使用的是Spring Boot,则可以通过将注释放在控制器类或任何特定方法上来避免此问题。
@CrossOrigin(origins = "http://localhost:4200")
在使用Spring Boot进行全局配置的情况下,请配置以下两类:
`
@EnableWebSecurity
@AllArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity httpSecurity) throws Exception{
httpSecurity.csrf().disable()
.authorizeRequests()
.antMatchers("/api1/**").permitAll()
.antMatchers("/api2/**").permitAll()
.antMatchers("/api3/**").permitAll()
}
`
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry corsRegistry) {
corsRegistry.addMapping("/**")
.allowedOrigins("http://localhost:4200")
.allowedMethods("*")
.maxAge(3600L)
.allowedHeaders("*")
.exposedHeaders("Authorization")
.allowCredentials(true);
}
答案 4 :(得分:3)
如果您的项目是.net Core 3.1 API项目。
将.net核心项目中的Startup.cs更新为:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy(MyAllowSpecificOrigins,
builder =>
{
builder.WithOrigins("http://localhost:53135",
"http://localhost:4200"
)
.AllowAnyHeader()
.AllowAnyMethod();
});
});
services.AddDbContext<CIVDataContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("CIVDatabaseConnection")));
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors(MyAllowSpecificOrigins);
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
答案 5 :(得分:1)
1: 创建一个类WebMvcConfig并按照 WebMvcConfiguration 所示进行扩展,并覆盖 addCorsMappings 方法。
2: 最重要的是,不要忘记使其成为 @Configuration 批注,因为它应该与Main Spring类一起加载以允许跨域使用。
@Configuration
public class WebMvcCofig implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(true);
}
}
答案 6 :(得分:1)
如果您使用 spring-boot 进行服务器端编码,请添加 servlet过滤器,并为spring-boot应用程序添加以下代码。它应该工作。必须添加"Access-Control-Allow-Headers", "*"
。不需要创建 proxy.conf.json 。
@Component
@Order(1)
public class MyProjectFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PATCH,DELETE,PUT,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Max-Age", "86400");
chain.doFilter(req, res);
}
}
答案 7 :(得分:1)
答案 8 :(得分:1)
在使用 Angular和Spring Boot 的情况下,我在SecurityConfig中解决了该问题:
http.csrf().disable().cors().disable()
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/register")
.anonymous()
.anyRequest().authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
或将该行替换为:
http.csrf().disable().cors().and()
其他测试选项是从pom.xml中删除依赖项,其他代码也依赖于此。就像从Spring关闭安全性一样:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
答案 9 :(得分:1)
我尝试在 Express 服务器上的 API 上添加以下语句,并且它与 Angular8 一起使用。
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET , PUT , POST , DELETE");
res.header("Access-Control-Allow-Headers", "Content-Type, x-requested-with");
next(); // Important
})
答案 10 :(得分:0)
对于开发过程中的临时测试,我们可以通过打开具有禁用的网络安全性的chrome来禁用它。
打开命令行终端,然后转到安装chrome的文件夹,即C:\ Program Files(x86)\ Google \ Chrome \ Application
输入以下命令:
chrome.exe --user-data-dir =“ C:/ Chrome开发者会话” --disable-web-security
将打开一个新的浏览器窗口,其中包含禁用的Web安全性。仅将其用于测试您的应用。
答案 11 :(得分:0)
答案 12 :(得分:0)
就我而言,我看到了错误:
Access to XMLHttpRequest at 'localhost:5000/graphql' from origin 'http://localhost:4200' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, brave, chrome-untrusted, https.
确保在您的网址中包含协议(http 或 https)。
const uri = 'http://localhost:5000/graphql'; //
答案 13 :(得分:0)
我尝试了上面给出的所有解决方案并在使用 nodejs 后端时工作但不幸的是在使用 python 时它无法工作,所以我最终安装了一个插件 Allow CORS,至少这个插件有帮助
答案 14 :(得分:0)
如果您将 Angular 与 Dotnet Core 结合使用:
在类 Startup.cs
在方法 ConfigureServices 上添加:
services.AddCors();
On 方法配置添加
app.UseCors(options => options.AllowAnyHeader().AllowAnyMethod().WithOrigins("http://localhost:4200"));
答案 15 :(得分:0)
spring boot中处理CORs问题的方法有很多,最简单的方法就是把@CrossOrigin注解放在Controller上面,可能在你的..resource java文件中。试试
@CrossOrigin(origins= {"*"}, maxAge = 4800, allowCredentials = "false" @RestController
有关更多信息,请阅读 spring boot CORs 文档。谢谢。
答案 16 :(得分:0)
创建一个类并在 spring boot 应用程序中添加以下配置。
package com.myapp.springboot.configs;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*").
allowedOrigins("*").
allowedMethods("*").
allowedHeaders("*").
allowCredentials(true);
}
}
答案 17 :(得分:0)
如果你使用Spring boot 2,你可以在控制器类中添加CrossOrigin注解
@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
它对我有用!
答案 18 :(得分:0)
对于nodejs
,请使用以下代码
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200');
答案 19 :(得分:0)
遵循这些步骤
npm install --save cors
var cors = require('cors');
app.use(cors());
答案 20 :(得分:0)
该解决方案需要将这些标头添加到服务器响应中。
'Access-Control-Allow-Origin', '*'
'Access-Control-Allow-Methods', 'GET,POST,OPTIONS,DELETE,PUT'
如果您有权访问服务器,则可以添加它们,这将解决您的问题
OR
您可以尝试在网址前面添加此链接:
https://cors-anywhere.herokuapp.com/