将数据发送到 JAVA post REST API in Angular 时出现 CORS 错误 4
Getting CORS error when sending data to JAVA post REST API in Angular 4
我正在通过 post 请求向 java restful web api 发送反应式表单数据,但它显示 CORS 错误,而在 GET 请求中同样工作正常。我已经设置了 CORS header 以响应 rest api.
Angular 服务代码:
private headers = new Headers({ 'Content-Type': 'application/json'});
baseURL='http://127.0.0.1:8080/userInformation/rest/UserService';
addData(formdata: any){
var body = JSON.stringify(formdata);
return this.http.post(this.baseURL+'/adduser',body)
.subscribe(
res => {
console.log(res);
},
err => {
console.log('Error occured');
}
);
}
JAVA 休息 API 代码:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/adduser")
public Response createUser(String val){
Gson gson = new Gson();
User user = gson.fromJson(val, User.class);
userDao.insertUser(user);
String result="SUCCESS";
return Response.ok().entity(result)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD")
.build();
}
Header 说明:
enter image description here
我认为当我们将数据发送到 rest api 时,我们需要将 CORS 源 header 设置为我们的 angular 代码。我该怎么做?
您可以通过 运行 Angular 和 proxy 配置更改后端来做到这一点。更多详细信息 here。
一言以蔽之:
将您的 baseUrl
的端口更改为 4200(或您的 Angular 应用运行的端口):
baseURL = 'http://127.0.0.1:4200/userInformation/rest/UserService';
在 Angular 项目的根目录中创建一个 proxy.conf.json 文件,内容为:
{
"/userInformation": {
"target": "http://127.0.0.1:8080",
"secure": false
}
}
运行 Angular 应用 ng serve --proxy-config proxy.conf.json
此时您的应用程序在端口 4200 上运行,当您尝试访问包含 /userInformation
的端点时,它会劫持 URL 并将其发送到您在代理配置中设置的目标加上路径的其余部分,所以 http://127.0.0.1:8080/userInformation/rest/UserService/addUser。顺便说一句,如果你的端点不在你的后端,浏览器开发控制台会抱怨端口 4200 上的那个端点,但调用真的去了 8080。
我们需要为传入请求添加过滤器,如下所示:
创建一个过滤器 CrossOrigin,如下所示:
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
public class CrossOrigin implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest creq, ContainerResponse cresp) {
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");
return cresp;
}
}
然后在web.xml中注册:
<servlet>
<servlet-name>Jersey RESTful Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.newgen.ap2</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>com.newgen.ap2.CrossOrigin</param-value>
</init-param>
</servlet>
您可以通过在控制器 class 声明上使用注释来解决它。
@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping({ "/controller" })
public class Controller {
}
我正在通过 post 请求向 java restful web api 发送反应式表单数据,但它显示 CORS 错误,而在 GET 请求中同样工作正常。我已经设置了 CORS header 以响应 rest api.
Angular 服务代码:
private headers = new Headers({ 'Content-Type': 'application/json'});
baseURL='http://127.0.0.1:8080/userInformation/rest/UserService';
addData(formdata: any){
var body = JSON.stringify(formdata);
return this.http.post(this.baseURL+'/adduser',body)
.subscribe(
res => {
console.log(res);
},
err => {
console.log('Error occured');
}
);
}
JAVA 休息 API 代码:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/adduser")
public Response createUser(String val){
Gson gson = new Gson();
User user = gson.fromJson(val, User.class);
userDao.insertUser(user);
String result="SUCCESS";
return Response.ok().entity(result)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD")
.build();
}
Header 说明: enter image description here 我认为当我们将数据发送到 rest api 时,我们需要将 CORS 源 header 设置为我们的 angular 代码。我该怎么做?
您可以通过 运行 Angular 和 proxy 配置更改后端来做到这一点。更多详细信息 here。
一言以蔽之:
将您的
baseUrl
的端口更改为 4200(或您的 Angular 应用运行的端口):baseURL = 'http://127.0.0.1:4200/userInformation/rest/UserService';
在 Angular 项目的根目录中创建一个 proxy.conf.json 文件,内容为:
{ "/userInformation": { "target": "http://127.0.0.1:8080", "secure": false } }
运行 Angular 应用
ng serve --proxy-config proxy.conf.json
此时您的应用程序在端口 4200 上运行,当您尝试访问包含 /userInformation
的端点时,它会劫持 URL 并将其发送到您在代理配置中设置的目标加上路径的其余部分,所以 http://127.0.0.1:8080/userInformation/rest/UserService/addUser。顺便说一句,如果你的端点不在你的后端,浏览器开发控制台会抱怨端口 4200 上的那个端点,但调用真的去了 8080。
我们需要为传入请求添加过滤器,如下所示:
创建一个过滤器 CrossOrigin,如下所示:
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
public class CrossOrigin implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest creq, ContainerResponse cresp) {
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS, HEAD");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");
return cresp;
}
}
然后在web.xml中注册:
<servlet>
<servlet-name>Jersey RESTful Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.newgen.ap2</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>com.newgen.ap2.CrossOrigin</param-value>
</init-param>
</servlet>
您可以通过在控制器 class 声明上使用注释来解决它。
@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping({ "/controller" })
public class Controller {
}