当前位置: 首页 > 知识库问答 >
问题:

无法在Google app engine中处理跨域json请求并在json中获得响应

奚飞星
2023-03-14

XMLHttpRequest无法加载http://xxxxxxxx.com/getproduct.html。请求的资源上没有“访问-控制-允许-来源”标头。因此,不允许访问来源'http://example.com'。

<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>
@RequestMapping("/getProductDetailsForReview.html")
    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;
    }
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>

共有1个答案

常飞翼
2023-03-14
<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>
@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;
    }

将适当的CORS过滤器、稍加修改的Ajax调用和修改后的服务器映射三者结合起来,您将使它最好地正常工作

在更新中反思您的评论。Spring MVC使用内容协商来推理响应内容类型,后缀优先于其他选项。我想这是你的问题,看看

http://spring.io/blog/2013/05/11/content-negotiation-using-spring-MVC

也就是说,尝试将favorPathExtension=“false”属性添加到Spring MVC配置中,

 <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
...
        <property name="favorPathExtension" value="false" />
...
</bean>

让我知道它是怎么锻炼的

 类似资料:
  • 问题内容: 题: 我正在尝试使用JSON跨域,但是我发现的只是JSON解析器,我不需要… 我已经读到可以使用JSON进行跨域请求,但是到目前为止,我所看到的是使用XMLHttpRequest的实现…- 这意味着您不能使用跨域请求,至少不能在IE 8之外使用… 我去过http://www.json.org/,但是我发现了所有这些是解析器还是没用。 到目前为止,我在google上发现的最好的是 htt

  • 问题内容: 进行Ajax调用时,将contentType设置为application / json而不是默认的x-www-form- urlencoded时,服务器端(在PHP中)无法获取post参数。 在以下工作示例中,如果我在ajax请求中将contentType设置为“ application / json”,则PHP $ _POST将为空。为什么会这样?我如何在PHP中正确处理conten

  • 因此,我有以下内容,这似乎令人难以置信的骇客,我一直在想,Go有比这更好的设计库,但我找不到Go处理JSON数据POST请求的例子。它们都是表格帖子。 下面是一个示例请求: 下面是嵌入日志的代码: 肯定有更好的办法,对吧?我只是很难找到最好的做法。 对搜索引擎来说,Go也被称为Golang,这里提到了它,这样其他人就可以找到它。)

  • 问题内容: 因此,我得到了以下内容,这些内容似乎难以置信,我一直在想自己Go的库设计得比此更好,但是我找不到Go处理JSON数据POST请求的示例。它们都是POST形式。 这是一个示例请求: 这是代码,其中嵌入了日志: 必须有更好的方法,对吗?我只是为寻找最佳实践而感到困惑。 (Go在搜索引擎中也被称为Golang,在这里提到它,以便其他人可以找到它。) 问题答案: 请使用代替。

  • 问题内容: 进行Ajax调用时,将contentType设置为application / json而不是默认的x-www-form- urlencoded时,服务器端(在PHP中)无法获取post参数。 在以下工作示例中,如果我在ajax请求中将contentType设置为“ application / json”,则PHP $ _POST将为空。为什么会这样?如何在PHP中正确处理content

  • 问题内容: 我已经在互联网上进行了一些研究,但没有设法获得有关该主题的完整图片。任何人都可以暂时解决这个问题吗? 这是我到目前为止发现的: 可以使用jsonp进行跨域调用。禁止在jsonp调用中更改标头 如果服务器允许,则可以使用json进行跨域调用。 这就是我想要做的: 这是正在发生的事情: 当myJSonServer在同一域上时,完全没有问题 当myJSonServer在另一个域上时,将发送请