4
回答
如何向拦截器或Validator传入参数
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

@JFinal 你好,又要麻烦您了:

现在有个疑问,在Controller中如何向拦截器或者是Validator传入一个特定的参数呢?现在的用法都是


@Before(XXXValidator.class)
我现在想做一个通用的token的验证,但是每个验证中的token名称是不同的,如果对每一个token验证都要写一个Validator的话,不太好看也麻烦。我用的DWZ,因为用户有可能打开多个navTab,如果这些页面采用相同名称的token,用统一的tokenValidator验证的话就会出错,因为后打开的页面会把旧页面的token覆盖。如果采用不同的token名称,又不能使用统一的Validator进行验证。


所有我再想,有没有什么办法能向拦截器或Validator传递一个或多个参数,比如需求中的token名称。另外采用中相同拦截器的Controller所用的拦截器(即XXX.class)是同一个实例吗?


举报
Rajab
发帖于5年前 4回/767阅
共有4个答案 最后回答: 5年前

    暂时先介绍两个办法: 

1:在页面的表单中,或者 url 中将token 传递给 validator,然后在 validator 中读取。

2:将 actionKey 与 tokenName 建立映射关系,在 validator 中通过 getActionKey() 就能得到 tokenName

    传参给Valicator或Interceptor都可以通过表单域、urlPara、url中问号挂参、cookie、setAttr、session等方式。

    拦截器是全局共享的,所以是一个实例,但 PrototypeInterceptor 可以改变这个行为。Validator是线程安全的,非全局共享

引用来自“JFinal”的答案

    暂时先介绍两个办法: 

1:在页面的表单中,或者 url 中将token 传递给 validator,然后在 validator 中读取。

2:将 actionKey 与 tokenName 建立映射关系,在 validator 中通过 getActionKey() 就能得到 tokenName

    传参给Valicator或Interceptor都可以通过表单域、urlPara、url中问号挂参、cookie、setAttr、session等方式。

    拦截器是全局共享的,所以是一个实例,但 PrototypeInterceptor 可以改变这个行为。Validator是线程安全的,非全局共享

这种方法的确可以。我刚才看到其他朋友用注解来实现Shiro的权限传入。而在jfinal中的拦截器的ActionInvocation参数有个getMethod()方法,注释里也写了可以通过它获得加在controller方法上的注解,通过注解可以把需要的参数带入。非常好。看来@JFinal 之前已经考虑过这样的类似的问题了。

引用来自“Rajab”的答案

引用来自“JFinal”的答案

    暂时先介绍两个办法: 

1:在页面的表单中,或者 url 中将token 传递给 validator,然后在 validator 中读取。

2:将 actionKey 与 tokenName 建立映射关系,在 validator 中通过 getActionKey() 就能得到 tokenName

    传参给Valicator或Interceptor都可以通过表单域、urlPara、url中问号挂参、cookie、setAttr、session等方式。

    拦截器是全局共享的,所以是一个实例,但 PrototypeInterceptor 可以改变这个行为。Validator是线程安全的,非全局共享

这种方法的确可以。我刚才看到其他朋友用注解来实现Shiro的权限传入。而在jfinal中的拦截器的ActionInvocation参数有个getMethod()方法,注释里也写了可以通过它获得加在controller方法上的注解,通过注解可以把需要的参数带入。非常好。看来 @JFinal 之前已经考虑过这样的类似的问题了。
不过。拦截器是可以这样。那么Validator中的ActionInvocation invocation是private,怎么能取得这个属性呢? 刚想通过覆盖其中的intercept(ActionInvocation)方法来获得,可一源码,这个方法被写成final了,路全堵死了。

引用来自“Rajab”的答案

引用来自“Rajab”的答案

引用来自“JFinal”的答案

    暂时先介绍两个办法: 

1:在页面的表单中,或者 url 中将token 传递给 validator,然后在 validator 中读取。

2:将 actionKey 与 tokenName 建立映射关系,在 validator 中通过 getActionKey() 就能得到 tokenName

    传参给Valicator或Interceptor都可以通过表单域、urlPara、url中问号挂参、cookie、setAttr、session等方式。

    拦截器是全局共享的,所以是一个实例,但 PrototypeInterceptor 可以改变这个行为。Validator是线程安全的,非全局共享

这种方法的确可以。我刚才看到其他朋友用注解来实现Shiro的权限传入。而在jfinal中的拦截器的ActionInvocation参数有个getMethod()方法,注释里也写了可以通过它获得加在controller方法上的注解,通过注解可以把需要的参数带入。非常好。看来 @JFinal 之前已经考虑过这样的类似的问题了。
不过。拦截器是可以这样。那么Validator中的ActionInvocation invocation是private,怎么能取得这个属性呢? 刚想通过覆盖其中的intercept(ActionInvocation)方法来获得,可一源码,这个方法被写成final了,路全堵死了。
可以通过 controller 来获取 Method 对象,从而再获得 Method对象上的注解
--- 共有 4 条评论 ---
Rajab回复 @JFinal : 谢谢啦。汪汪 5年前 回复
JFinal回复 @Rajab : 你可以修改JFinal源码,在Validator 中添加getActionMethod(){return invocation.getMethod()} 先用上 5年前 回复
JFinal回复 @Rajab : JFinal下一版本将在Validator中提供getActionMethod方法,目前也可以获取到,但是比较麻烦,代码是这样的:controller.getClass().getMethod("methodName").getAnnotation(annotationClass); 5年前 回复
Rajab请问怎么获得呢?看了半天Controller中没有直接获得Method的方法,好像要用Action,如何得到对应的Action?通过ActionMapping? 5年前 回复
顶部