【问题标题】:Spring boot AngularJs $http.get is emptySpring boot AngularJs $http.get 为空
【发布时间】:2019-03-04 10:58:59
【问题描述】:

我正在创建一个资源监视器,用于检索有关不同域但相同端口上的机器的典型信息。直接访问url时,数据返回成功。但是,如果我们使用 angularJs 尝试它,$http.get 请求将返回“被 CORS 策略阻止:请求的资源上不存在‘Access-Control-Allow-Origin’标头”。我们决定使用 chrome CORS 扩展来允许连接。现在唯一的问题是 $http.get 请求始终为空,尽管数据存在。不知道为什么会发生这种情况,因为没有产生错误。

角度控制器

app.controller("ServerResourcesController", [ "$scope", "$http", function($scope, $http) {

     $http.get("http://000.000.0.0:8080/testing")
    .then(function(data){
        console.log(data);
        })
}]);

控制器

@RestController
public class ServerRestController {

    Logger logger = LoggerFactory.getLogger(ServerRestController.class);
    ServerQueryController sqc = new ServerQueryController();

    @RequestMapping("/server-service-info")
    public String ServiceInfo() {//Welcome page, non-rest
        return "Server Resource Monitor Service";
    }

    //rest end point
    @GetMapping("/server-resources-info")
    public ServerInformation ServerInformation() {
        ServerInformation serverInformation = sqc.CurrentServerResourceInformation();
        return serverInformation;
    }
    }

对象类

@Getter @Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class ServerInformation {

    private String name;
    private String ipAddress;
    private double systemCpuLoad;
    private double freePhysicalMemory;
    private double totalPhysicalMemory;
    private String operatingSystem;
    private double freeDiskSpace;
    private double diskUsage;

    public ServerInformation() {

    }

    @Override
    public String toString() {
        return "Values{ systemCpuLoad: "+systemCpuLoad+
                ", freePhysicalMemory: "+freePhysicalMemory+
                ", totalPhysicalMemory: "+totalPhysicalMemory+
                ", operatingSystem: "+operatingSystem+
                ", freeDiskSpace: "+freeDiskSpace+
                ", diskUsage: "+diskUsage+
                " }";
    }

}

【问题讨论】:

    标签: java angularjs http


    【解决方案1】:

    看来你的ServerRestController需要跨域,加这个

    @RestController
    @CrossOrigin(origins = "*")
    public class ServerRestController {
    ...
    }
    

    另外,如果你想允许一个特定的来源,你可以这样做:

    @CrossOrigin(origins = "http://stackoverflow.com", maxAge = 3600)
    

    您可以在每个方法或RestController 上设置@CrossOrigin 的允许和最大年龄。

    此外,如果您有多个RestController,最好在每个控制器上都写上@CrossOrigin,您可以像这样创建Filter

    @Component
    public class SimpleCORSFilter implements Filter {
    
    private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);
    
    public SimpleCORSFilter() {
        log.info("SimpleCORSFilter init");
    }
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    
    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");
    
    chain.doFilter(req, res);
    }
    
    @Override
    public void init(FilterConfig filterConfig) {
    }
    
    @Override
    public void destroy() {
    }
    
    }
    

    在此处查看示例:spring cors

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 1970-01-01
      • 2017-01-12
      • 2015-05-30
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2020-10-11
      相关资源
      最近更新 更多