“簡單,踏實~ 讀書寫字放屁”
restful(representational state transfer)架構風格,是一個web自身的架構風格,底層主要基于http協定(ps:提出者就是http協定的作者),是分布式應用架構的偉大實踐理論。restful架構是無狀态的,表現為請求-響應的形式,有别于基于bower的sessionid不同。
<b> </b>
1.資源
2.資源的表述
3.狀态的轉移
4.統一接口
5.超文本驅動
基于restful架構的一套網際網路分布式的api設計理論。和上面資源,狀态和統一接口有着密切的關系。
為啥分布式網際網路架構很常見呢?請看下面兩個模式
<b>mvc模式</b>:
<b>rest api模式</b>:
restful針對資源的方法定義分簡單和關聯複雜兩種。
基本方法定義:
1
2
3
4
5
<code>get /user # 擷取user清單</code>
<code>get /user/</code><code>3</code> <code># 檢視序号為</code><code>3</code><code>的user</code>
<code>post /user # 建立一個user</code>
<code>put /user/</code><code>3</code> <code># 更新序号為</code><code>3</code><code>的user</code>
<code>delete /user/</code><code>3</code> <code>#删除user</code><code>3</code>
資源之間的關聯方法如下定義:
<code>get /admin/</code><code>1</code><code>/user/</code><code>10</code> <code># 管理者</code><code>1</code><code>号,檢視序号為</code><code>3</code><code>的user資訊</code>
<code>...</code>
那麼權限如何控制?
前面說到,restful是無狀态的,是以每次請求就需要對起進行認證和授權。
身份認證,即登入驗證使用者是否擁有相應的身份。簡單的說就是一個web頁面點選登入後,服務端進行使用者密碼的校驗。
也可以說成授權,就是在身份認證後,驗證該身份具體擁有某種權限。即針對于某種資源的crud,不同使用者的操作權限是不同的。
一般簡單項目:做個sign(加密加鹽參數)+ 針對使用者的access_token
複雜的話,加入 sll ,并使用oauth2進行對token的安全傳輸。
自然,技術服務于應用場景。既簡單又可以處理應用場景即可。簡單,實用即可~
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<code>/**</code>
<code> </code><code>* access token攔截器</code>
<code> </code><code>* <p/></code>
<code> </code><code>* created by bysocket on 16/4/18.</code>
<code> </code><code>*/</code>
<code>@component</code>
<code>public</code> <code>class</code> <code>accesstokenverifyinterceptor</code><code>extends</code> <code>handlerinterceptoradapter {</code>
<code> </code><code>@autowired</code>
<code> </code><code>validationservice validationservice;</code>
<code> </code><code>private</code> <code>final</code> <code>static</code> <code>logger log = loggerfactory.getlogger(accesstokenverifyinterceptor.</code><code>class</code><code>);</code>
<code> </code><code>@override</code>
<code> </code><code>public</code> <code>boolean</code> <code>prehandle(httpservletrequest request, httpservletresponse response, object handler)</code>
<code> </code><code>throws</code> <code>exception {</code>
<code> </code><code>log.info(</code><code>"accesstoken executing ..."</code><code>);</code>
<code> </code><code>boolean</code> <code>flag =</code><code>false</code><code>;</code>
<code> </code><code>// token</code>
<code> </code><code>string accesstoken = request.getparameter(</code><code>"token"</code><code>);</code>
<code> </code><code>if</code> <code>(stringutils.isnotblank(accesstoken)) {</code>
<code> </code><code>// 驗證</code>
<code> </code><code>validationmodel v = validationservice.verifyaccesstoken(accesstoken);</code>
<code> </code><code>// 時間過期</code>
<code> </code><code>// 使用者驗證</code>
<code> </code><code>if</code> <code>(v !=</code><code>null</code><code>) {</code>
<code> </code><code>user user = userservice.findbyid(v.getuid());</code>
<code> </code><code>if</code><code>(user !=</code><code>null</code><code>) {</code>
<code> </code><code>request.setattribute(commonconst.param_user, user);</code>
<code> </code><code>log.info(</code><code>"accesstoken success ... user:"</code> <code>+ user.getusername() +</code><code>" - "</code> <code>+ accesstoken);</code>
<code> </code><code>flag =</code><code>true</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>if</code> <code>(!flag) {</code>
<code> </code><code>response.setstatus(httpstatus.forbidden.value());</code>
<code> </code><code>response.getwriter().print(</code><code>"accesstoken error"</code><code>);</code>
<code> </code><code>return</code> <code>flag;</code>
<code> </code><code>}</code>
<code>}</code>
第一步:從request擷取token
第二步:根據token擷取校驗對象資訊(也可以加入過期時間校驗,簡單)
第三步:通過校驗資訊擷取使用者資訊
<code> </code><code>* mvc 設定</code>
<code> </code><code>*</code>
<code>@configuration</code>
<code>public</code> <code>class</code> <code>webmvcconfig</code><code>extends</code> <code>webmvcconfigureradapter {</code>
<code> </code><code>@bean</code>
<code> </code><code>public</code> <code>accesstokenverifyinterceptor tokenverifyinterceptor() {</code>
<code> </code><code>return</code> <code>new</code> <code>accesstokenverifyinterceptor();</code>
<code> </code><code>public</code> <code>void</code> <code>addinterceptors(interceptorregistry registry) {</code>
<code> </code><code>registry.addinterceptor(tokenverifyinterceptor()).addpathpatterns(</code><code>"/test"</code><code>);</code>
<code> </code><code>super</code><code>.addinterceptors(registry);</code>
第一步:将攔截器配置成bean
第二步:攔截器注冊注入該攔截器,并配置攔截的url
<b>token存哪裡?</b>
ehcache,redis,db都可以。自然簡單的當然是db。
1. rest api
2. spring boot 攔截器