天天看点

springcloud 自定义 zuul 过滤器 简单实现

效果

springcloud 自定义 zuul 过滤器 简单实现
springcloud 自定义 zuul 过滤器 简单实现
package com.cxp.shop_zuul.filter;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@Component
public class MyZuulFilter  extends ZuulFilter {

    @Autowired
    ObjectMapper objectMapper;  //spring 自带的json转换插件

    @Override
    public Object run() throws ZuulException {
        System.out.println("******我开始拦截了*******");
        RequestContext currentContext = RequestContext.getCurrentContext();//获取当前的 上下文对象
        HttpServletRequest request = currentContext.getRequest();//获取 request
        String requestURI = request.getRequestURI();   //获取请求的uri
        if (requestURI.contains("/provide")){
            System.out.println("有人访问了 uri:"+requestURI);
        }

        if (true){  //对其拦截
            currentContext.setSendZuulResponse(false);  //是否转发给对应路由的服务
                                                        //  false则拦截
            currentContext.setResponseStatusCode(401);  //设置响应状态码
            currentContext.getResponse().setContentType("application/json;charset=UTF-8");//设置响应编码格式
            Map<String, Object> map = new HashMap<>();
            map.put("success",false);
            map.put("message","你被拦截了");
            String msg=null;
            try {
                msg = objectMapper.writeValueAsString(map);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            currentContext.setResponseBody(msg);  //设置响应内容
        }else{
            currentContext.setSendZuulResponse(true);  //是否转发给对应路由的服务
        }


        return null;
    }




    @Override
    public String filterType() {
        return "pre";
    }   //可以在请求被路由之前调用  一共有4种类型参数

    @Override
    public int filterOrder() {
        return 0;
    }   //数字越小优先级越高

    @Override
    public boolean shouldFilter() {
        return true;
    }   

}
           

借鉴了2篇博客

https://blog.csdn.net/liuchuanhong1/article/details/62236793

https://blog.csdn.net/dfBeautifulLive/article/details/83148737