java - Spring boot AngularJs $http.get 为空
问题描述
我正在创建一个资源监视器,用于检索有关不同域但相同端口上的机器的典型信息。直接访问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+
" }";
}
}
解决方案
看来您ServerRestController
需要跨域,添加此
@RestController
@CrossOrigin(origins = "*")
public class ServerRestController {
...
}
此外,如果你想允许一个特定的来源,你可以这样做:
@CrossOrigin(origins = "http://stackoverflow.com", maxAge = 3600)
您可以@CrossOrigin
在每种方法或RestController
.
此外,如果您有多个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
推荐阅读
- sas - 如何通过指定交叉验证组在 SAS 中构建树模型
- r - 当其他 ui 元素在 Shiny 中加载时,如何隐藏操作按钮
- sql-server - 如何使用 VBA 执行插入/更新记录的存储过程?
- java - 问题将默认值设置为一(DiceRoll.Java)
- node.js - 在nodejs的不同变量中存储不同的网络接口地址
- windows - Powershell脚本打开应用程序很慢
- google-apps-script - 由脚本触发器创建的触发器不起作用
- c++ - std::ofstream 有时无法在“for”循环中打开文件
- r - 在一个条件下连接两个数据框(grepl)
- r - 从 eWrapper IBrokers R 中删除“volume, last and last size”