Javascript Spring引导注释@CrossOrigin未停止CORS错误
无论我尝试什么,我都会继续得到错误: “在中访问XMLHttpRequest” 'file:///C:/api/v1/backtest?{%22sma{U名称%22:%22sma“}”来自源 CORS策略已阻止“null”:跨源请求仅限于 支持协议方案:http、数据、chrome、chrome扩展、, chrome不受信任,https。“ 以下是ajax调用:Javascript Spring引导注释@CrossOrigin未停止CORS错误,javascript,ajax,spring,spring-boot,cors,Javascript,Ajax,Spring,Spring Boot,Cors,无论我尝试什么,我都会继续得到错误: “在中访问XMLHttpRequest” 'file:///C:/api/v1/backtest?{%22sma{U名称%22:%22sma“}”来自源 CORS策略已阻止“null”:跨源请求仅限于 支持协议方案:http、数据、chrome、chrome扩展、, chrome不受信任,https。“ 以下是ajax调用: var inputs = {}; inputs.strategy_name = strategy_na
var inputs = {};
inputs.strategy_name = strategy_name;
inputs.start_date = document.getElementById("start_date").value;
inputs.end_date = document.getElementById("end_date").value;
inputs.formula = document.getElementById("formula").value;
inputs.symbol = document.getElementById("backtest_symbol").value
inputs.benchmark_symbol = document.getElementById("benchmark_symbol").value
let jsonStrategyInputs = JSON.stringify(inputs);
console.log("jsonStrategyInputs=",jsonStrategyInputs);
$.ajax({
type : "GET",
contentType : "application/json",
datatype : "json",
url : "/api/v1/backtest",
data : jsonStrategyInputs,
success : function(data){
//do a bunch of business logic
},
error: function(e) {
alert('Error: '+e);
}
});
以下是Spring引导控制器代码:
@CrossOrigin(origins = "*")
@RestController
@RequestMapping(path="/api/v1")
public class StrategyController {
@Autowired
private StrategyService strategyService;
@GetMapping(value = "/backtest")
@ResponseBody
public JsonResponse backtestStrategy(@RequestBody BacktestInputs inputs, BindingResult result) throws Exception {
bla bla
}
这是一个值得注意的异常。因此我将此类添加到项目中:
@Component
public class SimpleCORSFilter implements Filter {
@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", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
response.setHeader("Access-Control-Expose-Headers", "Location");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
同样的错误。我尝试过无数类似帖子答案的组合,但仍然没有成功。回到专家那里。有什么建议吗
需要注意的是,使用jquery方法调用类似的控制器效果很好,如下所示:
function loadWatchlist() {
$.getJSON("http://localhost:8080/api/v1/watchlist?name=My%20Portfolio", function (data) {
data.forEach(function (item) {
console.log(item.watchlistId.symbol);
});
}
编辑
有趣的是,如果我单击浏览器控制台中的链接,它会显示“在请求目标[/api/v1/backtest?{%22strategy\u名称%22:%22sma交叉和极端hi-lo%22,%22start\u日期%22:%221928-12-30%22,%22end\u日期%22:%222020-06-19%22,%22formula%22:%22LET%20InitialBuyStop=StopLoss(InitialBuy,H)\nLET%20TrailingBuyStop=StopLoss(TrailingBuy,5%)\nLET%20InitialSellStop=StopLoss(InitialSell,L);\nLET%20TrailingSellStop=StopLoss(TrailingSell,5%)\nLET%20CrossOversMa200=C(1)%3CSMA(200,1)%20和%20C%3CSMA(200)\nLET%20UpperEnvch=C%3EEnvCh(200,20)。Upper\nLET%20CrossBelowerEnvch=C%3EEnvCh(200,20).Lower\nLET%20YesterdayWasOut=位置(1)=0\nLET%20YesterdayWasIn=位置(1)=1\nLET%20HitBuyStop=C%3EBuyStop\nLET%20HitselStop=C%3SellStop\nIF(交叉点SMA200)%20然后%20BUY\nIF(交叉点SMA200)%20然后%20SELL\nIF(交叉点上方%20和%20DnBar%20和%20YesterdayWasIn)%20然后%20SellStop\nIF(高于上表%20和%20 HitBuyStop%20和%20昨天WasOut)%20然后%20 Buy和SetStops\nIF(低于下表%20和%20昨天WasOut%20和%20 UpBar)%20然后%20 Buy和SetSellStop\nIF(低于下表%20和%20昨天WasIn%20和%20 HitSellStop)%20然后%20 EllandResetStops\nIF(TrailingBuyStop%3CBuyStop)%20然后%20 Buy Stop=TrailingBuyStop\nIF(TrailingSellStop%3ESellStop)%20然后%20SellStop=TrailingSellStop%22,%22symbol%22:%22SPP-500%22,%22benchmark\u symbol%22:%22SP-500%22]”
似乎只有url编码空格,而不是5%中的{}、()、'='、'-'或'%'可能是我不应该使用JSON.stringify(输入)?我还在这篇文章中的ajax调用上方添加了更多相关信息。您得到的错误是由您的Chrome浏览器引起的,因此后端的
@CorssOrigin
没有用。
这是因为ajax代码试图访问您自己的本地资源。
为了避免这种情况,您需要在执行Chrome浏览器时添加一些选项。
下面是一个在Windows上执行Chrome的示例
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:\Users\ユーザ名\Local\Google\Chrome\User Data"
似乎ajax请求并没有使用有效的url发送到服务器(file:///C:/api/v1/backtest?...).不应该是
http://localhost:8080/api/v1/backtest.....
?您是否尝试过显式指定url?我尝试过,但出现了相同的错误。我可以直接调用后端,它可以正常工作。从前端调用失败。此外,使用$.getJSON也可以正常工作。ajax调用与此不同。您可以清楚地看到,他的intent将调用后端服务器,而不是从磁盘读取文件。为了避免这种情况,他不需要禁用chrome中的所有web安全。他需要确保他的angular应用程序正确配置为将请求发送到http://localhost:8080
而不是file:///C:/
。几乎不应该禁用所有web安全性完成,即使它仅用于本地开发。我将uri更改为“”,而不是“/api/v1/backtest”,但结果是相同的。调用它的索引文件是“file:///C:/Users/Greg/Projects/moneymachine/src/main/resources/static/index.html“。这不是一个角度的项目。