簡單的整合shiro和springmvc的例子
想要整合Shiro和springmvc,在網上找了很多例子,感覺都有一點複雜。所以就自己寫了一個最簡單整合專案,記錄在這裡以備後面檢視。
這個例子包含如下三個部分:
1.簡單的頁面
2.shiro配置
3.springmvc配置
shiro可以直接和spring整合,但是這樣需要單獨配置spring用於整合shiro,在配置springmvc。配置檔案看起來亂七八糟的。所以這裡就shiro不採用spring來管理。因此這裡的整合類似 shiro + servlet + springmvc。這樣配置相對簡單好理解。但也是最簡單的配置,只能用於學習,用在實際專案中,還得改寫。
下面是專案結構圖(realm那個資料夾可有可沒有,只是如果刪除了,就需要將shiro.ini檔案中 myrealm = shirospringweb.realm xxxx 那行刪除掉)
下面是具體步驟
(1).新增依賴
既然是簡單,那引用也是最少的,具體如下
dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1'
// This dependency is used by the application.
implementation 'com.google.guava:guava:30.1-jre'
// ++ Adding Spring dependencies
implementation 'org.springframework:spring-context:5.3.9'
implementation 'org.springframework:spring-webmvc:5.3.9'
// ++ Using Servlet for SpringMvc
implementation 'javax.servlet:javax.servlet-api:4.0.1'
// ++ Using shiro-web
implementation 'org.apache.shiro:shiro-web:1.7.1'
}
其中前面兩個是建立專案自帶的,所以只需要引用後面的四個包就可以咯
(2).Servlet中配置Shiro
在servlet整合shiro,只需要在web.xml中引用shiro的上下文監聽器(讀取shiro配置檔案),並配置shiro過濾器即可,具體如下:
<!-- Shiro直接攔截,不經過spring -->
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<!-- 對應filter-->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<!-- filter Mapping-->
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在web.xml中配置好shiro後,需要在WEB-INF資料夾下書寫shiro.ini的配置檔案,具體如下
[main]
authc.loginUrl = /login
authc.usernameParam = username
authc.passwordParam = password
authc.successUrl = /
authc.failureKeyAttribute = shiroLoginFailure
logout.redirectUrl = /
myrealm = shirospringweb.realm.MyRealm
[users]
liang = 123, role1
wang = 123, role2
[urls]
/ = anon
/test = anon
/test2 = authc
/login = authc
/logout = logout
/** = anon
這樣shiro就可以配合servlet工作了
(3).配置springMVC
最簡單springmvc的配置,只需要配置一個DispatcherServlet,並在其配置檔案(resources/springmvc-base.xml)中開啟包掃描,就好了,具體如下:
<!-- 配置SpringMVC -->
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-base.xml</param-value>
</init-param>
</servlet>
<!-- 對應servlet mapping -->
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
resources/springmvc-base.xml的配置檔案如下(主要是開啟包掃描和註解驅動):
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="shirospringweb.controller"/>
<mvc:annotation-driven />
<!-- 用來處理當 DispatcherServlet 攔截全部請求的時候,它在RequestHandler處撿出靜態資源的請求 -->
<mvc:default-servlet-handler />
</beans>
然後書寫上面shiro配置檔案中的對應controller和前端頁面就可以了。具體如下:
3.1 TestController 及其頁面
TestController的程式碼,如下所示
package shirospringweb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController{
@RequestMapping("/test")
public String testPage(){
return "WEB-INF/pages/test.html";
}
}
對應前端頁面,如下所示(別看他挺多的樣子其實啥也沒有,這裡主要是將了一個在springmvc頁面中也是中文的配置,可以當做沒看見)
<html>
<head>
<title>TestPage</title>
</head>
<body>
TestPage,
<br/>
This Page only display English character.
<br />
To display chineses character, you should add an encoding filter in web.xml, like this
<br />
<br />
<br />
<filter><br />
<filter-name>encodingFilter</filter-name><br />
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><br />
<init-param><br />
<param-name>encoding</param-name><br />
<param-value>UTF-8</param-value><br />
</init-param><br />
<init-param><br />
<param-name>forceEncoding</param-name><br />
<param-value>true</param-value><br />
</init-param><br />
</filter><br />
<filter-mapping><br />
<filter-name>encodingFilter</filter-name><br />
<url-pattern>/*</url-pattern><br />
</filter-mapping><br />
</body>
</html>
3.2 Test2Controller 及其頁面
Test2Controller的程式碼
package shirospringweb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Test2Controller {
@RequestMapping("/test2")
public String getTest2Page(){
return "WEB-INF/pages/test2.html";
}
}
其對應的介面如下:
<html>
<head>
Test 2 Page
</head>
<body>
This is the test 2 page <br/>
(Can not display chinese Character, more information <a href="/app/test">click here</a>)
</body>
</html>
3.3 LoginController 及其對應的介面
LoginController的程式碼
package shirospringweb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginController {
@RequestMapping("/login")
public String getLogin(){
return "WEB-INF/pages/login.html";
}
}
其對應的登入介面
<html>
<head>Login Page</head>
<body>
This is Login Page With No Chinese Character
<br>
<form action="/app/login" method="POST">
username : <input name="username" /><br/>
password : <input name="password" /><br/>
<input type="submit" value="LOGIN"/>
</form>
</body>
</html>
好了,程式碼到這兒完事兒了,下面是執行的效果圖
(4).執行效果
4.1 首先訪問/app/test頁面可以訪問到(shiro未攔截)
頁面如下
4.2 其實訪問/app/test2需要登入,登入後需要後跳轉(可能需要訪問兩次,有一次請求URL會帶引數,這個shiro會報錯,這是shiro的問題,可以百度解決)具體如下:
登入後跳轉
訪問/logout會退出到主頁面,這個就不截圖了
結束了