1.註冊
好玩的代碼倒計時
1.頁面js提交註冊請求到認證服務
自定義視圖映射將無實際業務意義只進行頁面跳轉的請求抽取到viewcontroller中
路徑映射默認都是get訪問的
使用阿里雲的短信驗證碼
參考第三發接口文檔,原理就是請求短信服務地址並設置http的請求頭(服務地址,appcode,和method)和參數(驗證碼,模板,公司簽名,手機號)
此處應注意不應該是頁面直接短服務,而是頁面ajax請求認證服務,認證服務遠程調用短信服務發送驗證碼
註冊頁調用
2.認證服務的遠程調用第三方短信服務發送短信並存入緩存並返回註冊頁面(接口放刷,驗證碼的再校驗,配合redis實現)
3.提交註冊表單到會員服務,驗證通過進行數據庫持久化
防止註冊表單重複提交
註冊成功後使用重定向防止註冊表單重複提交,可使用RedirectAttribute redirectAttribute代替Model mode作爲參數 爲重定攜帶數據,利用session,將數據放到session中只要跳到下一個頁面取出這個數據,session裏面的數據就會被刪除,
持久化代碼
md5鹽值加密
spring提供的加密器的加密與匹配
登錄
頁面提交請求到認證服務,認證服務遠程調用member
2.社交登錄
2.1OAuth2.0簡介
2.2微博登錄示例
2.2.1.進入微博開放平臺
創建微連接設置應用名稱等信息,設置回調地址(回調地址就是我們自己開發的應用)
2.2.2.基本使用流程
1.引導需要授權的用戶到如下地址:替換下面的client_id爲我們應用的App Key,替換redirect_uri爲我們的商城應用
https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI
2.如果用戶同意授權,頁面跳轉至 YOUR_REGISTERED_REDIRECT_URI/?code=CODE
3.換取Access Token(一個code只能換取一個Access Token)
client_id: 申請應用時分配的AppKey。
client_secret:申請應用時分配的AppSecret。
grant_type:請求的類型,填寫authorization_code
redirect_uri: 回調地址,需需與註冊應用裏的回調地址一致。
code:第二步獲取的code值
https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE
拿到Access Token之後就可以使用Access Token去訪問所有微博提供的接口並獲取信息
在調用微博接口時應注意要保證client_secret及Access Token的安全性(不可暴露)。
2.3示例:
2.3.1.接受頁面請求,根據code換取包含Access Token信息的json數據
2.3.2.處理包含Access Token信息的json數據
1.使用json(包含Access Token)在線格式轉換將json轉爲javabean,並放入項目中
2.處理json(包含Access Token)轉爲我們生成的bean
2.2.3.處理社交用戶是登錄還是註冊
根據json信息獲取社交應用中的用戶信息並插入數據庫
使用json數據中的uid作爲該微博帳戶關聯wwmall應用的唯一標識
每次使用社交登陸獲取的Access Token值會變,但uid是相同的所以我們用uid關聯社交應用與我們的應用
判斷當前社交用戶是否登陸過,如果是第一次就註冊在系統中,如果不是第一次就直接登錄
2.2.4.登錄成功返回登錄
登錄成功將用戶信息放入session中
2.4session 不共享問題
分佈式session出現不共享原因
session原理
由於session的原理導致在分佈式集羣應用環境下導致session不共享問題
2.5分佈式session共享解決方案
2.5.1集羣服務session不共享解決方案()
2.5.1.1session賦值方案(高集羣環境下不可取)
2.5.1.2session存儲在客戶端中(不安全,cookie存儲內容有上限)
2.5.1.3利用負載均衡機制(使用IP的hash一致性)將同一個用戶的請求負載均衡到同一服務
2.5.1.4最終解決方案:統一存儲到redis中
2.5.2分佈式應用session不共享解決方案
父域名wwmall.com ,子域名auth.wwmall.com, 子域名product.wwmall.com
子域名之間cookie是不能共享的。
2.5.2.1子域session共享
我們在存取session時將瀏覽器需要存儲的cookie域名都指定爲父域名
2.5.2.2整合spring session解決session跨域問題
引入依賴
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
配置文件配置
spring.session.store-type=redis #會話存儲類型。
server.servlet.session.timeout =#會話超時。如果未指定持續時間後綴,則使用秒。
spring.session.redis.flush-mode = on_save#會話刷新模式。
spring.session.redis.namespace = spring:session#用於存儲會話的鍵的命名空間
在主類上使用@EnableRedisHttpSession即可將session存在redis中
這將創建具有springSessionRepositoryFilter該實現名稱的Spring bean Filter。該過濾器負責替換HttpSessionSpring Session支持的實現。
編寫配置類設置cookie的domian屬性,並設置序列化到redis的規則使用阿里提供的序列化器
2.5.2.3springsession核心原理(使用裝飾者模式將原生的request包裝以後,想獲取session都去包裝後的request中獲取)
3.多系統-----單點登錄