Java 如何使用SpringREST在跨源资源共享(CORS)中接收JSON数据

Java 如何使用SpringREST在跨源资源共享(CORS)中接收JSON数据,java,json,spring,rest,cors,Java,Json,Spring,Rest,Cors,我正在尝试从项目中的控制器类发送/接收JSON数据 我的项目的控制器类如下所示: @RequestMapping(value = "/dummy/",method = RequestMethod.POST,headers="Accept=application/json") public Response getDummyJSON() { /* Method 2: Getting the Dummy JSON Data From file and sending it as an J

我正在尝试从项目中的控制器类发送/接收JSON数据

我的项目的控制器类如下所示:

@RequestMapping(value = "/dummy/",method = RequestMethod.POST,headers="Accept=application/json")
public Response getDummyJSON() {

    /*  Method 2: Getting the Dummy JSON Data From file and sending it as an JSON Object  */

    JSONParser parser = new JSONParser();
    JSONObject jsonObject = null;
    try {

        Object obj = parser.parse(new FileReader("d:\\JsonStruc.json"));
        jsonObject = (JSONObject) obj;

    } catch (Exception e) {
        System.out.println("Error Parsing: - ");
    }   


        return Response.status(200).entity(jsonObject).build();             

}

@RequestMapping(value = "/insert/dummy/",method= RequestMethod.POST,headers="Accept=application/json")
public Response setDummyJSON(@RequestBody JSONObject inputjsonObj){

    /*Step 1: Display The JSON data sent by AngularJS */ 
    System.out.println("Data Received:"+ inputjsonObj.toString());
    JSONParser jsonparser = new JSONParser();
    ContainerFactory containerFactory = new ContainerFactory(){
        public List creatArrayContainer() {
            return new LinkedList();
        }

        public Map createObjectContainer() {
            return new LinkedHashMap();
        }

    };

    Map obj = (Map)inputjsonObj;
    Iterator iter = obj.entrySet().iterator();
    while(iter.hasNext()){
        Map.Entry entry = (Map.Entry)iter.next();
        System.out.println(entry.getKey() + "=>" + entry.getValue());

    }

    /* Step 2: send the next dummy JSON file */
    JSONParser parser = new JSONParser();
    JSONObject jsonObject1 = null;
    try {

        Object obj1 = parser.parse(new FileReader("d:\\JsonStruc1.json"));
        jsonObject1 = (JSONObject) obj1;

    } catch (Exception e) {
        System.out.println("Error Parsing: - ");
    }   
    return Response.status(200).entity(jsonObject1).build();          
 }  
我的项目的CORS等级如下:

public class CorsFilter extends OncePerRequestFilter{

 private Properties prop = new Properties();

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
            throws ServletException, IOException {


         System.out.println("Inside Cross Origin Resource Sharing Filter Class");
         System.out.println(request.getContentType());
         System.out.println(request.getContentLength());

         response.setHeader("Access-Control-Allow-Origin", "*");
         response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD, PUT");
         response.setHeader("Access-Control-Max-Age", "3600");
         response.setHeader("Access-Control-Allow-Credentials", "true");
         response.setHeader("Access-Control-Allow-Headers", "x-requested-with");

         filterChain.doFilter(request, response);
    }

}
通过URL/service/question/Dummy/But发送伪JSON数据没有问题 当我试图获取JSON数据/service/question/insert/dummy/并发送下一个JSON对象时 通过方法setDummyJSON。。。。那我就有麻烦了。AngularJS客户端显示以下异常消息:

跨源请求被阻止:同源策略不允许在/FetchQuestions/service/question/insert/dummy/读取远程资源。这可以通过将资源移动到同一域或启用CORS来解决

在使用JSON字符串作为内容体从localhost调用URL/service/question/insert/dummy/时,将抛出以下错误消息:

服务器拒绝了此请求,因为请求实体的格式不受请求方法的请求资源的支持

我做错了什么?任何帮助都将不胜感激。谢谢。

以上代码没有问题

出于某种原因,每当使用以下命令在AngularJSClient端将内容类型设置为application/json时:

$httpProvider.defaults.headers.post['Content-Type']='application/json'

服务器端收到的内容类型为null。任何其他内容类型(如application/x-www-form-urlencoded或text/plain)都可以工作,但问题只出现在application/json上,即使AngularJS正在向服务器端发送json数据

因此,控制器类中的一点更改就解决了这个问题

@RequestMapping(value = "/insert/dummy/",method= RequestMethod.POST")
public Response setDummyJSON(@RequestBody String inputjsonObj){
/* Step1: Receive The Data in Text/Plain Format
   Step2: Conver The String To JSON Object. Do Necessary Processing.
   Step3: Return Dummy JSON Object through the Response. */
  return Response.status(200).entity(jsonObject1).build();
}

我不明白你为什么需要一个拦截器,我只需要一个corsFilter。你能澄清一下我在解释/添加stacktrace时遇到的问题吗?@RC:我已经从项目中删除了拦截器类,也删除了rest-servlet.xml中的映射,不管怎样,从客户端AngularJS调用URL/service/question/insert/dummy/时,它会给出CORS异常。@RC:从客户端添加异常消息。我会尝试将内容类型添加到允许的标题列表Access Control Allow Header,并确保CorsFilter在web中正确映射。xml@RC. : CorsFilter在web.xml中正确映射,如何将内容类型添加到允许的标题列表中?