Angularjs cors 用get、post方法與springmvc後傳遞json資料的配置
阿新 • • 發佈:2019-02-04
首先介紹跨域問題,基於安全的考慮,頁面只有在同一個域名下,交流資料,比如網易就不能申請百度的服務(抓取網頁那是另外的技術),ajax也是這個使用範圍,跨域就失效了。
在移動開發中,手機本身就是web站點,後臺pc伺服器是另外一個web站點。這樣就存在跨域問題。
早先用jsonp方法,或者在srpingmvc中設定攔截器來解決跨域傳遞json格式資料,但這些都過時了。
下面是最新的。注意只有spring4.3以上(包含4.3)才有效。
1.後臺增加3個json的jar包,如下:
jackson-databind
jackson-core
jackson-annotations
附上maven配置,一看就懂了 <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.5</version>
</dependency>
2.後臺設定,springmvc,中只要在類上設定一個註解@CrossOrigin,那麼這個類就可以接受跨域申請。注意只有spring4.3以上(包含4.3)才支援註解@CrossOrigin,這點很多文章沒提到。@CrossOrigin
的具體只接受某個域名的配置自己去網上查幫助。預設是允許所有域名訪問。
具體的程式碼如下,
@CrossOrigin( maxAge = 3600)//配置這裡就行了
@Controller
@RequestMapping("/personController")
public class PersonController {
//篇幅有限內容掏空了,最後由完成程式碼
}
3. 在返回json資料的方法上加註解:@ResponseBody (一般用於後臺發達前端的 json資料)
@RequestMapping(value="getjsonp/{id}",method=RequestMethod.GET)
@ResponseBody
public Collection getjson(@PathVariable("id") Integer id,String callback) throws Exception{
}
4.在獲取json資料的引數上加註解:@RequestBody (一般有用前端傳遞到後臺的json資料)
@RequestMapping(value="postjson",method=RequestMethod.POST)
public String postjson(@RequestBody Person p) throws Exception{
}
附上後臺接受方法,請注意後臺方法直接反java型別就ok,系統會自動轉成json格式
剩下的就是客戶程式碼:下面演示了post和get方法,其中get部分去掉註釋就可以了。我這裡是為方便測試。
< scripttype="text/javascript">
varapp=angular.module("myApp",[]);
app.controller('firstController',function($scope,$http)
{
//$scope.xx="xyz";
// $http.get('http://localhost:8080/SSM1/personController/getjsonp/100').success(function (data, status, headers,
config){
// console.log(data);
// console.log(status);
// console.log(headers);
// console.log(config);
// }
//
// ).error(function (data, status, headers, config) {
// console.log(data);
// console.log(status);
// console.log(headers);
// console.log(config);
//
// })
$http({
url:'http://localhost:8080/SSM1/personController/postjsonp',
method:'POST',
data:
{id:1,name:'美國',age:16}
}).success(function(){
console.log("success!");
}).error(function(){
console.log("error");
})
});
</script>
最後附上後臺完整方法:
@CrossOrigin( maxAge = 3600)
@Controller
@RequestMapping("/personController")
public class PersonController {
//獲取前端發出的get請求,前端程式碼要開啟註解
@RequestMapping(value="getjson/{id}",method=RequestMethod.GET)
@ResponseBody
public Collection getjson(@PathVariable("id") Integer id,String callback) throws Exception{
Person p1= new Person(1,"aa",30);
Person p2= new Person(2,"bbb",50);
HashMap ps = new HashMap<Integer, Person>();
ps.put(1, p1);
ps.put(2, p2);
System.out.println(id.toString());
System.out.println(callback);
System.out.println("new Person p");
return ps.values();
}
//獲取前端發出的post請求
@RequestMapping(value="postjson",method=RequestMethod.POST)
public String postjson(@RequestBody Person p) throws Exception{
System.out.println("id:"+p.getId());
System.out.println("name:"+p.getName());
System.out.println("age:"+p.getAge());
return "ok";
}
}
jackson-core
jackson-annotations
附上maven配置,一看就懂了 <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.5</version>
</dependency>