Interceptor 能不能给拦截的Controller 指定的Action 添加一个Para参数

public class AddressBookAccessToken implements Interceptor {


    @Inject
    WxTokenService wxTokenService;

    @Override
    public void intercept(Invocation invocation) {

        Controller controller = invocation.getController();

        Result result = wxTokenService.checkAccessToken(WxTokenService.ADDRESS_BOOK);

        if (result.errcode == 0) {
            invocation.invoke();

        } else {
            controller.renderJson(result);
        }
    }
}
如上:通过
Result result = wxTokenService.checkAccessToken(WxTokenService.ADDRESS_BOOK);
可以拿到一个访问令牌 result.access_token。


@Before(AddressBookAccessToken.class)
public void test() {

    String access_token = getPara("access_token");

    //...
}


评论区

JFinal

2018-12-17 18:04

为什么不通过 inv.getController().getPara("access_token"); 去拿到值

添加 @Para 参数也可以做到:
Para para = inv.getMethod().getAnnotation(Para.class);
if (para != null) {
Object value = para.value();
}

htjtj5

2018-12-18 10:21

@JFinal 我没表达清楚^-^。 access_token在服务端产生的,不是前端传上来的. 这个拦截器是:第一步拿到access_token,然后想把这个access_token 像普通前端传上来的普通post参数一样,再传递到controller的action。

JFinal

2018-12-18 16:22

@htjtj5 最简单便捷的方式是通过下面的方法:
拦截器中:inv.getController().setAttr("access_token", ...);

然后控制器中:getAttr("access_token");

还可以让控制器的方法带参:
public void index(String access_token) {
这里可直接使用 access_token 值
}

然后拦截器中这么来传递值:
inv.setArg(0, access_token);

上面这种用法看一下,action 带参功能如何使用:https://www.jfinal.com/doc/3-3

当然,还有很多其它办法,例如弄一个 BaseController,里头弄个 protected String access_token,然后在拦截器中将数据直接赋值给它

htjtj5

2018-12-18 20:17

@JFinal非常感谢指导。

热门反馈

扫码入社