1. 程式人生 > >Angularjs cors 用get、post方法與springmvc後傳遞json資料的配置

Angularjs cors 用get、post方法與springmvc後傳遞json資料的配置

首先介紹跨域問題,基於安全的考慮,頁面只有在同一個域名下,交流資料,比如網易就不能申請百度的服務(抓取網頁那是另外的技術),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"; } }