1. 程式人生 > >SSM環境shiro跨域AJAX許可權管理,資料請求

SSM環境shiro跨域AJAX許可權管理,資料請求

首先,專案環境是用:

Java後端:Myeclipse10

後端採用框架:ssm,沒有用到mevan管理jar包

實行前後分離開發模式,通過api介面向前端傳遞資料

web前端:HTML5

首先跨域問題,重寫過濾器FilterdoFilter()方法

   @Override

   public void doFilter(ServletRequest request,ServletResponse response,

          FilterChain chain) throws IOException, ServletException {

//    HttpServletResponseres=(HttpServletResponse)response;

//    res.setContentType("text/html;charset=UTF-8");

//    res.setHeader("Access-Control-Allow-Origin","*");

//    res.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE");

//    res.setHeader("Access-Control-Max-Age","86400");

//    res.setHeader("Access-Control-Allow-Headers","Origin,No-Cache,X-Requested-With,If-Modified-Since,Pragma

,Last-Modified,Cache-Control,Expires,Content-Type,X-E4M-With,userId,token");

//    res.setHeader("Access-Control-Allow-Credentials","true");

//    res.setHeader("XDomainRequestAllowed","1");

//    chain.doFilter(request, response);

       HttpServletResponse httpServletResponse = (HttpServletResponse) response;

          httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");

          httpServletResponse.setHeader("Access-Control-Allow-Headers", "accept,content-type");

          httpServletResponse.setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST,DELETE,PUT");

          chain.doFilter(request, httpServletResponse);

   }

Web.xml配置中加上

    <filter>

    <filter-name>cors</filter-name>

    <filter-class>main.java.com.skyi.ietm.common.base.CorsFilter</filter-class>

  </filter>

  <filter-mapping>

    <filter-name>cors</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

配置完成之後ajax就可以跨域請求資料了

然後是shiro許可權管理框架的搭建

匯入相關的shiro  jar包

加入shiro.xml配置檔案

加入shiro的基礎bean

然後是ajax請求的許可權管理問題

$.ajax({
    type: "GET",
    url: "http://localhost:8080/IETMSL/user/login",
    data: "userName=admin&pwd=123",
    //dataType: 'json',
    dataType: 'JSONP',
    jsonp:"jsonpCallback",
    jsonpCallback:" callback",
    success: function(msg){
         alert(6666);
    }
});

Ajax請求中的dataType引數使用JSONP

dataType: 'JSONP',

解決了跨域ajax請求的許可權管理問題

現在還有一個問題,jsonp跟json其實是個東西來的,後臺直接返回json資料的話,jsonp

是無法正確獲取的,需要把返回的json資料進行包裝

如:

callback({"data":{"stuNumber":"109074350","Username":"zhuxian","password":"123456"},"message":"登入成功","status":"OK"}) 

這裡參考文章如下:

java程式碼:

try{

res.setContentType("text/plain");

res.setCharacterEncoding("utf-8");

res.setHeader("Pragma", "No-cache");  

       res.setHeader("Cache-Control","no-cache");  

       res.setDateHeader("Expires",0);  

String jsonpCallBack = req.getParameter("callback");

HashMap map = new HashMap();

map.put("Username", "zhuxian");

map.put("password", "123456");

map.put("stuNumber", "109074350");

ResultInfo result = new ResultInfo();

PrintWriter out = res.getWriter();

result.setStatus("OK");

result.setData(map);

result.setMessage("登入成功");

toResultPrint(jsonpCallBack, result, out);

}catch(Exception e){

e.printStackTrace();

}

js程式碼:

先寫一個common.js用來存放一些通用的方法和一些常量

var classPath='http://121.42.45.17:8080/messageBox/';

 //將form表單轉化為json

    function serializeJson(frmId) {

      var jsonStr = '{';

      $($('#' +frmId).serializeArray()).each(function() {

      jsonStr += '\''+this.name + '\':\'' +this.value + '\',';

      });

      jsonStr = jsonStr.substring(0,jsonStr.length - 1);

      jsonStr += '}';

      return jsonStr;

      }

當然不用這個方法也可以,可以自己手動轉,表單內容不多也無所謂,如果一個表單幾十個資料要提交,

手動轉前臺會哭的。

function login(){

var datas = serializeJson('loginForm');//這一行是將登入介面的名叫loginForm的表單所有資料轉化為json字串,剛剛上面定義過了。如果不用這個也可以手動定義:vardatas={"name":"123","password":"123"}

var url=classPath+"test";//呼叫後臺服務的連結地址,classPath是前面說的common.js裡面定義的統一路徑,後面加上具體方法的路徑和一些引數就行,如果有引數則路徑為classPath+"test?引數名1=引數值1&引數名2=引數值2";

$.ajax({

type:"get",

async:false,

url:url,

dataType:'jsonp',//資料型別為jsonp 

jsonp:'callback',

//上面5行不用管也不用變

data:{'param':datas},//這一行是傳遞給後臺的資料,必須是json格式,如果沒有資料,就不需要這一行

jsonpCallback:'callback',//callback是一個名字 ,傳給後臺註冊下就行,最好就用"callback",方便管理維護

//下面一行定義瞭如果呼叫後臺方法成功了就執行什麼操作,後臺會傳遞過來一個json格式的資料如:

//callback({"data":{"stuNumber":"109074350","Username":"zhuxian","password":"123456"},"message":"登入成功","status":"OK"}) 

//callback是傳遞給後臺的名字,裡面是內容;一般格式都是status狀態+data資料+message訊息,這個看個人喜好。

success:function(json){

//引數json就是上面例子的資料

if(json.status=='OK'){

alert(json.data.stuNumber);//輸出109074350

}

}

});

}

其他功能和這個都差不多了,方法名字改一下,呼叫的url改一下,傳遞的datas改一下就行,然後success之後,先判斷下json的status值是什麼,status的值是什麼代表什麼意思和後臺人員商量好就行、然後就可以處理json的data資料了,可以輸出,可以顯示到頁面的任何位置了。

看完這裡之後就有點頭緒了,使用谷歌提供的開源專案Gson  對任何資料轉化json資料

然後再對這個json資料進行修改,最後返回到前端!

這就完成了shiro對跨域ajax請求的許可權管理以及資料返回