Java 如何使用SpringREST在跨源资源共享(CORS)中接收JSON数据
我正在尝试从项目中的控制器类发送/接收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
@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中正确映射,如何将内容类型添加到允许的标题列表中?