天天看點

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