struts2如何使用拦截器进行用户权限控制实例

下面是详细的 "struts2如何使用拦截器进行用户权限控制实例"攻略,包含两条示例。

Struts2拦截器实现用户权限控制

在Struts2中,我们可以使用拦截器来实现用户权限控制。通过定义自定义的拦截器,在拦截器中可以获取当前用户的权限信息并进行验证,从而决定是否允许当前的请求执行。

实现步骤

以下是使用拦截器实现用户权限控制的基本步骤:

  1. 创建拦截器类
  2. 在拦截器类中实现对用户身份的认证和授权逻辑
  3. 在Struts2配置中声明和配置拦截器
  4. 在需要进行用户权限控制的Action方法上添加拦截器

示例1:基于角色的用户权限控制

假设我们要为一个网站实现以下的用户角色和系统功能授权规则:

  • 包含两个用户角色:管理员和普通用户
  • 管理员可以访问所有系统功能
  • 普通用户只能访问部分系统功能

创建拦截器

需要创建一个名为AuthorizationInterceptor的拦截器类,用于实现对用户的认证和授权逻辑。在这个拦截器类中,判断用户权限是否足够,如果足够则允许请求执行,否则拒绝请求并提示用户。

package com.example.interceptor;

import java.util.ArrayList;
import java.util.List;

import com.example.model.User;
import com.example.util.AuthUtil;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorizationInterceptor extends AbstractInterceptor {
    private static final long serialVersionUID = 1L;

    // 用户角色列表
    private static final List<String> ROLES = new ArrayList<String>();
    static {
        ROLES.add("admin");
        ROLES.add("normal");
    }

    // 系统功能列表
    private static final List<String> ACTIONS = new ArrayList<String>();
    static {
        ACTIONS.add("/system/admin.do");
        ACTIONS.add("/system/user.do");
        ACTIONS.add("/blog/view.do");
        ACTIONS.add("/blog/list.do");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 获取当前用户信息
        User user = AuthUtil.getCurrentUser();

        // 当前用户未登录
        if (user == null) {
            return "login";
        }

        // 判断当前请求是否需要用户权限验证
        String actionName = invocation.getProxy().getActionName();
        if (!ACTIONS.contains("/" + actionName)) {
            // 不需要验证
            return invocation.invoke();
        }

        // 判断用户角色是否足够
        String role = user.getRole();
        if (!ROLES.contains(role)) {
            // 权限不足,拒绝请求
            return "error";
        }

        return invocation.invoke();
    }
}

声明和配置拦截器

struts.xml配置文件中声明拦截器,并为需要进行权限控制的Action方法声明该拦截器。以下是配置文件的示例配置:

<interceptors>
    <interceptor name="authInterceptor" class="com.example.interceptor.AuthorizationInterceptor"/>
    <interceptor-stack name="authStack">
        <interceptor-ref name="authInterceptor"/>
        <interceptor-ref name="defaultStack"/>
    </interceptor-stack>
</interceptors>

<action name="systemAdmin" class="com.example.action.SystemAction" method="admin">
    <interceptor-ref name="authStack"/>
    <result name="success">/system/admin.jsp</result>
</action>

<action name="systemUser" class="com.example.action.SystemAction" method="user">
    <interceptor-ref name="authStack"/>
    <result name="success">/system/user.jsp</result>
</action>

<action name="blogView" class="com.example.action.BlogAction" method="view">
    <interceptor-ref name="authStack"/>
    <result name="success">/blog/view.jsp</result>
</action>

<action name="blogList" class="com.example.action.BlogAction" method="list">
    <interceptor-ref name="authStack"/>
    <result name="success">/blog/list.jsp</result>
</action>

在上面的配置中,我们声明了一个名为authInterceptor的拦截器,该拦截器用于进行用户名和权限的验证,然后定义了一个拦截器栈authStack,该拦截器栈将authInterceptor和默认的拦截器栈defaultStack组合在一起。

然后为需要进行权限控制的Action方法声明该拦截器栈即可。例如,对于SystemAction中的admin()方法,我们为其声明该拦截器栈,以进行权限验证。

添加权限控制拦截器

在需要进行用户权限控制的Action方法上添加刚才声明的拦截器,例如:

package com.example.action;

import com.opensymphony.xwork2.ActionSupport;

public class SystemAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    public String admin() {
        // do something
        return SUCCESS;
    }

    public String user() {
        // do something
        return SUCCESS;
    }
}

在上面的代码中,我们为admin()user()方法添加了authStack拦截器栈,以对用户权限进行验证。

示例2:基于权限控制列表的用户权限控制

接下来我们看一个基于权限控制列表的示例,假设我们有一个配置文件,该文件中列出了每个用户能够访问的系统功能和相应的请求URL,配置文件如下:

[admin]
/system/admin.do
/system/user.do
/system/setting.do
/system/account.do
/blog/view.do

[normal]
/blog/view.do

针对以上的配置文件,我们需要实现如下的权限控制逻辑:

  • 读取配置文件,获取每个用户的权限列表
  • 在拦截器中判断当前请求的URL是否在当前用户的权限列表中
  • 如果在列表中,则允许请求继续执行,否则拒绝请求

读取配置文件

在拦截器的init()方法中,我们需要读取配置文件,获取每个用户的权限列表。以下是示例代码:

package com.example.interceptor;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.example.model.User;
import com.example.util.AuthUtil;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorizationInterceptor extends AbstractInterceptor {
    private static final long serialVersionUID = 1L;

    // 权限配置文件路径
    private static final String AUTH_CONFIG_FILE = "/path/to/auth.conf";
    // 用户权限列表
    private static final Map<String, List<String>> AUTH_MAP = new HashMap<String, List<String>>();

    static {
        // 读取配置文件
        try {
            FileInputStream fis = new FileInputStream(AUTH_CONFIG_FILE);
            BufferedReader br = new BufferedReader(new InputStreamReader(fis));

            String line;
            String currentRole = null;
            List<String> currentList = null;

            while ((line = br.readLine()) != null) {
                line = line.trim();
                if (line.startsWith("[") && line.endsWith("]")) {
                    // 分行读取权限配置
                    if (currentRole != null && currentList != null) {
                        AUTH_MAP.put(currentRole, currentList);
                    }

                    currentRole = line.substring(1, line.length() - 1);
                    currentList = new ArrayList<String>();
                } else {
                    currentList.add(line);
                }
            }

            // 添加最后一组权限配置
            if (currentRole != null && currentList != null) {
                AUTH_MAP.put(currentRole, currentList);
            }

            br.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void init() {
        super.init();
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 获取当前用户信息
        User user = AuthUtil.getCurrentUser();

        // 当前用户未登录
        if (user == null) {
            return "login";
        }

        // 判断当前请求是否需要用户权限验证
        String actionName = invocation.getProxy().getActionName(); // "/system/admin.do"
        String fullName = invocation.getProxy().getNamespace().substring(1) + "/" + actionName; // "system/admin.do"

        List<String> authList = AUTH_MAP.get(user.getRole());
        if (authList != null && authList.contains(fullName)) {
            // 用户权限验证通过,允许请求执行
            return invocation.invoke();
        } else {
            // 用户权限验证失败,拒绝请求
            return "error";
        }
    }
}

在Struts2配置中声明和配置拦截器

在Struts2的配置文件struts.xml中,我们需要声明和配置刚才创建的拦截器,实现基于权限控制列表的用户权限控制。以下是示例配置:

<interceptors>
    <interceptor name="authInterceptor" class="com.example.interceptor.AuthorizationInterceptor"/>
    <interceptor-stack name="authStack">
        <interceptor-ref name="authInterceptor"/>
        <interceptor-ref name="defaultStack"/>
    </interceptor-stack>
</interceptors>

<action name="systemAdmin" class="com.example.action.SystemAction" method="admin">
    <interceptor-ref name="authStack"/>
    <result name="success">/system/admin.jsp</result>
</action>

<action name="systemUser" class="com.example.action.SystemAction" method="user">
    <interceptor-ref name="authStack"/>
    <result name="success">/system/user.jsp</result>
</action>

<action name="blogView" class="com.example.action.BlogAction" method="view">
    <interceptor-ref name="authStack"/>
    <result name="success">/blog/view.jsp</result>
</action>

<action name="blogList" class="com.example.action.BlogAction" method="list">
    <interceptor-ref name="authStack"/>
    <result name="success">/blog/list.jsp</result>
</action>

在上面的配置中,我们声明了一个名为authInterceptor的拦截器,该拦截器用于进行用户名和权限的验证,然后定义了一个拦截器栈authStack,该拦截器栈将authInterceptor和默认的拦截器栈defaultStack组合在一起。

然后为需要进行权限控制的Action方法声明该拦截器栈即可。

添加权限控制拦截器

在需要进行用户权限控制的Action方法上添加刚才声明的拦截器,例如:

package com.example.action;

import com.opensymphony.xwork2.ActionSupport;

public class SystemAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    public String admin() {
        // do something
        return SUCCESS;
    }

    public String user() {
        // do something
        return SUCCESS;
    }
}

在上面的代码中,我们为admin()user()方法添加了authStack拦截器栈,以对用户权限进行验证。

结语

总结一下,本文通过两个示例讲解了如何使用Struts2拦截器实现用户权限控制。无论是基于角色的权限控制还是基于权限控制列表的权限控制,都可以通过拦截器实现。

不过需要注意的是,在进行用户权限控制时,需要将用户身份信息存储在Session中,并在拦截器中获取并进行验证。同时,也需要注意防止拦截器造成性能问题,对拦截器进行必要的优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2如何使用拦截器进行用户权限控制实例 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Maven deploy配置方法详解

    Maven deploy配置方法详解 在Maven项目中,使用deploy命令可以将项目打包并发布到Maven仓库中。下面详细介绍Maven deploy的配置方法。 1. 配置POM文件 在Maven项目的pom.xml文件中,需要配置Maven的distributionManagement节点。该节点的repository子节点配置发布到的Maven仓库…

    Java 2023年5月19日
    00
  • Java中InputSteam怎么转String

    转换InputStream为String,可以使用Java中的Scanner类、BufferedReader类、ByteArrayOutputStream类、StringBuilder类等方式。 其中,Scanner类适用于转换小型InputStream,BufferedReader适用于转换大型InputStream,ByteArrayOutputStre…

    Java 2023年5月26日
    00
  • jsp Response对象页面重定向、时间的动态显示

    JSP Response对象是JSP页面中的内置对象,可以用于控制页面的输出内容和实现页面的重定向。本文将详细讲解JSP Response对象的两个重要功能:页面重定向和时间的动态显示,并且会给出两个示例说明。 页面重定向 页面重定向是指当浏览器访问一个JSP页面时,服务器将浏览器的请求重定向到另一个页面,这个过程叫做页面重定向。一般情况下,页面重定向是由服…

    Java 2023年6月15日
    00
  • Java 单例模式线程安全问题

    Java 单例模式是一种常见的设计模式,它的目的是确保一个类只有一个对象实例,并提供了一个全局唯一的访问点。 单例模式的实现方法有很多,其中最常见的是双重检查锁定(Double-Checked Locking)和静态内部类(Static Inner Class)两种方式。但这些实现方式往往存在线程安全问题,需要特别注意。 1. 双重检查锁定的线程安全问题 双…

    Java 2023年5月19日
    00
  • Java基础学习之字符串知识总结

    Java基础学习之字符串知识总结 1. 字符串的定义 在Java中,字符串(String)是一种引用类型,用于表示一组字符序列。字符串可以包含任何可打印的字符,包括数字、字母、标点符号和空格等。 在Java中,字符串的定义方式有两种: 直接使用双引号括起来的文本:String str1 = “Hello World”; 使用String类的构造函数来创建字符…

    Java 2023年5月26日
    00
  • Java 实战项目之教材管理系统的实现流程

    Java 实战项目之教材管理系统的实现流程 本文讲解如何使用Java实现一个教材管理系统。教材管理系统主要包括以下功能: 学生信息管理:包括学生信息的添加、删除、修改和查询等操作。 课程信息管理:包括课程信息的添加、删除、修改和查询等操作。 教材信息管理:包括教材信息的添加、删除、修改和查询等操作。 学生成绩管理:包括学生成绩的添加、删除、修改和查询等操作。…

    Java 2023年5月24日
    00
  • log4j 文件输出

    关于log4j文件输出的攻略,我们可以参考以下步骤: 1. 引入log4j依赖 要使用log4j进行文件输出,我们需要在项目中引入相关的依赖。我们可以通过Maven或者Gradle等构建工具来进行引入,下面是一个Maven的示例: <dependency> <groupId>org.apache.logging.log4j</g…

    Java 2023年6月15日
    00
  • Java的Struts框架报错“NullForwardConfigException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“NullForwardConfigException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,需要检查文件以解决此问题。 转发名称:如果转发名称不正确,则可能出现此错误。在这种情况下,需要检查转发名称以解决此问题。 以下是两个实例: 例 1 …

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部