Shiro + SSM(框架) + Freemarker(jsp)講解的權限控制Demo,還不趕快去下載?html
原文連接:http://www.sojson.com/blog/165.htmljava
本項目詳細介紹:http://www.sojson.com/shiromysql
前言:本教程適合有必定基礎的 Java程序員使用,若是對 Shiro 有必定的瞭解,過程當中會很快接受,建議在使用 Shiro教程Demo的時候,建議直接Maven,教程Demo中沒有對Maven過多的依賴,只有一個依賴包的管理,若是對Maven不熟悉,你能夠 安裝一個MyEclipse8.5,自帶Maven環境,本站有 在線生成MyEclipse註冊碼。注意,開始無論你技術多牛,無論個人文檔寫的有多麼很差,都建議你看完,這樣大概內心有個數,Demo裏有什麼功能, 哪些地方怎麼實現的?都知道個大概。git
主要解決是以前說的問題:Shiro 教程,關於最近反應的相關異常問題,解決方法合集。程序員
項目在本頁面的附件中提取。github
配置文件(spring-cache.xml
)中已經修改成以下配置:web
<!-- redis 配置,也能夠把配置挪到properties配置文件中,再讀取 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="2" value="6379" name="port" type="int"/>
<constructor-arg index="3" value="5000" name="timeout" type="int"/>
<constructor-arg index="1" value="127.0.0.1" name="host" type="java.lang.String"/>
</bean>
<!--
這種 arguments 構造的方式,以前配置有缺點。
這裏以前的配置有問題,由於參數類型不一致,有時候jar和環境的問題,致使參數根據index對應,會處理問題,
理論上加另外一個 name,就能夠解決,如今把name 和type都加上,更保險。
-->
當沒有獲取到退出前的request
,爲null
的時候會報錯。在(UserLoginController.java
)135行處有所修改。redis
/**
* shiro 獲取登陸以前的地址
* 以前0.1版本這個沒判斷空。
*/
SavedRequest savedRequest = WebUtils.getSavedRequest(request);
String url = null ;
if(null != savedRequest){
url = savedRequest.getRequestUrl();
}
/**
* 咱們日常用的獲取上一個請求的方式,在Session不一致的狀況下是獲取不到的
* String url = (String) request.getAttribute(WebUtils.FORWARD_REQUEST_URI_ATTRIBUTE);
*/
在配置文件裏(spring-shiro.xml
)中的配置有所修改。spring
<!-- 會話Cookie模板 -->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<!--cookie的name,我故意取名叫xxxxbaidu -->
<constructor-arg value="v_v-s-baidu"/>
<property name="httpOnly" value="true"/>
<!--cookie的有效時間 -->
<property name="maxAge" value="-1"/>
<!-- 配置存儲Session Cookie的domain爲 一級域名
<property name="domain" value=".itboy.net"/>
-->
</bean>
上面配置是去掉了 Session 的存儲Key
的做用域,以前設置的.itboy.net
,是寫到當前域名的 一級域名 下,這樣就能夠作到N
個 二級域名 下,三級、四級....下 Session 都是共享的。sql
<!-- 用戶信息記住我功能的相關配置 -->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<constructor-arg value="v_v-re-baidu"/>
<property name="httpOnly" value="true"/>
<!-- 配置存儲rememberMe Cookie的domain爲 一級域名
<property name="domain" value=".itboy.net"/>
-->
<property name="maxAge" value="2592000"/><!-- 30天時間,記住我30天 -->
</bean>
記住我登陸的信息配置。和上面配置是同樣的道理,能夠在相同 一級域名 下的全部域名均可以獲取到登陸的信息。
咱們在其餘的系統中能夠看到,單個賬號只容許一人使用,在A處登陸了,B處再登陸,那A處就被踢出了。以下圖所示。
PS:這個功能有點問題,之後有時間我再修復,請把shiro_base_auth.ini
文件中的 kickout
去掉便可(2016年9月6日 09:31:47)。
可是此功能不是很完美,當A處被踢出後,再從新登陸,這時候B處反應有點慢,具體我還沒看,由於是以前加的功能,如今凌晨了,下次我有空再瞧瞧,同窗你也能夠看看,解決了和我說一聲,我把功能修復。
以前功能有問題,每當添加一個權限的時候,默認都給角色爲「管理員」的角色默認添加當前新添加的權限。這樣達到管理員的權限永遠是最大的。因爲代碼有BUG
,致使全部權限刪除了。現已修復。
問題描述:以前項目只能部署到Root
下才能正常運行,目前已經修復,能夠帶項目路徑進行訪問了,以前只能這樣訪問,http://localhost:8080
而不能http://localhost:8080/shiro.demo/
訪問,目前是能夠了。
解決方案:在 FreeMarkerViewExtend.java 33行處
增長了BasePath
,經過BasePath
來控制請求目錄,在 Freemarker 中能夠自由使用,而 JSP 中是直接在 JSP 中獲取BasePath
使用。
解決後遺症:由於咱們的權限是經過URL
來控制的,那麼增長了項目的目錄,致使權限不能正確的判斷,再加上咱們的項目名稱(目錄)能夠自定義,致使更很差判斷。
後遺症解決方案:PermissionFilter.java 50行處
解決了這個問題,詳情請看代碼和註釋,其實就是replace
了一下。
HttpServletRequest httpRequest = ((HttpServletRequest)request);
/**
* 此處是改版後,爲了兼容項目不須要部署到root下,也能夠正常運行,可是權限沒設置目前必須到root 的URI,
* 緣由:若是你把這個項目叫 ShiroDemo,那麼路徑就是 /ShiroDemo/xxxx.shtml ,那另一我的使用,又叫Shiro_Demo,那麼就要這麼控制/Shiro_Demo/xxxx.shtml
* 理解了嗎?
* 因此這裏替換了一下,使用根目錄開始的URI
*/
String uri = httpRequest.getRequestURI();//獲取URI
String basePath = httpRequest.getContextPath();//獲取basePath
if(null != uri && uri.startsWith(basePath)){
uri = uri.replace(basePath, "");
}
其實也不是錯,可是看着不舒服,因此還得解決這個問題。解決這個問題須要在web.xml
中的開始部位加入如下代碼。
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
<context-param>
<param-name>spring.liveBeansView.mbeanDomain</param-name>
<param-value>dev</param-value>
</context-param>
打包的時候,不一樣版本的 Eclipse 還有IDEA
會有打包打不進去Mapper.xml
文件,這個時候要加以下代碼(羣裏同窗提供的)。
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
在<build>
標籤內加入便可,若是仍是不能解決,那麼請你加羣(更名後)說明你的問題,有人會回答你。
這個錯誤是由於Tomcat7
中沒有 JSTL 的jar包,如今已經在項目pom.xml
中增長了以下 jar
的引入管理。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
若是仍是不能解決問題,請在官方羣(羣號:259217951)內搜索「jstl」
如圖下載依賴包。
便可解決問題。
大概就這些問題。新的項目在附件中下載,已經提交到github
。具體請看 http://www.sojson.com/shiro
ps:個人疏忽,把http://shiro.itboy.net 線上展現的Demo 定時任務+存儲過程提交到github和下載的項目中。錯誤以下:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: PROCEDURE shiro_demo.init_shiro_demo does not exist
解決方案,在Spring.xml裏把定時任務註釋(刪除)了。