Javascript Spring引导注释@CrossOrigin未停止CORS错误

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

无论我尝试什么,我都会继续得到错误:

“在中访问XMLHttpRequest” 'file:///C:/api/v1/backtest?{%22sma{U名称%22:%22sma“}”来自源 CORS策略已阻止“null”:跨源请求仅限于 支持协议方案:http、数据、chrome、chrome扩展、, chrome不受信任,https。“

以下是ajax调用:

        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“。这不是一个角度的项目。