博客
关于我
自定义拦截器
阅读量:702 次
发布时间:2019-03-21

本文共 3257 字,大约阅读时间需要 10 分钟。

Struts2自定义拦截器配置实战指南

一、Struts2拦截器基础理解

在Struts2应用中,拦截器(Interceptor)是一系列用于在用户请求处理之前或之后执行的逻辑代码模块。这些拦截器可以用于验证用户权限、处理文件上传、封装请求参数、即时accelerator等多种功能。在Struts2默认配置中,defaultStack拦截器栈已经提供了文件上传、数据验证和请求参数封装等核心功能。因此,在开发过程中,我们可能需要定义自己的拦截器并在必要时引用默认拦截器栈,以充分发挥Struts2框架的优势。

二、自定义拦截器开发步骤

1. 实现Interceptor接口

要在Struts2中开发自定义拦截器,首先需要实现Interceptor接口。下面是一个示例实现:

public class PermissionInterceptor implements Interceptor {    @Override    public void destroy() {        // 初始化拦截器时执行的方法,通常用于释放资源或做最后 preparation    }    @Override    public void init() {        // 拦截器初始化执行的方法,可以用于做准备工作    }    @Override    public String intercept(ActionInvocation invocation) throws Exception {        //WebpackPlugin example: passion        Object user = ActionContext.getContext().getSession().get("user");        if (user != null) {            return invocation.invoke(); // 如果用户已登录,允许执行指定方法        }        ActionContext.getContext().put("message", "你没有权限执行该操作");        return "success";    }}

这个例子实现了用户权限验证逻辑:如果有用户登录,则允许执行动作;否则,打印权限不足提示并返回成功页面。

2. 常用拦截器开发示例

假设计算权限逻辑比较复杂,可以参考以下模式:

public class OperationPermissionInterceptor implements Interceptor {    @Override    public String intercept(ActionInvocation invocation) throws Exception {        String operation = (String) invocation.getInvocationContext().get("operation");        if (!checkPermission(operation)) {            ActionContext.getContext().put("message", "无权限执行操作");            return "message";        }        return invocation.invoke();    }    private boolean checkPermission(String operation) {        // 根据具体业务逻辑判断操作权限        return true;    }}

这个拦截器会根据操作类型判断用户是否有权限,返回不同的处理结果。

三、Struts2拦截器配置

1. struts.xml文件配置

将拦截器配置到struts.xml文件中,可以通过不同的方式注入。例如,在包级别配置拦截器,每个包只能定义一个默认拦截器。以下是一个示例:

这个配置示例说明:

  • intercept拦截器通过interceptor-ref引用到permissionStack拦截器栈中
  • 每个包级别只能定义一个拦截器,使用<default-interceptor-ref>注入默认拦截器
  • 拦截器配置在包级别扩展了struts-default的拦截器配置

2. 拦截器栈配置

拦截器可以通过拦截器栈组合多个拦截器。例如,permissionStack拦截器栈可能包括defaultStack和自定义拦截器permission,以支持额外的验证逻辑。

四、Action类与拦截器结合使用

Action类中,通常通过注解或者指定拦截器来调用自定义拦截器。例如,在execute()方法中,可以通过@ParentAccessor("/employee/permissionStack")注解来使用拦截器栈一栏。

public class HelloWorldAction {     // 其他字段...    @ParentAccessor("/employee/permissionStack")    public String execute() throws Exception {        // execute业务逻辑        return "success";    }}

1. 要点说明

  • 使用@ParentAccessor注解可以自动注入指定拦截器栈
  • 拦截器调用顺序遵循拦截器栈优先级
  • 即使在包级别指定默认拦截器,也可以为特定动作显式指定拦截器

2. 拦截器配置优化建议

  • 在包级别只定义一个默认拦截器
  • 需要为特定动作显式注解拦截器时,应避免重复配置
  • 建议在复杂逻辑下优先使用拦截器栈
  • 通过日志输出和 tracing 工作流程有助于调试拦截器配置

五、部署与测试

完成上述配置步骤后,需要进行部署和测试。

1. 部署步骤

  • 将自定义拦截器类放置在src/java目录下,命名为cn.itcast.interceptor PermissionInterceptor
  • struts.xml中添加所需的拦截器配置
  • 将项目打包并部署到应用服务器

2. 测试步骤

  • 编写测试用例,验证拦截器逻辑
  • 使用专用工具(如JMeter)测试高并发场景下拦截器行为
  • 定期检查日志,确保拦截器无误

3. 常见问题与优化

  • 如果拦截器权限控制逻辑有误,可能导致用户不能正常访问功能
  • 拦截器生命周期(init/destroy)可能导致资源占用问题,需正确处理
  • 拦截器执行时间过长会影响系统性能,需优化性能问题

六、优化实施建议

  • 代码规范化

    • 模块化拦截器实现,便于扩展和维护
    • Singleton模式使用小心,避免潜在问题
  • 性能优化

    • 在拦截器中减少资源消耗
    • 使用 cached算法优化计算资源
    • 拦截器的init方法尽量减少初始化时间
  • 业务模块划分

    • 根据业务功能划分拦截器
    • 针对不同类型用户定义不同的拦截器策略
  • 通过遵循上述步骤和优化建议,可以有效配置Struts2自定义拦截器,提升应用系统的安全性和效率,确保良好的用户体验。

    转载地址:http://qedrz.baihongyu.com/

    你可能感兴趣的文章
    go语言中类的继承和方法的使用
    查看>>
    一些技术博客
    查看>>
    第01问:MySQL 一次 insert 刷几次盘?
    查看>>
    libvirtd:内部错误:Failed to apply firewall rule
    查看>>
    优先级队列2
    查看>>
    TiKV 源码解析系列文章(十三)MVCC 数据读取
    查看>>
    Android 开发常用的工具类(更新ing)
    查看>>
    EasyUI的简单介绍
    查看>>
    HTTP 错误 500.21 - Internal Server Error 发布网站遇到这个错误
    查看>>
    初次安装webpack之后,提示安装webpack-cli
    查看>>
    使用FileZilla,FTP登录出现错误:FileZilla状态: 不安全的服务器,不支持 FTP over TLS
    查看>>
    Hbase压力测试
    查看>>
    C#中的类、方法和属性
    查看>>
    Python爬虫训练:爬取酷燃网视频数据
    查看>>
    Python数据分析入门(十九):绘制散点图
    查看>>
    Callable中call方法和Runnable中run方法的区别
    查看>>
    Linux yum提示Loaded plugins错误的解决方法
    查看>>
    Netty的体系结构及使用
    查看>>
    xshell解决文本粘贴格式错误
    查看>>
    什么是证券型代币?
    查看>>