How to extract IP Address in Spring MVC Controller get call?

后端 未结 9 536
长发绾君心
长发绾君心 2020-11-28 04:04

I am working on Spring MVC controller project in which I am making a GET URL call from the browser -

Below is the url by which I am making a GET call from the browse

相关标签:
9条回答
  • 2020-11-28 04:38
    private static final String[] IP_HEADER_CANDIDATES = {
                "X-Forwarded-For",
                "Proxy-Client-IP",
                "WL-Proxy-Client-IP",
                "HTTP_X_FORWARDED_FOR",
                "HTTP_X_FORWARDED",
                "HTTP_X_CLUSTER_CLIENT_IP",
                "HTTP_CLIENT_IP",
                "HTTP_FORWARDED_FOR",
                "HTTP_FORWARDED",
                "HTTP_VIA",
                "REMOTE_ADDR"
        };
    
        public static String getIPFromRequest(HttpServletRequest request) {
            String ip = null;
            if (request == null) {
                if (RequestContextHolder.getRequestAttributes() == null) {
                    return null;
                }
                request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            }
    
            try {
                ip = InetAddress.getLocalHost().getHostAddress();
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (!StringUtils.isEmpty(ip))
                return ip;
    
            for (String header : IP_HEADER_CANDIDATES) {
                String ipList = request.getHeader(header);
                if (ipList != null && ipList.length() != 0 && !"unknown".equalsIgnoreCase(ipList)) {
                    return ipList.split(",")[0];
                }
            }
    
            return request.getRemoteAddr();
        }
    

    I combie the code above to this code work for most case. Pass the HttpServletRequest request you get from the api to the method

    0 讨论(0)
  • 2020-11-28 04:43

    You can get the IP address statically from the RequestContextHolder as below :

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
            .getRequest();
    
    String ip = request.getRemoteAddr();
    
    0 讨论(0)
  • 2020-11-28 04:45

    The solution is

    @RequestMapping(value = "processing", method = RequestMethod.GET)
    public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow,
        @RequestParam("conf") final String value, @RequestParam("dc") final String dc, HttpServletRequest request) {
    
            System.out.println(workflow);
            System.out.println(value);
            System.out.println(dc);
            System.out.println(request.getRemoteAddr());
            // some other code
        }
    

    Add HttpServletRequest request to your method definition and then use the Servlet API

    Spring Documentation here said in

    15.3.2.3 Supported handler method arguments and return types

    Handler methods that are annotated with @RequestMapping can have very flexible signatures.
    Most of them can be used in arbitrary order (see below for more details).
    
    Request or response objects (Servlet API). Choose any specific request or response type,
    for example ServletRequest or HttpServletRequest
    
    0 讨论(0)
  • 2020-11-28 04:45

    I use such method to do this

    public class HttpReqRespUtils {
    
        private static final String[] IP_HEADER_CANDIDATES = {
            "X-Forwarded-For",
            "Proxy-Client-IP",
            "WL-Proxy-Client-IP",
            "HTTP_X_FORWARDED_FOR",
            "HTTP_X_FORWARDED",
            "HTTP_X_CLUSTER_CLIENT_IP",
            "HTTP_CLIENT_IP",
            "HTTP_FORWARDED_FOR",
            "HTTP_FORWARDED",
            "HTTP_VIA",
            "REMOTE_ADDR"
        };
    
        public static String getClientIpAddressIfServletRequestExist() {
    
            if (RequestContextHolder.getRequestAttributes() == null) {
                return "0.0.0.0";
            }
    
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            for (String header: IP_HEADER_CANDIDATES) {
                String ipList = request.getHeader(header);
                if (ipList != null && ipList.length() != 0 && !"unknown".equalsIgnoreCase(ipList)) {
                    String ip = ipList.split(",")[0];
                    return ip;
                }
            }
    
            return request.getRemoteAddr();
        }
    }
    
    0 讨论(0)
  • 2020-11-28 04:48

    I am late here, but this might help someone looking for the answer. Typically servletRequest.getRemoteAddr() works.

    In many cases your application users might be accessing your web server via a proxy server or maybe your application is behind a load balancer.

    So you should access the X-Forwarded-For http header in such a case to get the user's IP address.

    e.g. String ipAddress = request.getHeader("X-FORWARDED-FOR");

    Hope this helps.

    0 讨论(0)
  • 2020-11-28 04:48

    Put this method in your BaseController:

    @SuppressWarnings("ConstantConditions")
    protected String fetchClientIpAddr() {
        HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.getRequestAttributes())).getRequest();
        String ip = Optional.ofNullable(request.getHeader("X-FORWARDED-FOR")).orElse(request.getRemoteAddr());
        if (ip.equals("0:0:0:0:0:0:0:1")) ip = "127.0.0.1";
        Assert.isTrue(ip.chars().filter($ -> $ == '.').count() == 3, "Illegal IP: " + ip);
        return ip;
    }
    
    0 讨论(0)
提交回复
热议问题