无法在Google app engine中处理跨域json请求并获取json响应
无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许“源”访问 我的客户端jsp代码:无法在Google app engine中处理跨域json请求并获取json响应,json,spring,spring-mvc,google-app-engine,Json,Spring,Spring Mvc,Google App Engine,无法加载XMLHttpRequest。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许“源”访问 我的客户端jsp代码: <script type="text/javascript" src="Jquery.js"></script> <script> function submitLogin() { var obj = { "productMasterId" :
<script type="text/javascript" src="Jquery.js"></script>
<script>
function submitLogin() {
var obj = {
"productMasterId" : "1"
};
$.ajax({
url: "http://XXXXXXXX.com/getProduct.html",
type: 'POST',
contentType: 'text/javascript; charset=utf-8',
crossDomain : true,
mimeType: 'text/javascript',
success : function(response) {
alert("done");
alert(response);
}
,
error : function(response) {
}
});
}
</script>
<a href="javascript:submitLogin()">click </a>
CORS过滤器:
package com.bullbeardevice.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
/**
* Servlet Filter implementation class SimpleCORSFilter
*/
@Component
public class SimpleCORSFilter implements Filter {
/**
* Default constructor.
*/
public SimpleCORSFilter() {
// TODO Auto-generated constructor stub
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
System.out.println("In CORS Filter");
HttpServletResponse response = (HttpServletResponse) res;
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");
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
答复:
Remote Address:127.0.0.1:8888
Request URL:http://localhost:8888/getProductDetailsForReview.html
Request Method:POST
Status Code:415 Unsupported Media Type
Request Headersview source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip,deflate
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:23
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Host:localhost:8888
Origin:http://localhost:8080
Referer:http://localhost:8080/samplekit/jsp/index.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Form Dataview sourceview URL encoded
{"productMasterId":"1"}:
Response Headersview source
Access-Control-Allow-Headers:application/javascript
Access-Control-Allow-Methods:POST, GET, OPTIONS, DELETE
Access-Control-Allow-Origin:*
Access-Control-Max-Age:3600
Cache-Control:no-cache
Cache-Control:no-store
Content-Length:83
Content-Type:text/html; charset=iso-8859-1
Date:Wed, 15 Oct 2014 07:09:48 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Pragma:no-cache
Server:Development/1.0
Spring xml配置:
<context:component-scan base-package="com.bull.*" />
<context:annotation-config />
<bean id="multipartResolver" class="org.gmr.web.multipart.GMultipartResolver">
<property name="maxUploadSize" value="1048576" />
</bean>
<bean id="viewResolver2"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass">
<value>
org.springframework.web.servlet.view.tiles2.TilesView
</value>
</property>
</bean>
<bean id="tilesConfigurer"
class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles.xml</value>
</list>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="ApplicationResources" />
</bean>
<mvc:annotation-driven
content-negotiation-manager="contentNegotiationManager" />
<!-- Configure bean to convert JSON to POJO and vice versa -->
<bean id="jsonMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</bean>
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonMessageConverter" />
</list>
</property>
</bean>
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="ApplicationResources" />
</bean>
<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="defaultContentType" value="application/json" />
<property name="favorPathExtension" value="false" />
</bean>
</beans>
嗯,我想说的是,有一些信息丢失了,但我只是想尽力帮忙。几乎没有什么事情会出错。从最明显的 您的请求是目标,但您的映射是/getProductDetailsForReview.html,但我认为这是一个输入错误。您在评论中提到的问题很可能是由于响应中的内容类型错误造成的 假设您正在使用CORS过滤器,例如在接受的答案中建议的过滤器。以下方法将起作用
<script>
function submitLogin() {
var obj = {
"productMasterId": "1"
};
$.ajax({
url: "http://XXXXXXXX.com/getProductDetailsForReview",
type: 'POST',
crossDomain: true,
success: function (response) {
alert("done");
alert(response);
},
error: function (response) {
alert(response);
}
});
}
</script>
<a href="javascript:submitLogin()">click </a>
将这三者结合起来,适当的CORS过滤器、稍加修改的Ajax调用和修改的服务器映射,您将使其正常工作,
最好的
在更新中反映您的评论。SpringMVC使用内容协商来确定响应内容类型,后缀优先于其他选项。我认为这是你的问题,看看
也就是说,尝试将favorPathExtension=false属性添加到Spring MVC配置中
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
...
<property name="favorPathExtension" value="false" />
...
</bean>
让我知道它是如何运行的问题在于我在控制器的方法参数中使用了@RequestBody。现在我已经用@requestparam替换了它,它工作正常。如果我使用CORS并定义一个过滤器,并将响应头设置为response.setHeaderAccess-Control-Allow-Origin,*然后我得到了GET 415不支持的媒体类型我的请求到达了filterI无法从我的操作/getProductDetailsForReview中删除html,因为我在web.xml中的dispatcher servlet url模式中给出了*.html。我还用CORS过滤器更新了我的问题。我用我能在浏览器中看到的请求和响应标题更新了我的问题。请查收。我可以看出,在响应头中,我得到的内容类型是text/html,我希望得到json。也许这就是问题所在。请指出这正是问题所在,最有可能的原因是,您能否将spring mvc配置的XML粘贴到我遇到的链接上,即它是否也适用于GAE。我已经编辑了我的问题。根据你所写的一切,CORS已经在为你工作了。检查您发布的标题,请求接受application/json,但响应提供text/html,这就是您获得415不支持的媒体类型的原因。您在响应中获得此contentType的原因是“因为您的请求有.html作为后缀,所以Spring MVC推断响应类型应该是text/html。在您的contentNegotionManager bean中设置以下选项,我敢打赌这些东西会开始工作:
@RequestMapping("/getProductDetailsForReview")
public @ResponseBody PaymentForm getProductDetailsForReview(@RequestBody PaymentForm paymentForm, HttpServletResponse response) {
log.debug("Start of method getProductDetailsForReview");
PaymentForm form = userPaymentService.getProductForReview(paymentForm);
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
log.debug("End of method getProductDetailsForReview");
return form;
}
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
...
<property name="favorPathExtension" value="false" />
...
</bean>