spring-boot 获得客户端真实IP地址的方法二

背景

  • 单点登录的token太垃圾了,我想跨浏览器单点。把token换成ip不就行了。
  • 前端vue采用了代理,我一直用request.getRemoteAddr(); 获取到的是vue的ip地址。

java如何获取客户端真正的ip地址

  • 在http消息头上有。
  • 不能直接用 request.getRemoteAddr();

代码

import com.alibaba.fastjson.JSONObject;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public class SpringWebUtils {
    SpringWebUtils(){}

    public static Map getUserInfo(){
        //
        //从session里面获取对应的值
//        String str = (String) requestAttributes.getAttribute("name",RequestAttributes.SCOPE_SESSION);
        HttpServletRequest request = getRequest();
        String userInfo = request.getParameter("userInfo");
        JSONObject jsonObject = JSONObject.parseObject(userInfo);
        Map innerMap = jsonObject.getInnerMap();
        //
        return innerMap;
    }

    public static HttpServletResponse getResponse() {
        return ((ServletRequestAttributes) getRequestAttributes()).getResponse();
    }

    public static String getRemoteAddr() {

        HttpServletRequest request = getRequest();


        log.info("x-forwarded-for"+request.getHeader("x-forwarded-for"));
        log.info("x-forwarded-for"+request.getHeader("WL-Proxy-Client-IP"));
        log.info("x-forwarded-for"+request.getHeader("WL-Proxy-Client-IP"));
        log.info("x-forwarded-for"+request.getRemoteAddr());
        //
        String userName = request.getParameter("userName");
        log.info("x-forwarded-for" + userName );
        if(StringUtils.isNotBlank(userName)){
            return userName;
        }

//        log.info("x-forwarded-for"+Request.ServerVariables("Local_Addr"));
        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.getRemoteAddr();

        }

        if (ip.contains(",")) {
            return ip.split(",")[0];
        } else {
            return ip;
        }
    }
    
    
    public static HttpServletRequest getRequest() {
//        RequestAttributes requestAttributes = getRequestAttributes();
        return  ((ServletRequestAttributes) getRequestAttributes()).getRequest();
    }

    public static RequestAttributes getRequestAttributes() {
        return RequestContextHolder.currentRequestAttributes();
    }
}

后续遇到的问题:

我用到这个工具类,后当前端代理时候获取的ip是成功的。
但是发布到服务器后,获得的ip又是相同的。
经过日志查看一直都是通过request.getRemoteAddr(); , 其它的都是null。
这里,我不知道怎么办了。

解决

前端必须传入 String userName = request.getParameter(“userName”);
我们后端就通过他来当做token。

参考资料

  • 干货:Java正确获取客户端真实IP方法整理

如果使用的是Druid连接池,可以参考使用:com.alibaba.druid.util.DruidWebUtils#getRemoteAddr方法,但这个是经过多级代理的IP地址,需要自己处理下获取第一个。

你可能感兴趣的:(计算机基础,#,力盟亚任职,#,spring家族)