java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring获取HttpServletRequest

Spring中获取HttpServletRequest的三种方式小结

作者:爱码少年 00fly.online

spring框架web环境中,获取HttpServletRequest是常见的操作,本文将为大家详细介绍一下Spring中获取HttpServletRequest的三种方式,有需要的小伙伴可以了解下

一、简要概述

spring框架web环境中,获取HttpServletRequest是常见的操作,下面我们以获取客户端ip功能为例,给出获取HttpServletRequest对象的几种方式。

二、3种方式

1、直接在请求方法参数中声明

    String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "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"};
    
    @GetMapping({"/", "/index"})
    public String index(HttpServletRequest request)
    {
        return StringUtils.join("client ip: ", getClientIp(request));
    }
    
    /**
     * 获取客户端真实IP地址
     */
    private String getClientIp(HttpServletRequest request)
    {
        for (String header : IP_HEADERS)
        {
            String ip = request.getHeader(header);
            if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
            {
                String[] ips = ip.split(",");
                log.info("##### ip header: {}", header);
                return ips[0].trim();
            }
        }
        log.info("##### request.getRemoteAddr");
        return request.getRemoteAddr();
    }

2、注入方式获取

    @Autowired
    HttpServletRequest request;
    
    String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "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"};
    
    @GetMapping({"/", "/index"})
    public String index()
    {
        return StringUtils.join("client ip: ", getClientIp(request));
    }
    
    /**
     * 获取客户端真实IP地址
     */
    private String getClientIp(HttpServletRequest request)
    {
        for (String header : IP_HEADERS)
        {
            String ip = request.getHeader(header);
            if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
            {
                // 处理多个IP的情况(逗号分隔)
                String[] ips = ip.split(",");
                log.info("##### ip header: {}", header);
                return ips[0].trim();
            }
        }
        log.info("##### request.getRemoteAddr");
        return request.getRemoteAddr();
    }

或者

    @Autowired
    HttpServletRequest request;
    
    String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "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"};
    
    @GetMapping({"/", "/index"})
    public String index()
    {
        return StringUtils.join("client ip: ", getClientIp());
    }
    
    /**
     * 获取客户端真实IP地址
     */
    private String getClientIp()
    {
        for (String header : IP_HEADERS)
        {
            String ip = request.getHeader(header);
            if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
            {
                // 处理多个IP的情况(逗号分隔)
                String[] ips = ip.split(",");
                log.info("##### ip header: {}", header);
                return ips[0].trim();
            }
        }
        log.info("##### request.getRemoteAddr");
        return request.getRemoteAddr();
    }

3、隐式从上下文获取

    @GetMapping({"/", "/index"})
    public String index()
    {
        return StringUtils.join("client ip: ", getClientIp());
    }
    
    String[] IP_HEADERS = {"X-Forwarded-For", "X-Real-IP", "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"};
    
    /**
     * 获取客户端真实IP地址
     */
    private String getClientIp()
    {
        HttpServletRequest request = getHttpServletRequest();
        for (String header : IP_HEADERS)
        {
            String ip = request.getHeader(header);
            if (ip != null && !ip.isEmpty() && !"unknown".equalsIgnoreCase(ip))
            {
                // 处理多个IP的情况(逗号分隔)
                String[] ips = ip.split(",");
                log.info("##### ip header: {}", header);
                return ips[0].trim();
            }
        }
        log.info("##### request.getRemoteAddr");
        return request.getRemoteAddr();
    }
    
    private HttpServletRequest getHttpServletRequest()
    {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        if (servletRequestAttributes != null)
        {
            return servletRequestAttributes.getRequest();
        }
        return null;
    }

大家可以根据需要选择其中一种使用。

到此这篇关于Spring中获取HttpServletRequest的三种方式小结的文章就介绍到这了,更多相关Spring获取HttpServletRequest内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文