項目導入
zip包下載或git下載(zip下載不帶git)
IDEA setting 設置代理(阿里代理)
jar下載目錄更換默認目錄
不能識別項目(選中pom.xml 右鍵 )
打包成jar包或wav包
從代碼生成角度看項目結構(訂單 order)
生成的html文件在WEB-INF對應的模塊下(webapp/WEB-INF/view/order)
生成的js文件static目錄下(webapp/static/modular/order/)
bean 在modular/system/modle/Order
數據操作 xml 及接口在 modular/system/dao/mapping 及上一級目錄
接口的實現類modular/order/service
control(被html調用的增刪改查)類 在modular/order/controller
-
結論
數據庫映射方式採用的mybatis xml方式配置(還有一種是註解)
git遠程header怎麼移動?TODO
用的是mybatis-plus (中國人搞的 baomidou)
shiro 權限
Shiro如何獲得輸入的用戶信息:(前後端關係 TODO)
Shiro如何驗證用戶名密碼是否正確:ShiroRealm繼承AuthorizingRealm 覆寫doGetAuthenticationInfo方法,傳入的AuthenticationToken包含用戶名和密碼,根據用戶名查詢數據庫中完整用戶的信息
如何知道該用戶是否有相應的權限進行操作:(1).從數據庫讀取存儲權限:同上覆寫doGetAuthorizationInfo,在裏面根據用戶信息包含的role_id,連表sys_relation 和sys_menu通過menu_id查詢出對應的用戶擁有權限的url,放入集合。(2)如何判斷是否擁有權限:通過Permission註解AOP攔截(Shiro自帶有一個),在AOP裏面進行判斷
session管理:分爲單機環境和多機環境,多機環境需要redis進行存儲(TODO進一步博客)
cache緩存管理:EhCache,讀取xml配置,通過註解@Cache(TODO 進一步博客)
記住我CookieRememberMeManager
- 代碼編寫ShiroConfig(配置); ShiroRealm(封裝與數據庫連接細節) ;GunsUserFilter(緩存等過期設置);
擴展閱讀https://www.imooc.com/article/3369(session和cookie異同)
日誌系統
1\. 獲取時機: 對方法進行BussinessLog註解 ,通過AOP攔截
2\. 如何保存舊值:日誌進行修改或編輯時要保存舊值,在跳轉的時候進行值的臨時保存(LogObjectHolder)
3\. 如何獲取: LogObjectHolder拿的對象,反射獲取屬性,進行循環,在循環裏攔截http請求參數,進行比較(如果碰到一些不好直觀看的的值,例如性別標識,F;M表示男,F表示女,則通過字典進行查詢)
日誌分類:登錄登出日誌;業務日誌;異常日誌
核心技術點:1.AOP;2.保存舊值;3.把無意義的字段值映射成可讀性強的值;異常統一處理(@ControllerAdvice 異常日誌)
分頁
MyBatis-Plus裏面分裝好了limit物理分頁 Page註解攔截識別
物理分頁(limit 數量比較大的情況)
邏輯分頁(全部查詢,然後進行分頁識別)
緩存
用在經常使用,以及key和value每次查詢的時候不變
經常用到的有Echace 和Redis
-
註解:
Cacheable : 如果有先取出緩存(select)
CachePut :放入緩存(save)
CacheEvict :刪除緩存(update或delete)
Caching:
-
註解參數
Cacheable,CachePut :value,緩存名稱;key緩存鍵值 Condition SpEL (方法之前),Usless SpEL(方法之後)
CaheEvict: value;key;Condition SpEL;等
緩存本地xml配置
-
常用的SPEL表達式
args
caches
target
targetClass
method
methodName
result
代碼生成器
MyBatis數據攔截器(在不修改查詢語句的情況下進行攔截查詢。eg.部門查看範圍,只能允許查看自己部門或者子部門的數據)
DataScope 數據範圍(sql參數)
DataScopeInterceptor攔截
jwt
由服務器產生,當客戶端擁有,即擁有了服務器訪問的權限
-
組成:
header+payload+signature
header
-
過程:
服務端根據用戶名密碼,生成jwt和key返回給客戶端
客戶端把jwt 放入header的Authorization字段裏(前面加Bearer ),然後對要傳輸的數據進行base64加密,最後加上key進行md5加密,形成sign前面,形如({“object”:”base64(objectJson)”,”sign”:”md5(objectJson+key)"})
-
幾個關鍵類說明
IRequestValidator:驗證身份(比如用戶名,密碼,驗證碼等)
AuthCotroller:RequestMapping,對請求進行驗證,返回token和randomKey兩個字段的json
-
AuthFilter:對客戶端請求的jwt token進行驗證過濾
- 拿出herader的Bearer字段,根據jwt判斷token是否過期
-
WithSignMessageConverter:對數據進行校驗,判斷數據有沒有被篡改
取出header Authorization字段,根據該字段拿到key
取出object字段,並和key md5計算,得到本應該的sign
和傳過來的sign進行比較,如果相等數據沒有被篡改,不相等,即數據被篡改了
DataSecurityAction:對數據進行加密(一方面是不可讀,另外一方面是保證json字段順序變化也認爲數據篡改)
JwtTokenUtil:jwt常用的工具類
代碼組成
WebConfig(註解Configuration和xml配置相似,相當於導出,可以通過@Autowired),關聯AuthFilter和DataSecurity
事務
-
事務的四大特性
原子性:要不全部完成,要不全部失敗
一致性:一旦全部完成或者失敗。確保業務處於一致的狀態(和原子性相似,着重的是狀態)
隔離性:有多個事務處理同樣的數據,每個事務都應該和其他事務隔離開
持久性:事務本地持久化,無論發生什麼樣的系統錯誤,都可以恢復回來
-
隔離性詳解
髒讀:讀取未提交的數據
不可重複讀:一個事務多次查詢返回的結果不一致
幻讀:一個事務批量修改表的所有數據,這時候另一個事務往表裏增加了一條記錄,導致第一個事務修改之後落了一條,就像是產生幻覺一樣。
-
隔離級別
Serialozable(串行化)都不會發生
Repeatable Read(可重複讀)默認,幻讀可能發生
Read Commited(讀已提交)髒讀不會發生
Read uncommitted(讀未提交)不能保證
-
傳播行爲(一個事務調用另外一個事務,須指定事務應該如何傳播)
REOPAGATION_REQUIRED:
REOPAGATION_SUPPORTS:
REOPAGATION_MANDATORY:
REOPAGATION_REUQIRES_NEW:
REOPAGATION_SUPPORTED:
REOPAGATION_NERVER:
REOPAGATION_NESTED: