1. 程式人生 > >[Shiro教程] Shiro 教程基於SSM(SpringMVC + Spring + Mybatis)EHCache版本

[Shiro教程] Shiro 教程基於SSM(SpringMVC + Spring + Mybatis)EHCache版本

一、Shiro簡介

Apache Shiro 是 Java  的一個安全框架。我們經常看到它被拿來和 Spring   Security  來對比。大部分人認為 Shiro   Security  要簡單。我的觀點贊成一半一半吧。

首先 Shiro  確實和 Security  是同類型的框架,主要用來做安全,也就是我們俗稱的許可權校驗(控制)。居多人對 Shrio  的定義為好入門。

我選型為 Shiro  ,主要的原因擴充套件太easy了,而且我要的功能它都有。

二、概述

前段時間出了一個基於SSM(SpringMVC + Spring + Mybatis)的Shiro 教程Demo,Cache(Nosql)是基於Ehcache的,但是很多同學卡在了Redis上,經常執行起來。所以現在出一版本基於  

Cache  為Ehcache版本的。這樣減少新入門的同學的難度,不用依賴第三方中介軟體。

後續會陸陸續續新增N多相關的功能。以不同版本的方式釋出。

三、需要你的贊助

如果幫助到了您,請你在下載程式碼後,執行後,跑起來後,加群幫你解決問題後,興奮、喜悅、憤怒、喪氣、不知所措... ... 的時候,請贊助我,錢多少不重要,學生請不要贊助(富二代請忽略)。

四、請遵循三要素

  1. 建議你看完本篇文件所有內容,再進行執行專案。
  2. 在沒熟練之前,除了必要的配置修改,請勿改動任何配置和包路徑。
  3. 有疑問先看文件,交流加QQ群:259217951即可,群裡沒人理你@群主即可。

五、環境準備

5.1 開發工具

如果使用Eclipse的同學,請安裝好Maven環境,如果沒有Maven環境,又不想安裝,那麼請在附件中下載依賴包,自己把專案轉成Java Web專案然後進行執行。

如果使用Idea作為開發工具的同學,注意配置resources,還有一些其他的配置需要自己處理,不像匯入  MyEclipes  直接能跑起來。

5.2 依賴第三方

因為是基於  Ehcache  ,所以也沒有其他第三方。

主要就是一個  Mysql  資料庫。資料庫的版本為 Mysql5.6 ,估計Mysql5.5Mysql5.6都沒問題,Mysql5.7

有小小問題,因為一些預設配置導致有些語法可能不支援,這個慎用。

六、環境配置及要求,JDK版本,初始化配置

6.1 JDK版本要求

  JDK  版本要求為JDK1.7+,我開發的版本是1.7.0_80JDK1.6有些jar包會報錯,推薦使用JDK1.7以上。

如果出現以下類似錯誤,那就是JDK版本不相符。

  1. Unsupported major.minor version 51.0

其中各個版本對應的提示如下:

  1. JDK1.5對應為Unsupported major.minor version 49.0
  2. JDK1.6對應為Unsupported major.minor version 50.0
  3. JDK1.7對應為Unsupported major.minor version 51.0
  4. JDK1.8對應為Unsupported major.minor version 52.0

6.2 初始化配置 

6.2.1 Mysql資料庫初始化

本教程不支援自動建立表和插入資料,在專案的init/sql下有三個sql 檔案,分別為:tables.sql(插入表)、init.data.sql(插入初始化資料)、init_shiro_demo.sql(插入初始化儲存過程)。

執行的過程為: tables.sql(插入表)===> init.data.sql(插入初始化資料)就可以了。

儲存過程可以是定時任務 com.sojson.common.timer.ToTimer 中定時任務呼叫的儲存過程。每20分鐘一次。想看看效果的同學,可以把spring.xml配置檔案中的spring-timer.xml註釋開啟就可以。

資料庫配置:jdbc.properties配置你的資料庫連結。

  1. jdbc.url=jdbc:mysql://localhost:3306/shiro.demo
  2. jdbc.username=root
  3. jdbc.password=123456

其他配置預設的即可,先跑起來,跑起來沒問題後,看看配置檔案,有問題和疑問在群裡交流。

PS:如果你確實要用Mysql5.7,那麼在Mysql的安裝目錄下找到。my.ini或者my_default.ini裡面配置sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES即可。

6.3 Maven環境說明

本教程是用  Maven  管理Jar包及執行打包,如果你發現  Maven  一直在下載jar包,時間過久的話,建議你換成阿里的資料來源。開啟你的 Maven  目錄的setting.xml檔案,如果沒有直接新增即可,官方群裡有setting.xml檔案作為參考。

主要改個本地Maven目錄,改成你自己的目錄即可:

  1. <localRepository>E:\maven\repository</localRepository>

再配置一個mirror,找到標籤為mirrors,然後在裡面新增或者修改為阿里的Maven庫,如下圖:

  1. <mirrors>
  2. <mirror>
  3. <id>alimaven</id>
  4. <name>aliyun maven</name>
  5. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  6. <mirrorOf>central</mirrorOf>
  7. </mirror>
  8. </mirrors>

異常解決

常見的異常有3種。

  1. 如果有部分包打紅× ,可以刪除這個包路徑,再次專案右鍵 Maven選項(每個工具不一樣)==> Update Maven Dependencies 更新即可。
  2. 如果下載好Jar包,也不報錯,但是在執行專案的時候,報錯zip相關異常,那麼刪除Maven目錄下所有下好的jar包,然後再來下載一次。因為是下載的包是損壞的。
  3. 還有   Maven  的  JDK  版本需要和你專案一致,有的工具預設配置是JDK1.5 。

6.4 其他說明

編碼格式:UTF-8,換成其他編碼格式可能會有瑕疵。

Spring相關Jar版本為:Spring 4.2.5

前端頁面採用:Bootstarp 3.2 。

其他依賴:jQuery1.8.3  、layer控制元件。

6.5 View層說明

七、教程功能詳細說明

下面各點是針對(SSM)SpringMvc + Spring + Mybatis框架說明,以及一些使用方式和基本功能介紹。

7.1.1 框架基本介紹

本教程是SSM(  SpringMVC  +Spring  +   Mybatis  +   Freemarker  )  +   Ehcache  做的整體Shiro Demo,其他框架需要自己自行解決,所以不做框架 其他 的講解,其實是大同小異。

7.1.2 分頁介紹

本框架裡的分頁比較Low,分頁的ServiceImpl要繼承 BaseMybatisDao<T> ,這裡泛型的<T>為當前實體物件對應的Mapper.xml檔案,其實就是Mapper.xmlnamespace。呼叫父類的findPage相關。

Service Impl Java 程式碼:

  1. publicPagination<UserRoleAllocationBo> findUserAndRole(ModelMap modelMap,
  2. Integer pageNo,Integer pageSize){
  3. //findUserAndRole : 為查詢資料(sqlID)
  4. //findCount : 為查詢符合資料的總條數(sqlID)
  5. returnsuper.findPage("findUserAndRole","findCount", modelMap, pageNo, pageSize);
  6. }

分頁查詢使用預設的sqlId

  1. publicPagination<UPermission> findPage(Map<String,Object> resultMap,Integer pageNo,
  2. Integer pageSize){
  3. /**
  4. * 呼叫父類的分頁查詢,預設資料查詢sqlId = findAll , count 查詢sqlId = findCount
  5. */
  6. returnsuper.findPage(resultMap, pageNo, pageSize);
  7. }

Mapper.xml 檔案 Sql 程式碼,和上面一 一對應:

  1. <selectid="findCount"resultMap="BaseResultMap">
  2. select count(id) from u_user
  3. <includerefid="where_all"/>
  4. </select>
  5. <!-- 使用者許可權分配的分頁查詢 -->
  6. <selectid="findUserAndRole"resultType="com.sojson.permission.bo.UserRoleAllocationBo">
  7. select u.id,u.nickname,u.email,u.create_time,u.last_login_time,u.status ,group_concat(ur.name) roleNames,group_concat(ur.id)roleIds from
  8. u_user u
  9. left join u_user_role uur on uur.uid = u.id
  10. left join u_role ur on ur.id = uur.rid
  11. <where>
  12. <iftest="findContent != null and findContent !='' ">
  13. and (
  14. LOWER(u.nickname) like LOWER(CONCAT("%",#{findContent,jdbcType=VARCHAR},"%")) or
  15. LOWER(u.email) like LOWER(CONCAT("%",#{findContent,jdbcType=VARCHAR},"%"))
  16. )
  17. </if>
  18. </where>
  19. group by u.id
  20. </select>
  1. <selectid="findAll"resultMap="BaseResultMap">
  2. select
  3. <includerefid="Base_Column_List"/>
  4. from u_permission
  5. <includerefid="where_all"/>
  6. <includerefid="limit_sql"/>
  7. </select>
  8. <selectid=