簡體   English   中英

在 Angular 4 中將數據發送到 JAVA post REST API 時出現 CORS 錯誤

[英]Getting CORS error when sending data to JAVA post REST API in Angular 4

我正在通過 post 請求向 java restful web api 發送反應式表單數據,但它顯示我的 CORS 錯誤,而在 GET 請求中同樣工作正常。 我已經設置了 CORS 標頭以響應 rest api。

角度服務代碼:

 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 Description :在此處輸入圖像描述我認為當我們將數據發送到 rest api 時,我們需要將 CORS 源頭設置為我們的角度代碼。 我該怎么做?

您可以通過在 Controller 類聲明上使用注釋來解決它。

@RestController
@CrossOrigin(origins = "*", maxAge = 3600)
@RequestMapping({ "/controller" })
public class Controller {
}

通過使用代理配置運行 Angular,您可以在不更改后端的情況下執行此操作。 更多細節在這里

簡而言之

  1. baseUrl的端口更改為 4200(或運行 Angular 應用程序的任何端口):

     baseURL = 'http://127.0.0.1:4200/userInformation/rest/UserService';
  2. 在 Angular 項目的根目錄中創建一個proxy.conf.json文件,內容如下:

     { "/userInformation": { "target": "http://127.0.0.1:8080", "secure": false } }
  3. 使用ng serve --proxy-config proxy.conf.json運行 Angular 應用

此時,您的應用程序在端口 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM