1. 程式人生 > >SpringMVC的介面鑑權

SpringMVC的介面鑑權

工作中,我們肯定都會接觸到攔截器,但是經常在攔截的過程中出現各種問題,比如攔截之後,靜態資源也被攔截,結合AOP的時候起不到作用,或者攔截根本沒有生效。用SpringMVC的小夥伴肯定深有感受,接下來,我們一起整理一遍攔截器及AOP。

1.什麼是攔截器

在SpringMVC中用於攔截請求的程式碼。由於SpringMVC的檢視解析器的存在,在攔截請求到處理請求再到返回檢視中間有兩個間隙,interceptor提供了preHandle和postHandle以及afterCompletion三個方法。preHandle呼叫controller具體方法之前呼叫,postHandle完成具體方法之後呼叫,afterCompletion完成對頁面的render以後呼叫,至此整個頁面渲染完成。

也就是說我們在preHandle記錄開始的時間,在afterCompletion記錄結束的時間,就可或者整個頁面生成的時間。

2.步驟和流程

步驟:

第一步:自定義一個實現了Interceptor介面的類,或者繼承抽象類AbstractInterceptor。這裡繼承了HandlerInterceptor介面
    第二步:在配置檔案中註冊定義的攔截器。
    第三步:在需要使用Controller中編寫業務邏輯

接下來就看具體實踐:

3.具體實現

1 自定義攔截器類,實現HandlerInterceptor介面

2 實現preHandle方法,此處校驗的是app_id和app_secret是否合法

3 在configuration類中註冊攔截器,定義生效的規則

4 編寫Controller程式碼

接下來就簡單Demo一個例子:使用Spring5.x

1.導包:

2.配置web.xml,只需要配置一個分發器就行了:

3.寫controller和interceptor攔截器

HandlerInterceptor其實一共3個方法,都是預設方法,需要Ctrl進去方法裡面copy出來即可。

4.配置applicationContext.xml

注意事項:目錄結構必須正確,applicationContext.xml檔案需要放在src的根目錄下,不能隨意擺放,否則就會報找不到檔案的錯誤。

可以配置多個<mvc:interceptor>,然後會按順序去攔截

5.驗證並給出結論:

列印的日誌為:

驗證了我們的結論,確實攔截了,那另一個我沒有配置的方法會不會被攔截呢?

列印日誌為:

確實沒有被攔截,如果沒有配置就不會被攔截,這樣也實現了方法攔截的效果!!

但是還有一個點肯定很疑惑,perhandler裡面request和response引數都好理解,但是還有一個Object handler引數,這是什麼東西呢?

輸出之後我們發現,就是方法的全名:

這些還是不夠,因為我return true;就會進入方法執行,但是return false我會跳到哪裡去呢???

這個時候就會根據response來產生響應,如果response沒有東西,那麼返回的response就是null,但是如果response裡面加入了需要的引數,就會返回response給到前端渲染失敗之後的介面,所以需要看前端需要什麼資料,比如Map,String,一般都是這些:

    List<HashMap<String, Object>> mapList= new ArrayList<HashMap<String, Object>>();
      response.setCharacterEncoding("UTF-8");    
      response.setContentType("application/json;charset=UTF8");
      PrintWriter writer = response.getWriter();
      writer.write(JSON.toJSONString(mapList));
      writer.close();

主要是要設定一下報文頭的返回格式application/json,就可以指定返回的格式了。

希望這對你有幫助,更進一步瞭解SpringMVC的攔截