在所请求的资源上没有“Access-Control-Allow-Origin”头。 [英] No 'Access-Control-Allow-Origin' header is present on the requested resource.
问题描述
我使用SpringMVC.我想调用一个XML文件与Web服务为了解析它以后。问题是,我无法访问XML文件,我有这个错误:没有访问控制-Allow-Origin'头部存在于请求的资源上。我尝试了以下解决方案:
我创建了一个新类,目的是添加Access- - 请求的ressource上的-Origin头。这是类
package com.mycompany.myapp;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JsonpFilter implements Filter {
private String functionName;
@Override
public void destroy(){
}
@Override
public void doFilter(ServletRequest request, ServletResponse servletResponse,
FilterChain chain)throws IOException,ServletException {
if(!(request instanceof HttpServletRequest)){
throw new ServletException(This filter can
+只处理HttpServletRequest请求);
}
HttpServletRequest httpRequest =(HttpServletRequest)request;
HttpServletResponse response =(HttpServletResponse)servletResponse;
if(isJSONPRequest(httpRequest)){
ServletOutputStream out = response.getOutputStream();
out.println(getCallbackMethod(httpRequest)+();
chain.doFilter(request,response);
out.println(););
response.setContentType(text / javascript);
} else {
response.addHeader(Access-Control-Allow-Origin,*);
chain.doFilter(request,response);
}
}
@Override
public void init(FilterConfig filterConfig)throws ServletException {
this.functionName = filterConfig.getInitParameter encoding);
if(this.functionName == null || this.functionName.length()< = 0){
this.functionName =callback;
}
}
private String getCallbackMethod(HttpServletRequest httpRequest){
return httpRequest.getParameter(this.functionName);
}
private boolean isJSONPRequest(HttpServletRequest httpRequest){
String callbackMethod = getCallbackMethod(httpRequest);
return(callbackMethod!= null&& callbackMethod.length()> 0);
}
}
<然后在我的web.xml文件中添加这两行:
< display-name> DataServices< / display-name> ;
< filter>
< filter-name> JSONPRequestFilter< / filter-name>
< filter-class> com.mycompany.myapp.JsonpFilter< / filter-class>
< init-param>
< param-name> functionName< / param-name>
< param-value> callback< / param-value>
< / init-param>
< / filter>
< filter-mapping>
< filter-name> JSONPRequestFilter< / filter-name>
< url-pattern> / *< / url-pattern>
< / filter-mapping>
我没有任何编译问题,但我仍然有同样的错误在控制台执行时间。所以,不考虑'Access-Control-Allow-Origin'头。
如果你能找到我的程序有什么问题,或者建议我另一个解决方案,我会非常感谢。
要实现此接口
org.springframework.web.servlet.HandlerInterceptor
< blockquote>
这里是一个例子
@Component
public class CORSInterceptor实现HandlerInterceptor {
private static final Log LOG = LogFactory.getLog(CORSInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest请求,HttpServletResponse响应,对象处理程序)throws异常{
LOG.trace(sending headers);
response.setHeader(Access-Control-Allow-Origin,*);
response.setHeader(Access-Control-Allow-Methods,POST,GET,PUT,DELETE);
response.setHeader(Access-Control-Max-Age,3600);
response.setHeader(Access-Control-Allow-Headers,x-requested-with);
return true;
}
@Override
public void postHandle(HttpServletRequest请求,HttpServletResponse响应,对象处理程序,ModelAndView modelAndView)
throws异常{
}
@Override
public void afterCompletion(HttpServletRequest请求,HttpServletResponse响应,对象处理程序,异常ex)
throws异常{
LOG.trace(afterCompletion被调用);
}
}
上下文
< mvc:interceptors>
< bean class =com.elm.mb.rest.interceptors.CORSInterceptor/>
< / mvc:interceptors>
I'm using SpringMVC.I want to call an XML file with web service in order to parse it later.The problem is that I can't access the XML file, I have got this error:No 'Access-Control-Allow-Origin' header is present on the requested resource.I have tried the solution below:
I created a new class which purpose is to add Access-Control-Allow-Origin' header on the requested ressource.This is the class
package com.mycompany.myapp; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class JsonpFilter implements Filter { private String functionName; @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { if (!(request instanceof HttpServletRequest)) { throw new ServletException("This filter can " + " only process HttpServletRequest requests"); } HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse response = (HttpServletResponse) servletResponse; if (isJSONPRequest(httpRequest)) { ServletOutputStream out = response.getOutputStream(); out.println(getCallbackMethod(httpRequest) + "("); chain.doFilter(request, response); out.println(");"); response.setContentType("text/javascript"); } else { response.addHeader("Access-Control-Allow-Origin", "*"); chain.doFilter(request, response); } } @Override public void init(FilterConfig filterConfig) throws ServletException { this.functionName = filterConfig.getInitParameter("encoding"); if(this.functionName == null || this.functionName.length() <= 0) { this.functionName = "callback"; } } private String getCallbackMethod(HttpServletRequest httpRequest) { return httpRequest.getParameter(this.functionName); } private boolean isJSONPRequest(HttpServletRequest httpRequest) { String callbackMethod = getCallbackMethod(httpRequest); return (callbackMethod != null && callbackMethod.length() > 0); }
}
then I add the these two lines in my web.xml file:
<display-name>DataServices</display-name> <filter> <filter-name>JSONPRequestFilter</filter-name> <filter-class> com.mycompany.myapp.JsonpFilter</filter-class> <init-param> <param-name>functionName</param-name> <param-value>callback</param-value> </init-param> </filter> <filter-mapping> <filter-name>JSONPRequestFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
I don't have any complilation problem, but I still have the same error in the console at the execution time.So, the 'Access-Control-Allow-Origin' header isn't taken into account. Please,If you can find out what is wrong with my program, or suggest me another solution, I will be thankful
解决方案To do this implement this interface
org.springframework.web.servlet.HandlerInterceptor
here is an example
@Component public class CORSInterceptor implements HandlerInterceptor{ private static final Log LOG = LogFactory.getLog(CORSInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { LOG.trace("sending headers"); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { LOG.trace("afterCompletion is called"); } }
Then add this line to your application context
<mvc:interceptors> <bean class="com.elm.mb.rest.interceptors.CORSInterceptor" /> </mvc:interceptors>
这篇关于在所请求的资源上没有“Access-Control-Allow-Origin”头。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!