使用 Struct2 框架的攔截器 實現權限管理功能
項目已經更新至:PowerManager
一、項目基本介紹
-
項目系統擁有三種用戶類型
- 普通用戶 (只具備信息查詢的功能)
- 系統管理員 (只具備查詢,添加,和修改的功能)
- 系統維護員 (具備所有功能,增刪改查)
- 一些關鍵信息要隱藏
-
項目基本邏輯
- 具備最基本的登錄功能
- 具備數據展示功能
- 項目側重於權限管理功能,所以(增加,修改,刪除功能並沒有去實現)
二、項目環境搭建
- 開發工具 idea 2019 專業版, jdk 1.8
- 數據庫 MySQL 5.7, 數據庫可視化工具 SqlYog
- 使用 Maven 工具構架一個 Java Web 項目,並添加 Struct2 的依賴, 見 pom.xml
- 第三方 jar 包:jstl-1.2.jar + standard.jar + mysql 5.1.10 版本驅動
- 服務器版本:Tomcat 9
- 其他 Struct2 配置文件, BootStrap 支持
三、項目結構搭建
3.1 前端 + 後端結構
3.2 前端主要頁面
- 登錄界面
- 主頁
- 查詢頁面,其他頁面類似
- 權限不足時,禁止訪問頁面
3.3 後端核心邏輯實現 (使用 struct2 攔截功能)
- web.xml 配置 struct2 的過濾器
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*</url-pattern><!-- /*過濾所有路徑 * -->
</filter-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
- structs.xml 配置
主要配置攔截器
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="aaaa" namespace="/" extends="struts-default">
<!-- 配置一個攔截器-->
<interceptors>
<interceptor name="m1" class="cn.gorit.interceptor.UserInterceptor"></interceptor>
</interceptors>
<!-- 賬戶驗證 -->
<action name="checkLogin" class="cn.gorit.action.LoginAction" method="checkLogin">
<result name="success" type="redirect">/index.jsp</result>
<result name="wrong" type="redirect">/login.jsp</result>
</action>
<!-- 獲取數據庫中的所有用戶信息 -->
<action name="getAllUser" class="cn.gorit.action.UserManagerAction" method="getAllUser">
<result name="success" type="redirect">/show.jsp</result>
</action>
<!-- 添加用戶,這裏就要設置對應的攔截器了 -->
<action name="addUser" class="cn.gorit.action.UserManagerAction" method="addUser">
<result name="success" type="redirect">/addUser.jsp</result>
<result name="error" type="redirect">/error.jsp</result>
<interceptor-ref name="m1"></interceptor-ref>
<!-- 手動配置攔截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<!-- 刪除用戶 -->
<action name="deleteUser" class="cn.gorit.action.UserManagerAction" method="deleteUser">
<result name="success" type="redirect">/deleteUser.jsp</result>
<result name="error" type="redirect">/error.jsp</result>
<interceptor-ref name="m1"></interceptor-ref>
<!-- 手動配置攔截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<!-- 修改用戶 -->
<action name="updateUser" class="cn.gorit.action.UserManagerAction" method="updateUser">
<result name="success" type="redirect">/editUser.jsp</result>
<result name="error" type="redirect">/error.jsp</result>
<interceptor-ref name="m1"></interceptor-ref>
<!-- 手動配置攔截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>
- 編寫用戶管理的邏輯 UserManagerAction
package cn.gorit.action;
import cn.gorit.dao.Impl.UserDaoImpl;
import cn.gorit.dao.UserDao;
import cn.gorit.entity.User;
import com.opensymphony.xwork2.ActionContext;
import java.util.ArrayList;
import java.util.Map;
// 用戶管理
public class UserManagerAction {
// 獲取所有用戶的操作
public String getAllUser() {
System.out.println("獲取所有的用戶~");
ActionContext ac = ActionContext.getContext(); // struct2 相當於 session
Map<String, Object> session = ac.getSession();
UserDao dao = new UserDaoImpl();
ArrayList<User> list = dao.queryAllUser();
session.put("list",list);
return "success";
}
public String addUser() {
System.out.println("添加用戶的操作~");
ActionContext ac = ActionContext.getContext(); // struct2 相當於 session
Map<String, Object> session = ac.getSession();
UserDao dao = new UserDaoImpl();
ArrayList<User> list = dao.queryAllUser();
session.put("list",list);
int status = (int) session.get("status");
if (status == 2 || status == 3) {
return "success";
}
return "error";
}
public String deleteUser() {
System.out.println("刪除用戶的操作~");
ActionContext ac = ActionContext.getContext(); // struct2 相當於 session
Map<String, Object> session = ac.getSession();
UserDao dao = new UserDaoImpl();
ArrayList<User> list = dao.queryAllUser();
session.put("list",list);
int status = (int) session.get("status");
if (status == 3) {
return "success";
}
return "error";
}
public String updateUser() {
System.out.println("更新用戶的操作~");
System.out.println("刪除用戶的操作~");
ActionContext ac = ActionContext.getContext(); // struct2 相當於 session
Map<String, Object> session = ac.getSession();
UserDao dao = new UserDaoImpl();
ArrayList<User> list = dao.queryAllUser();
session.put("list",list);
int status = (int) session.get("status");
if (status == 2 || status == 3) {
return "success";
}
return "error";
}
}
- 編寫類攔截器
package cn.gorit.interceptor;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.util.Map;
// 類戶攔截器
public class UserInterceptor extends AbstractInterceptor {
// 攔截器在上面的 structs.xml 都配置了
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("攔截器開始工作了~");
String str = "error";
ActionContext ac = arg0.getInvocationContext();
Map<String,Object> session = ac.getSession();
str = arg0.invoke();
if (str.equals("error")) {
session.put("error","你的權限不足,禁止訪問該頁面");
}
return str ;
}
}
- 然後前端訪問 UserManagerAction 的特定方法,會根據用戶的 status 是否有 “有資格” 進行操權限操作,如果沒有權限請求就會被攔截,跳轉至 error.jsp 界面
如果有需要可以在這裏看到項目信息:PowerManager