【OA】——用Struts2拦截器实现对每一个请求的权限判断

2024-08-21 15:38

本文主要是介绍【OA】——用Struts2拦截器实现对每一个请求的权限判断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

需求:


     我们在做系统的时候,使用系统的用户经常会分为很多种角色。比如什么都可以访问的admin,只能管理论坛的管理员。等等。我们系统中就遇到了权限分配的问题,那什么是权限,权限就是对系统功能的使用,功能就是开发出来的url,对功能的控制就是对url的控制,拦截器器要实现Interceptor接口,或是继承AbstractInterceptor类。





整体思路是这样的:


// 1,如果未登录

// >> 如果不是正在使用登录功能,就转到登录页面

// >> 如果正在使用登录功能,就放行

// 2,如果已登录

// >> 如果有权限,就放行

// >> 如果没有权限,就转到“没有权限的错误提示页面”





 自定义拦截器的实现:


<span style="font-family:KaiTi_GB2312;font-size:18px;">package cn.itcast.oa.util;import cn.itcast.oa.domain.User;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class CheckPrivilegeInterceptor extends AbstractInterceptor {public String intercept(ActionInvocation invocation) throws Exception {// 获取信息User user = (User) ActionContext.getContext().getSession().get("user"); // 当前登录用户String namespace = invocation.getProxy().getNamespace();String actionName = invocation.getProxy().getActionName();String privUrl = namespace + actionName; // 对应的权限URL// 如果未登录if (user == null) {if (privUrl.startsWith("/user_login")) { // "/user_loginUI", "/user_login"// 如果是去登录,就放行return invocation.invoke();} else {// 如果不是去登录,就转到登录页面return "loginUI";}}// 如果已登 录,就判断权限else {if (user.hasPrivilegeByUrl(privUrl)) {// 如果有权限,就放行return invocation.invoke();} else {// 如果没有权限,就转到提示页面return "noPrivilegeError";}}}}
</span>



        在用户实体类中,有一个方法是根据url判断本用户是否有指定的URL权限,就是上面调用了hasPrivilegeByUrl。

<span style="font-family:KaiTi_GB2312;font-size:18px;">public boolean hasPrivilegeByUrl(String privUrl) {// 超级管理有所有的权限if (isAdmin()) {return true;}// >> 去掉后面的参数int pos = privUrl.indexOf("?");if (pos > -1) {privUrl = privUrl.substring(0, pos);}// >> 去掉UI后缀if (privUrl.endsWith("UI")) {privUrl = privUrl.substring(0, privUrl.length() - 2);}// 如果本URL不需要控制,则登录用户就可以使用Collection<String> allPrivilegeUrls = (Collection<String>) ActionContext.getContext().getApplication().get("allPrivilegeUrls");if (!allPrivilegeUrls.contains(privUrl)) {return true;} else {// 普通用户要判断是否含有这个权限for (Role role : roles) {for (Privilege priv : role.getPrivileges()) {if (privUrl.equals(priv.getUrl())) {return true;}}}return false;}}</span>


        我们还需要在Struts.xml配置文件中去声明拦截器,重新定义默认的拦截器栈,还有,是如何跳入没有权限的提示界面呢。也是在Struts.xml中配置了一个Global-result节点,不管是哪个action的访问,都可以进入。


Struts.xml:


<span style="font-family:KaiTi_GB2312;font-size:18px;"><interceptors><!-- 声明拦截器 --><interceptor name="checkPrivilege" class="cn.itcast.oa.util.CheckPrivilegeInterceptor"></interceptor><!-- 重新定义默认的拦截器栈 --><interceptor-stack name="defaultStack"><interceptor-ref name="checkPrivilege"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 全局的Result配置 --><global-results><result name="loginUI">/WEB-INF/jsp/userAction/loginUI.jsp</result><result name="noPrivilegeError">/noPrivilegeError.jsp</result></global-results></span>




总结:


      之前在一个网上商城的项目中也用到了拦截器,是在登陆的时候判断的,是否可以登陆访问资源。拦截器的使用可以在action的前后进行一些业务处理,Struts2核心功能放在了拦截器上,这样大大增加了Struts的实用性和灵活可控。在xml中进行简单的配置就可以,前提是命名要规范。每个action都默认的继承defaultStack,如果你用了别的拦截器,还需要手动引入defaultStack。因为登录和访问权限拦截是全局的,拦截返回的结果有些也是全局的。

      第二次的使用对拦截器更加熟悉了。

这篇关于【OA】——用Struts2拦截器实现对每一个请求的权限判断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093574

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核