I want to access information from same domain but with different port number, To allow this I am adding Access-Control-Allow-Origin
with the response header.
Servlet Code:(present on www.example.com:PORT_NUMBER)
String json = new Gson().toJson(list);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setHeader("Access-Control-Allow-Origin", "*");//cross domain request/CORS
response.getWriter().write(json);
jQuery code:(present on www.example.com)
$.post('http://www.example.com:PORT_NUMBER/MYSERVLET',{MyParam: 'value'}).done(function(data)
{
alert(data);
});
Several times I am getting this error(in console):
XMLHttpRequest cannot load 'http://www.example.com:PORT_NUMBER/MYSERVLET'
No 'Access-Control-Allow-Origin' header is present on the requested resource.
This error mostly occures first time when $.post
gets executed. Second time it allows.
My question is that is there missing in servlet
or in jQuery
code?
Any suggestion will be appreciated.
Update1
I have changed:
response.setHeader("Access-Control-Allow-Origin", "*");
To:
response.setHeader("Access-Control-Allow-Origin", "http://www.example.com");
Then I am getting this error in console:
XMLHttpRequest cannot load http://www.example.com:PORT_NUMBER/MyServletName
The 'Access-Control-Allow-Origin' whitelists only 'http://www.example.com'
Origin 'http://www.example.com' is not in the list,
and is therefore not allowed access.
[Note: whitelist and origin are same, but still it gives error. It works sometimes, and gives above error sometimes.]
Let me know if you need anymore information.
This question is related to
javascript
java
jquery
ajax
cors
On your servlet simply override the service method of your servlet so that you can add headers for all your http methods (POST, GET, DELETE, PUT, etc...).
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
if(("http://www.example.com").equals(req.getHeader("origin"))){
res.setHeader("Access-Control-Allow-Origin", req.getHeader("origin"));
res.setHeader("Access-Control-Allow-Headers", "Authorization");
}
super.service(req, res);
}
You are missing 'json' dataType in the $.post()
method:
$.post('http://www.example.com:PORT_NUMBER/MYSERVLET',{MyParam: 'value'})
.done(function(data){
alert(data);
}, "json");
//-^^^^^^-------here
Updates:
try with this:
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
I find the solution in spring.io,like this:
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
Source: Stackoverflow.com