开发者社区> 问答> 正文

如何向拦截器或Validator传入参数? 400 报错

如何向拦截器或Validator传入参数? 400 报错

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

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


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


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


展开
收起
爱吃鱼的程序员 2020-06-01 10:14:43 566 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

        暂时先介绍两个办法: 

    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对象上的注解
    ######回复 @JFinal : 谢谢啦。汪汪######回复 @Rajab : 你可以修改JFinal源码,在Validator 中添加getActionMethod(){return invocation.getMethod()} 先用上######回复 @Rajab : JFinal下一版本将在Validator中提供getActionMethod方法,目前也可以获取到,但是比较麻烦,代码是这样的:controller.getClass().getMethod("methodName").getAnnotation(annotationClass);######请问怎么获得呢?看了半天Controller中没有直接获得Method的方法,好像要用Action,如何得到对应的Action?通过ActionMapping?
    2020-06-01 10:14:45
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载