使用 Struct2 框架的攔截器 實現權限管理功能

項目已經更新至:PowerManager

一、項目基本介紹

  1. 項目系統擁有三種用戶類型

    1. 普通用戶 (只具備信息查詢的功能)
    2. 系統管理員 (只具備查詢,添加,和修改的功能)
    3. 系統維護員 (具備所有功能,增刪改查)
    4. 一些關鍵信息要隱藏
  2. 項目基本邏輯

    1. 具備最基本的登錄功能
    2. 具備數據展示功能
    3. 項目側重於權限管理功能,所以(增加,修改,刪除功能並沒有去實現)

二、項目環境搭建

  1. 開發工具 idea 2019 專業版, jdk 1.8
  2. 數據庫 MySQL 5.7, 數據庫可視化工具 SqlYog
  3. 使用 Maven 工具構架一個 Java Web 項目,並添加 Struct2 的依賴, 見 pom.xml
  4. 第三方 jar 包:jstl-1.2.jar + standard.jar + mysql 5.1.10 版本驅動
  5. 服務器版本:Tomcat 9
  6. 其他 Struct2 配置文件, BootStrap 支持

三、項目結構搭建

3.1 前端 + 後端結構

在這裏插入圖片描述

3.2 前端主要頁面

  1. 登錄界面
    在這裏插入圖片描述
  2. 主頁
    3.
  3. 查詢頁面,其他頁面類似
    在這裏插入圖片描述
  4. 權限不足時,禁止訪問頁面
    在這裏插入圖片描述

3.3 後端核心邏輯實現 (使用 struct2 攔截功能)

  1. 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>
  1. 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>    
  1. 編寫用戶管理的邏輯 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";
    }

}

  1. 編寫類攔截器
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 ;
    }
}
  1. 然後前端訪問 UserManagerAction 的特定方法,會根據用戶的 status 是否有 “有資格” 進行操權限操作,如果沒有權限請求就會被攔截,跳轉至 error.jsp 界面

如果有需要可以在這裏看到項目信息:PowerManager

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章