java - 支柱2.3 : runtime add Interceptor

标签 java struts2 interceptor struts2-interceptors interceptorstack

我有一个任务来添加/更改拦截器运行时(使用插件,无权访问父配置)。

在以前版本的 Struts (2.0) 中,这非常简单:类 InterceptorStackConfigActionConfig 具有方法 addInterceptoraddInterceptors

在较新的版本(2.3)中,该方法已移至Builder静态子类中,我无法像以前一样使用它们。

所以这是一个问题。已经花了好几天的时间试图避免它。有人可以帮忙吗?

我之前的代码示例:

public class IpLoggingInterceptorConfiguration implements ConfigurationProvider {

private Interceptor interceptor;
private Configuration configuration;

@Override
public void init(Configuration configuration) throws ConfigurationException {
    this.configuration = configuration;
}

@Override
public void loadPackages() throws ConfigurationException {

    for (Object packageConfigName : configuration.getPackageConfigNames()) {
        try {
            String name = (String) packageConfigName;
            PackageConfig packageConfig = configuration.getPackageConfig(name);
            updatePackage(packageConfig);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

public void updatePackage(PackageConfig packageConfig) {
    Map interceptorConfigs = packageConfig.getInterceptorConfigs();

    for (Object stack : interceptorConfigs.keySet()) {

        if (!(interceptorConfigs.get(stack) instanceof InterceptorStackConfig)) continue;

        InterceptorStackConfig interceptorStackConfig = (InterceptorStackConfig) interceptorConfigs.get(stack);

        InterceptorMapping interceptorMapping = new InterceptorMapping("iplogging", getInterceptor());

        List<InterceptorMapping> list = new ArrayList<InterceptorMapping>();
        list.addAll(interceptorStackConfig.getInterceptors());
        interceptorStackConfig.getInterceptors().clear();
        interceptorStackConfig.addInterceptor(interceptorMapping);
        interceptorStackConfig.addInterceptors(list);
    }

    for (String key : packageConfig.getActionConfigs().keySet()) {
        ActionConfig actionConfig = packageConfig.getActionConfigs().get(key);

        InterceptorMapping interceptorMapping = new InterceptorMapping("iplogging", getInterceptor());

        List<InterceptorMapping> list = new ArrayList<InterceptorMapping>();
        list.addAll(actionConfig.getInterceptors());
        actionConfig.getInterceptors().clear();
        actionConfig.addInterceptor(interceptorMapping);
        actionConfig.addInterceptors(list);
    }
}


@Override
public void destroy() {
}

@Override
public boolean needsReload() {
    return false;
}

@Override
public void register(ContainerBuilder arg0, LocatableProperties arg1)
        throws ConfigurationException {
}

public Interceptor getInterceptor() {
    return interceptor;
}

public void setInterceptor(Interceptor interceptor) {
    this.interceptor = interceptor;
}
}

最佳答案

我发现并知道,这个解决方案很丑陋,但简单且有效......也许有人有更好的。

try {
            Field interceptorsListField=InterceptorStackConfig.class.getDeclaredField("interceptors");
            interceptorsListField.setAccessible(true);
            List<InterceptorMapping> interceptorsList= (List<InterceptorMapping>) interceptorsListField.get(interceptorStackConfig);

            List<InterceptorMapping> list = new ArrayList<>();
            list.add(interceptorMapping);
            list.addAll(interceptorStackConfig.getInterceptors());
            interceptorsListField.set(interceptorStackConfig,list);
        } catch (Exception e) {
            e.printStackTrace();
        }

关于java - 支柱2.3 : runtime add Interceptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33146652/

相关文章:

java - 在拦截器中获取结果类型

java - 无法在硬编码 java 应用程序中的 jFrame 之间进行更改?

jquery - java-blueimp jquery文件上传List<FileItem>为空?

c# - 通过替换它们的构造函数将工厂模式强制执行到一组特定的类型

java - 从具有struts2的表中删除动态添加的行

jsp - 自定义struts2标签?

angular - 如何设置{观察: 'response' } option globally in Angular 4. 3+?

java - 如何仅使用控制台运行 java 应用程序?

java - 使用 BorderLayout 创建两个偶数列

java - 文件 : spring-security. xml 没有嵌入样式表指令