Browse Source

Zuul过滤和用户事务控制示例

gaodm 6 years ago
parent
commit
5ec1b20af8

+ 8 - 0
gateway-service/src/main/java/com/diagbot/GatewayServiceApplication.java

@@ -1,9 +1,11 @@
 package com.diagbot;
 
+import com.diagbot.config.IPFilter;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+import org.springframework.context.annotation.Bean;
 
 /**
  * @Description: 网关启动文件
@@ -18,4 +20,10 @@ public class GatewayServiceApplication {
     public static void main(String[] args) {
         SpringApplication.run(GatewayServiceApplication.class, args);
     }
+
+//    @Bean
+//    public IPFilter ipFilter() {
+//        return new IPFilter();
+//    }
+
 }

+ 85 - 0
gateway-service/src/main/java/com/diagbot/config/IPFilter.java

@@ -0,0 +1,85 @@
+package com.diagbot.config;
+
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2018/8/8 13:58
+ */
+@Component
+public class IPFilter extends ZuulFilter {
+
+    Logger logger= LoggerFactory.getLogger(getClass());
+
+    @Override
+    public String filterType() {
+        return "pre";
+    }
+
+    @Override
+    public int filterOrder() {
+        return 0;
+    }
+
+    @Override
+    public boolean shouldFilter() {
+        return true;
+    }
+
+    @Override
+    public Object run() {
+//        RequestContext ctx= RequestContext.getCurrentContext();
+//        HttpServletRequest req=ctx.getRequest();
+//        String ipAddr=this.getIpAddr(req);
+//        logger.info("请求IP地址为:[{}]",ipAddr);
+//        //配置本地IP白名单,生产环境可放入数据库或者redis中
+//        List<String> ips=new ArrayList<String>();
+//        ips.add("172.0.0.1");
+//        ips.add("171.0.0.1");
+//        ips.add("0:0:0:0:0:0:0:1");
+//
+//        if(!ips.contains(ipAddr)){
+//            logger.info("IP地址校验不通过!!!");
+//            ctx.setResponseStatusCode(401);
+//            ctx.setSendZuulResponse(false);
+//            ctx.setResponseBody("IpAddr is forbidden!");
+//        }
+//        logger.info("IP校验通过。");
+        return null;
+    }
+
+    /**
+     * 获取Ip地址
+     * @param request
+     * @return
+     */
+    public  String getIpAddr(HttpServletRequest request){
+
+        String ip = request.getHeader("X-Forwarded-For");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_CLIENT_IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            ip = request.getRemoteAddr();
+        }
+        return ip;
+    }
+}

+ 13 - 0
user-service/src/main/java/com/diagbot/web/UserController.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.diagbot.annotation.SysLogger;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.entity.User;
+import com.diagbot.exception.CommonException;
+import com.diagbot.exception.ErrorCode;
 import com.diagbot.facade.UserFacade;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -74,6 +76,17 @@ public class UserController {
         return RespDTO.onSuc(user);
     }
 
+    @ApiOperation(value = "注册事务", notes = "username和password为必选项")
+    @PostMapping("/registryTran")
+    @SysLogger("registryTran")
+    @Transactional
+    public RespDTO createUserTran(@RequestBody User user){
+        //参数判读省略,判读该用户在数据库是否已经存在省略
+        userFacade.createUser(user);
+        throw new CommonException(ErrorCode.FAIL);
+//        return RespDTO.onSuc(user);
+    }
+
 //    @Autowired
 //    private AmqpTemplate rabbitTemplate;
 //    @GetMapping("/test")