NutzCN Logo
问答 如何使用过滤器 或者动作链 对所有的请求 的状态码进行判断
发布于 180天前 作者 yy321973351 189 次浏览 复制 上一个帖子 下一个帖子
标签:

如何使用过滤器 或者动作链 对所有的请求 的状态码进行判断

14 回复

动作链里面加个处理器就行啦...

主要是现在只能判断有入口函数的能进行判断


@Filters(@By(type = MyFilter.class,args = {"500.html"})) @Modules @IocBy(type=ComboIocProvider.class, args={ "*anno", "com.lx.demo", "*tx", // 事务拦截 aop "*async"}) // 异步执行aop @SetupBy(MainSetupBy.class) @ChainBy(type = MyActionChainMaker.class,args = {}) public class MainModule { }
public class MyFilter implements ActionFilter {

    private String path;

    public MyFilter(String path) {

        this.path = path;
    }


    @Override
    public View match(ActionContext actionContext) {
        System.err.println(actionContext.getResponse().getStatus());

        return actionContext.getResponse().getStatus() == 200 ? null : new ServerRedirectView(path);
    }
}

package com.lx.demo.chain;

import com.lx.demo.processor.MyProcessor;
import org.nutz.mvc.*;
import org.nutz.mvc.impl.NutActionChain;
import org.nutz.mvc.impl.processor.*;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/6/13.
 */
public class MyActionChainMaker implements ActionChainMaker {
    @Override
    public ActionChain eval(NutConfig config, ActionInfo ai) {
        // 提醒: config可以获取ioc等信息, ai可以获取方法上的各种配置及方法本身
        // 正常处理的列表
        List<Processor> list = new ArrayList<>();
        list.add(new UpdateRequestAttributesProcessor()); // 设置base/msg等内置属性
        list.add(new EncodingProcessor()); // 设置编码信息@Encoding
        list.add(new ModuleProcessor()); // 获取入口类的对象,从ioc或直接new
        list.add(new ActionFiltersProcessor()); // 处理@Filters
        list.add(new AdaptorProcessor()); // 处理@Adaptor
        list.add(new MethodInvokeProcessor()); // 执行入口方法
        list.add(new ViewProcessor()); // 对入口方法进行渲染@Ok
        list.add(new MyProcessor());
        for (Processor p : list) {
            try {
                p.init(config, ai);
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }

        // 最后是专门负责兜底的异常处理器,这个处理器可以认为是全局异常处理器,对应@Fail
        Processor error = new FailProcessor();
        try {
            error.init(config, ai);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return new NutActionChain(list, error, ai);
    }

}

http://nutzbook.wendal.net/dev_prepare/action_chain.html 看文档, 是定义动作链的配置文件, 不是自定义MyActionChainMaker

package com.lx.demo.processor;

import org.nutz.http.Response;
import org.nutz.mvc.ActionContext;
import org.nutz.mvc.impl.processor.AbstractProcessor;
import org.nutz.mvc.view.HttpServerResponse;

import javax.servlet.http.HttpServletResponse;

/**
 * Created by Administrator on 2018/6/13.
 */
public class MyProcessor extends AbstractProcessor {
    @Override
    public void process(ActionContext ac) throws Throwable {
        HttpServletResponse response = ac.getResponse();
        System.out.println(response.getStatus());
    }
}

list.add(new MyProcessor());

把MyProcessor放到ViewProcessor之前

ViewProcessor默认不会再调用下一个处理器了

18-06-13 10:51:48.854 DEBUG [http-nio-8080-exec-6] Search mapping for [GET] path=/lx1 : NOT Action match

好像不行

没有对应的入口方法?

是啊就是要拦截没有入口方法的请求

哦, 那只能做个Filter配到web.xml里面了

以及其他异常http状态码

添加回复
请先登陆
回到顶部