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

yizhihongxing

下面是详细的 "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日

相关文章

  • JavaWeb Servlet中url-pattern的使用

    当我们开发JavaWeb应用程序时,Servlet是最常用的核心组件之一。而servlet和客户端交互时,url-pattern就是一个非常重要的属性。本篇文章将详细讲解JavaWeb Servlet中url-pattern的使用,包括其用途、语法、注意事项以及两个示例。 一、url-pattern的用途 url-pattern是Servlet负责处理HTT…

    Java 2023年6月15日
    00
  • Unicode、UTF-8 和 ISO8859-1区别解析

    让我来讲解一下”Unicode、UTF-8 和 ISO8859-1区别解析”。 什么是 Unicode Unicode是一种由国际组织维护的全球字符集标准。它的目标是支持世界上所有字符集,并成为一种数字化的字符编码方案。 Unicode字符集包括ASCII码字符集,而且还包括通用秒(第0平面)字符,这是其他字符集都没有的。通用多文本字符集,包括汉字字符集(第…

    Java 2023年5月20日
    00
  • java.lang.NumberFormatException异常解决方案详解

    Java.lang.NumberFormatException异常解决方案详解 什么是NumberFormatException异常? NumberFormatException异常是Java程序中常见的异常之一,表示将字符串转换为数字时出现错误。当字符串不符合数字格式或超出数字范围时,会抛出该异常。 解决方案 出现NumberFormatException…

    Java 2023年5月27日
    00
  • logback日志输出格式设置方式

    下面是“logback日志输出格式设置方式”的完整攻略。 定义日志输出格式 在使用logback日志框架时,可以通过配置文件来定义日志输出格式。logback支持两种方式来定义日志输出格式:PatternLayout和encoder。 PatternLayout 在logback中,可以通过PatternLayout来自定义日志输出格式。通过指定一个格式化字…

    Java 2023年5月26日
    00
  • Spring Boot实现功能的统一详解

    Spring Boot实现功能的统一详解 什么是Spring Boot Spring Boot是一个基于Spring框架的快速开发框架,它通过自动化配置、约定优于配置等方式,帮助我们快速构建Spring应用程序。使用Spring Boot可以大大降低Spring应用程序的开发难度和维护成本。 常见功能的实现 1. 数据库操作 Spring Boot提供了丰富…

    Java 2023年5月20日
    00
  • 浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    Java中实现对象拷贝通常有两种方式:浅拷贝和深拷贝。浅拷贝只复制原对象中所有基本数据类型的值和引用类型变量的地址,而深拷贝则是在堆中重新开辟空间,将原对象的所有属性都复制到新的对象中去,新的对象与原始对象没有任何关联。本文将讲解Java中实现深拷贝的两种方式:clone()和Serialized。 使用clone()方法实现深拷贝 Java中Object类…

    Java 2023年5月19日
    00
  • JavaWeb Servlet技术及其应用实践

    JavaWeb Servlet技术及其应用实践 什么是Servlet? Servlet是JavaWeb中的一个组件,是JavaWeb中实现业务逻辑的重要方式之一。在JavaWeb中,Servlet让我们可以获取HTTP请求的参数、读写HTTP头信息、返回HTTP响应、写入HTTP头信息等。 Servlet的应用实践 基础应用 我们可以通过以下步骤使用Serv…

    Java 2023年5月20日
    00
  • Java实现数组反转翻转的方法实例

    下面是详细的攻略: 前言 数组反转是一个经典的问题,本文将介绍在Java中实现数组反转的多种方法。 方法一:使用for循环 最容易想到的方法是使用for循环,将数组的前后元素依次交换。 代码实现: int[] arr = {1, 2, 3, 4, 5}; for (int i = 0; i < arr.length / 2; i++) { int te…

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