首先說一下shiro在web程序中的運作流程
shiro就像是一個包裹着web應用程序的罩子,所有的用戶請求都需要經過shiro這一層罩子,經過shiro這層罩子以後,就會接着通過一條循環的過濾器鏈,從上到下通過,在經過與該請求適配的過濾器時就會對該請求進行檢測如果檢測通過那麼就返回該請求的結果,否則就跳轉到相應的失敗頁面。流程如下圖所示:
首先我們先配置shiro的依賴,SSM框架的依賴請各位自行導入
<!-- ============ shiro ============ -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.4.0</version>
</dependency>
之後便是配置MVC的web.xml文件
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
之後就是相應的mvc.xml文件
beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 告知springmvc 哪些包中 存在 被註解的類
use-default-filters="false" 遇到到 @Controller @Service @Repository @Component類,都會忽略
-->
<context:component-scan base-package="com.qianfeng" use-default-filters="false">
<!-- 只掃描 有@Controller註解的類 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 註冊註解開發驅動 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 視圖解析器
作用:1.捕獲後端控制器的返回值="index"
2.解析: 在返回值的前後 拼接 ==> "/index.jsp"
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property><!-- 前綴 -->
<property name="suffix" value=".jsp"></property><!-- 後綴 -->
</bean>
<!-- 在項目中 自動添加一個 映射{"/**" : DefaultServletHttpRequestHandler}
請求進入前端後,會先匹配自定義的Handler,如果沒有匹配的則進入DefaultServletHttpRequestHandler。
DefaultServletHttpRequestHandler會將請求轉發給Tomcat中名爲"default"的servlet。
最終實現了靜態資源的訪問
-->
<mvc:default-servlet-handler/>
</beans>
之後我們編寫一個簡單的頁面來實現用戶身份信息的校驗
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陸頁面</title>
</head>
<style>
label{
display: block;
}
</style>
<body>
<form action="/user/login" method="post">
<label>用戶名: <input type="text" name="username"></label>
<label>密碼: <input type="text" name="password"></label>
<input type="submit" value="登陸">
</form>
</body>
</html>
之後我們編寫一個User的實體類
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String username;
private String password;
}
之後我們編寫一個簡單的controller類來進行簡單的邏輯驗證
mport com.qianfeng.pojo.User;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String login()
{
System.out.println("go to login");
return "login";
}
@PostMapping("/login")
public String loginLogic(User user)
{
System.out.println("login logic");
//獲取subject
Subject subject=SecurityUtils.getSubject();
//創建令牌
UsernamePasswordToken token=new UsernamePasswordToken(user.getUsername(),user.getPassword());
//登錄失敗拋出異常,交由異常解析器
subject.login(token);
return "index";
}
@RequestMapping("/all")
public String queryAllUsers()
{
System.out.println("query all users");
return "index";
}
@RequestMapping("/perms/error")
public String performer()
{
System.out.println("權限不足");
return "error";
}
}
之後我們便可以運行程序查看實際的運行過程,可以發現當用戶未登錄或者登陸失敗時都會重新跳轉到登陸界面來。如圖所示: