飞行前的响应在angular2/4中无效(重定向)

飞行前的响应在angular2/4中无效(重定向),angular,rest,redirect,spring-boot,rxjs,Angular,Rest,Redirect,Spring Boot,Rxjs,我使用angular4作为前端,springboot应用程序作为后端。前端和BFF(前端后端)之间的集成方法是RESTful请求 因此前端向SpringBoot REST控制器处理的后端端点发送POST请求,后端向前端返回302重定向响应 问题是我一直遇到XMLHttpRequest无法加载。飞行前的响应无效(重定向)问题 不知何故,我不认为这是服务器(后端)的问题,因为我使用postman测试后端,它确实转到重定向网站(postman没有呈现重定向网站tho,它确实收到了网站文件) 来自ang

我使用angular4作为前端,springboot应用程序作为后端。前端和BFF(前端后端)之间的集成方法是RESTful请求

因此前端向SpringBoot REST控制器处理的后端端点发送POST请求,后端向前端返回302重定向响应

问题是我一直遇到XMLHttpRequest无法加载。飞行前的响应无效(重定向)问题

不知何故,我不认为这是服务器(后端)的问题,因为我使用postman测试后端,它确实转到重定向网站(postman没有呈现重定向网站tho,它确实收到了网站文件)

来自angular4前端的POST请求

angular4服务文件中的可观测函数

}

来自springboot应用程序后端的响应头代码

后端Restcontroller

后端响应头

网络日志截图:


任何帮助都将不胜感激,谢谢

如果我没看错这个问题,你似乎在做:

  • 前端从后端请求资源
  • 后端响应重定向到谷歌
  • 前端尝试从Google获取请求,但由于CORS而失败
  • 除非目标服务器(Google)明确允许,否则不允许网站在其范围外(在您的示例中为localhost)发出XHR请求。Chrome不允许你的网站代表用户向google.com提出请求。您可以设置窗口位置(例如重定向浏览器),但不能从后端进行设置

    听起来像是在单页应用程序中处理某种身份验证流。一个可行的工作流程是:

    • 让服务器响应所有缺少401身份验证的API请求
    • 在服务器(/login)上有一个端点,它以302响应google
    • 在前端,监听401,如果检测到,将窗口位置更改为/login

    前端托管在端口4200,后端托管在端口8080Hi@Pace,感谢您的回复。你是对的,我在这里做一个安全流程。前端监听401是指观察服务器响应吗?但是在这种情况下,接收到的所有401响应前端是否都会将页面重定向到/login?是的,401将指示用户未登录,请求受到保护,并且需要登录的用户。如果发生这种情况,我认为你应该重定向到登录页面。嗨,黑客可以更改响应代码状态并强制web应用进入/登录吗?我还忘了添加一些细节:位置url实际上将从服务器返回。我担心黑客会破坏数据包并更改位置和状态代码。如果您使用的是https,那么攻击线似乎不太可能。此外,如果黑客可以做到这一点,那么他们可以将用户的第一个请求更改为302,以访问他们想要的任何站点。
    validateData(id, pw, path): Observable<Object>{
    
        let url:string= "http://localhost:8080/backend";
    
        let headers = new Headers({'Accepts':'text/plain ; application/json', 'Content-type':'Application/json; charset=utf-8', 'Access-Control-Allow-Origin':'*'});
    
        let userData = JSON.stringify({username: id, password: pw, resumePath: path});
    
        let options = new RequestOptions({headers: headers});
    
        //return response 
        return this.http.post(url, userData ,options).map(res=>res.json());
    }
    
    validateData(id:string, pw:string, path:string){
    
      return this.loginService.validateData(id, pw, path).subscribe(
    
              //BFF return an object contains REF //implements interface on response
              response=> {
                console.log(response);
              }, 
              error=> { 
                console.log("error occurs");
                console.log(error);
              },
              ()=> {}
          );
    
    @CrossOrigin(origins = "http://localhost:4200") //enable CORS && temperory origin url
    @RequestMapping(value= "/backend", method= RequestMethod.POST, produces= "text/plain")
    public ResponseEntity getMockData (@RequestBody Credential credential) {
    
        System.out.println("username: "+ credential.getUsername()+" password: " +credential.getPassword()+" resumePath:" + credential.getResumePath());
    
        return this.postAuthCred(credential.getUsername(), credential.getPassword(), credential.getResumePath());
    }
    
    private ResponseEntity postAuthCred(String username, String password, String path){
    
      HttpHeaders responseHeaders = new HttpHeaders();
    
      String responseBody= "http://www.google.ca";
    
      responseHeaders.add("Origin", "http://localhost:8080");
      responseHeaders.add("Access-Control-Allow-Origin", "*");
      responseHeaders.add("Accept", "text/plain;application/json");
      responseHeaders.add("Access-Control-Allow-Headers", "Content-Type, Content-Range, Content-Disposition, Content-Description");
      responseHeaders.add("Content-Type", "text/plain");
      responseHeaders.add("Access-Control-Allow-Methods ", "HEAD, GET, POST");
      responseHeaders.add("Access-Control-Max-Age", "1728000");
      responseHeaders.add("Location", "https://www.google.ca/");
    
      return new ResponseEntity(responseBody, responseHeaders, HttpStatus.FOUND);
    }