NutzCN Logo
问答 ActionFiltersProcessor 与 AdaptorProcessor 的先后顺序遇到的问题
发布于 2109天前 作者 wqmain 1758 次浏览 复制 上一个帖子 下一个帖子
标签:

之前遇到的问题是:自定义ActionFilter中,context.getMethodArgs()为null,请参见之前的问题帖子:
https://nutz.cn/yvr/t/4k736uofqoh0iraggqkcp34ipq
按照之前wendal兽总说的重新定了了chain.js中ActionFiltersProcessor和AdaptorProcessor的顺序,并在MainModule上用注解声明后解决了:@ChainBy(args = { "${app.root}/WEB-INF/classes/ioc/chain.js" })
现在的问题是:我之前自定义了其它的ActionFilter,里面主要是使用自定义的MyHttpServletRequest(继承了HttpServletRequestWrapper)来操作请求中的参数,比如特殊字符编码、过滤等(相关代码见下文)。
但自从 ActionFiltersProcessor 放在 AdapterProcessor 之后起,MyHttpServletRequest的处理相当于无效了,简单跟了断点,发现Action方法参数都注入完了之后才走的 MyHttpServletRequest 里的方法。

请问,我该如何处理让MyHttpServletRequest 的处理继续生效并且ActionFilter的match中context.getMethodArgs()依旧可以获取到方法参数值呢?

public class WordFilter implements ActionFilter {

    public View match(ActionContext context) {
        HttpServletRequest req = context.getRequest();
        //... 无关代码已省略
        context.setRequest(new MyHttpServletRequest(req));
		//... 无关代码已省略
        return null;
    }
}
var chain = {
	"default" : {
		"ps" : [
			"org.nutz.mvc.impl.processor.UpdateRequestAttributesProcessor",
			"org.nutz.mvc.impl.processor.EncodingProcessor",
			"org.nutz.mvc.impl.processor.ModuleProcessor",
			"!org.nutz.integration.shiro.NutShiroProcessor",
			"org.nutz.mvc.impl.processor.AdaptorProcessor",
            "org.nutz.mvc.impl.processor.ActionFiltersProcessor",
			"!org.nutz.plugins.validation.ValidationProcessor",
			"org.nutz.mvc.impl.processor.MethodInvokeProcessor",
			"org.nutz.mvc.impl.processor.ViewProcessor"
		],
		"error" : 'org.rings.framework.files.logs.processor.MyFailProcessor'
	}
}
3 回复

办法有几个

  1. 再加一个处理器

  2. 动作链可以定义多个key-value,默认是default,通过@Chain注解可以为某个类/某个入口方法单独配置一种动作链key

  3. 自定义ChainMaker,根据不同的入口方法返回不同的组合

@wendal 感谢兽总!按照你提供的思路解决了。我是想通用的配置处理,所以用了方法1,自定义了MyAdapterProcessor 直接继承自 AdaptorProcessor ,然后在chain.js中将MyAdapterProcessor 置于 ActionFiltersProcessor 之前,如下:

public class MyAdapterProcessor extends AdaptorProcessor {

	public void process(ActionContext ac) throws Throwable {
		HttpServletRequest req = ac.getRequest();
		String url = Mvcs.getRequestPath(req);
		//if(...) {//TODO 过滤特殊字符的限定条件
			ac.setRequest(new MyHttpServletRequest(req));
		//}
		super.process(ac);
	}
	
}
var chain = {
	"default" : {
		"ps" : [
			"org.nutz.mvc.impl.processor.UpdateRequestAttributesProcessor",
			"org.nutz.mvc.impl.processor.EncodingProcessor",
			"org.nutz.mvc.impl.processor.ModuleProcessor",
			"!org.nutz.integration.shiro.NutShiroProcessor",
			"demo.MyAdapterProcessor",
            "org.nutz.mvc.impl.processor.ActionFiltersProcessor",
			"!org.nutz.plugins.validation.ValidationProcessor",
			"org.nutz.mvc.impl.processor.MethodInvokeProcessor",
			"org.nutz.mvc.impl.processor.ViewProcessor"
		],
		"error" : 'demo.MyFailProcessor'
	}
}

@wendal 兽总,再请教个问题:MainModule上配置的@ChainBy注解指定的chain.js必须是当前工程源码编译路径下的吗?这个chain.js可不可以是当前工程lib目录下某个jar包内的呢?

@SetupBy(value = MainSetup.class)
@ChainBy(args = { "${app.root}/WEB-INF/classes/ioc/chain.js" })
public class MainModule {
}
添加回复
请先登陆
回到顶部