NutzCN Logo
问答 nutboot aop 未执行
发布于 283天前 作者 Hamming 348 次浏览 复制 上一个帖子 下一个帖子
标签:

nutboot aop 未执行
创建注解 拦截 请求验证身份信息

package io.nutz.nutzsite.common.annotation;

/**
 * @Author: Haimming
 * @Date: 2019-05-17 16:52
 * @Version 1.0
 */
public @interface AccessToken {
}

package io.nutz.nutzsite.common.aop;

import io.nutz.nutzsite.common.annotation.AccessToken;
import org.nutz.aop.MethodInterceptor;
import org.nutz.ioc.Ioc;
import org.nutz.ioc.aop.SimpleAopMaker;
import org.nutz.ioc.loader.annotation.IocBean;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;

/**
 * @Author: Haimming
 * @Date: 2019-05-17 16:53
 * @Version 1.0
 */
@IocBean
public class AccessTokenAopConfigration extends SimpleAopMaker<AccessToken> {

    @Override
    public List<? extends MethodInterceptor> makeIt(AccessToken accessToken, Method method, Ioc ioc) {
        return Arrays.asList(new AccessTokenAopInterceptor(ioc, accessToken, method));
    }

}

package io.nutz.nutzsite.common.aop;

import io.nutz.nutzsite.common.annotation.AccessToken;
import io.nutz.nutzsite.common.utils.JWTUtil;
import org.nutz.aop.InterceptorChain;
import org.nutz.aop.MethodInterceptor;
import org.nutz.ioc.Ioc;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Strings;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.Mvcs;

import java.lang.reflect.Method;

/**
 * @Author: Haimming
 * @Date: 2019-05-17 16:57
 * @Version 1.0
 */
@IocBean
public class AccessTokenAopInterceptor implements MethodInterceptor {
    private static final Log log = Logs.get();

    protected Ioc ioc;

    public AccessTokenAopInterceptor(Ioc ioc, AccessToken token, Method method) {
        this.ioc = ioc;

    }

    @Override
    public void filter(InterceptorChain chain) throws Throwable {
        try {
        String token = Strings.sNull(Mvcs.getReq().getHeader("authorization"));
        if (JWTUtil.verifyToken(token)) {
            chain.doChain();
        }
        Mvcs.getResp().sendError(403);
//        return new UTF8JsonView(JsonFormat.compact()).setData(Result.token());
        }
        catch (Throwable e) {
            log.debug("aop.error",e);
            throw e;
        }
    }
}

是不是我依赖注入的不对 还是要怎么声明AOP吗

11 回复

注解调整 依然 未执行

package io.nutz.nutzsite.common.annotation;

import java.lang.annotation.*;

/**
 * @Author: Haimming
 * @Date: 2019-05-17 16:52
 * @Version 1.0
 */
@Retention(RetentionPolicy.RUNTIME) // 必须带这个,不然读取不到的
@Target({ElementType.METHOD}) // aop,一般指方法
@Documented // 记录到javadoc
public @interface AccessToken {

}

AccessTokenAopConfigration的aop名字有要求

@IocBean(name="$aop_xxx")

感谢兽总 可以执行了 但是
在filter里面 我要怎么验证 不通过 我要如何改变返回json数据

@IocBean
public class AccessTokenAopInterceptor implements MethodInterceptor {
    private static final Log log = Logs.get();

    protected Ioc ioc;

    public AccessTokenAopInterceptor(Ioc ioc, AccessToken token, Method method) {
        this.ioc = ioc;

    }

    @Override
    public void filter(InterceptorChain chain) throws Throwable {
        try {
        String token = Strings.sNull(Mvcs.getReq().getHeader("authorization"));
        if (JWTUtil.verifyToken(token)) {
            chain.doChain();
        }
        Mvcs.getResp().sendError(403);
//        return new UTF8JsonView(JsonFormat.compact()).setData(Result.token());
        }
        catch (Throwable e) {
            log.debug("aop.error",e);
            throw e;
        }
    }
}

Mvcs.getResp() 可以操作吗 要怎么写入 返回内容呢

搞定了

    @Override
    public void filter(InterceptorChain chain) throws Throwable {
        try {
            String token = Strings.sNull(Mvcs.getReq().getHeader("authorization"));
            if (JWTUtil.verifyToken(token)) {
                chain.doChain();
            }
            Mvcs.write(Mvcs.getResp(), Result.token(), JsonFormat.compact());
        } catch (Throwable e) {
            log.debug("aop.error", e);
            throw e;
        }
    }

奇怪 json 多了一个null

{
   "code": 3,
   "msg": "token失效",
   "data": null
}null

filter加@Ok("void")这个呀

入口方法

也许加flush()把响应刷出去也行

Mvcs.write( 里面
// by mawm 改为直接采用resp.getWriter()的方式直接输出!
Json.toJson(writer, obj, format);
有方法 writer.flush();
还是有null

我要返回json数据的话

@Ok("void")

改成这个 返回是空

设置 Mvcs.SKIP_COMMITTED =true; 已解决

    /**
     * 过滤器 验证登录
     * @param chain
     * @throws Throwable
     */
    @Override
    public void filter(InterceptorChain chain) throws Throwable {
        try {
            String token = Strings.sNull(Mvcs.getReq().getHeader("authorization"));
            if (JWTUtil.verifyToken(token)) {
                chain.doChain();
            }else {
                Mvcs.SKIP_COMMITTED =true;
                Mvcs.write(Mvcs.getResp(), Result.token(), JsonFormat.full());
            }
        } catch (Throwable e) {
            log.debug("aop.error", e);
            throw e;
        }
    }
添加回复
请先登陆
回到顶部