从 localhost:4200 访问 localhost:8080 的 XMLHttpRequest 已被 CORS 策略阻止
Posted
技术标签:
【中文标题】从 localhost:4200 访问 localhost:8080 的 XMLHttpRequest 已被 CORS 策略阻止【英文标题】:Access to XMLHttpRequest at localhost:8080 from localhost:4200 has been blocked by CORS policy 【发布时间】:2021-08-14 23:40:34 【问题描述】:“从源 'http://localhost:4200' 访问 'http://localhost:8080/authenticate/login' 的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。”
Spring Boot 后端,Angular 前端。尝试以包含用户名和密码的登录对象的形式发送 Http 帖子。它应该收到一个 jwt 令牌作为回报。在邮递员中完美运行,所以它让我相信谷歌浏览器是问题所在。我也在使用允许 CORS Chrome 扩展。
奇怪的是,http GET 请求可以正常工作。
我尝试在 Angular 中创建代理,但没有解决问题。我也可能做错了,我刚开始制作网络应用程序,所以一些网站上所有含糊的说明真的让我很沮丧。
auth.service.ts哪个发送请求
import Injectable, ɵCompiler_compileModuleAndAllComponentsSync__POST_R3__ from "@angular/core";
import BehaviorSubject, Observable from "rxjs";
import map from "rxjs/operators";
import environment from "src/environments/environment";
@Injectable( providedIn: 'root' )
export class AuthService
isAuthenticatedSubject = new BehaviorSubject<boolean>(false);
constructor(private httpClient: HttpClient)
login(username: string, password: string): Observable<any>
const data =
username: username,
password: password
;
let headers = new HttpHeaders();
headers.set('Contact-Type', 'application/json');
const url = `$environment.AUTH_ROUTE`;
return this.httpClient.post<any>(url, data, headers: headers )
.pipe(
map(response =>
localStorage.setItem('token', response.token);
this.isAuthenticatedSubject.next(true);
return response;
)
);
// token: "vrijednost-tokena"
logout()
localStorage.removeItem('token');
this.isAuthenticatedSubject.next(null);
AuthController.java哪个接收请求
import com.example.stevan.madsapp.security.jwt.JwtTokenProvider;
import com.example.stevan.madsapp.web.dto.LoginDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping(value = "/authenticate", produces = MediaType.APPLICATION_JSON_VALUE)
public class AuthController
@Autowired
private JwtTokenProvider jwtTokenProvider;
@Autowired
private AuthenticationManager authenticationManager;
@PostMapping(value = "/login")
public ResponseEntity<Object> login(@RequestBody LoginDTO loginDTO)
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
loginDTO.getUsername(), loginDTO.getPassword()
);
try
Authentication authentication = authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
String token = jwtTokenProvider.createToken(authentication);
Map<String, String> responsePayload = new HashMap<>();
responsePayload.put("token", token);
return new ResponseEntity<>(responsePayload, HttpStatus.OK);
catch (Exception e)
return new ResponseEntity<>("Error while login", HttpStatus.UNAUTHORIZED);
对于我缺乏这方面的基本知识,我很抱歉。
【问题讨论】:
【参考方案1】:将@CrossOrigin(origins = "http://localhost:4200")
添加到控制器方法应该可以解决您的问题。看看Enabling Cross Origin Requests for a RESTful Web Service
【讨论】:
【参考方案2】:它不能解决删除请求,但它适用于 put 和其他请求,我添加了交叉原点如下https://gyazo.com/e058904cb5ee27685fac4f3811b9b2a8 但是在尝试从 Angular 应用程序中删除资源时得到这个https://gyazo.com/7481236f8ed7fcdecd2c898227c90e08
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review以上是关于从 localhost:4200 访问 localhost:8080 的 XMLHttpRequest 已被 CORS 策略阻止的主要内容,如果未能解决你的问题,请参考以下文章
CORS 策略已阻止访问源“http://localhost:4200”的 XMLHttpRequest
从源“http://localhost:4200”访问“http://localhost:1111/...”的 XMLHttpRequest 已被 CORS 策略阻止:
从源“http://localhost:4200”访问“localhost:8088/user/”的 XMLHttpRequest 已被 CORS 策略阻止 [重复]
从源“http://localhost:4200”访问“”处的 XMLHttpRequest 已被 CORS 阻止。我无权访问服务器
带有 Angular 的 Spring Boot。从源“http://localhost:4200”访问“http://localhost:8080/”的 XMLHttpRequest 已被 CORS
访问“http://....”源“http://localhost:4200”的 XMLHttpRequest 已被 CORS 策略阻止