'Cross origin blocked between Ajax and Spring Controller

I want a Javascript function to send data to a Spring controller and get a response. However, due to the strict-origin-when-cross-origin Referrer policy, the request does not go through.

Spring Controller :

@Controller
public class EventController {

@ResponseBody
@RequestMapping(value = "/event", method = RequestMethod.POST)
public String handleAjax(@RequestParam Integer id, HttpServletRequest request, HttpServletResponse response) {

    response.setHeader("Access-Control-Allow-Origin", "*");

    return "OK";

}
}

Javascript functions :

function getContextPath() {
return window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
}  

function move(moveDir,velocity){
$.ajax({
    type : "POST",
    url : getContextPath()  + "/event",
    success: function(data){
        console.log(data)
    }
});
}

I know that I have to allow cross-origin for these files. So far, the things I tried didn't work. List of what I tried :

-> Adding @CrossOrigin(origins = "http://localhost:8081", maxAge = 3600) to the controller

-> Adding response.setHeader("Access-Control-Allow-Origin", "*"); to the controller

-> Adding crossorigin="anonymous" to the Javascript <script> tag



Solution 1:[1]

I finally got it. There were two problems.

The first was that I had to add that header to the ajax request, to allow the request to be handled by the server: headers: { 'Access-Control-Allow-Origin': '/path_to_request_target' },. Putting '*' instead of '/path_to_request_target' would also work.

The second was with my dispatcher servlet. I had to put .html at the end of the URL : url : getContextPath() + "/event.html",. This is due of the mapping of my dispatcher servlet :

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

Adding .html to the URL worked because of <url-pattern>*.html</url-pattern>. Adding a <url-pattern> that satisfied the format of the inital URL would also work.

Solution 2:[2]

Your code won't work because you specify to support POST method only

@RequestMapping(value = "/event", method = RequestMethod.POST)

OPTIONS method is required as Preflighted requests in CORS.

So you must support POST and OPTIONS also to make it work.

@RequestMapping(value = "/event")
@RequestMapping(value = "/event", method = { RequestMethod.POST, RequestMethod.OPTIONS })

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 nico263nico
Solution 2 Huy Nguyen