Java中使用HttpServletRequest获取ip和端口-详解

目录

1.简单例子

2.详细使用例子---Java项目

2.1.Controller层

2.2service层

2.2.1接口

2.2.2serviceImpl实现类

3.IpUtils工具类


1.简单例子

也可以直接用

public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
       String ServerName = request.getServerName();//返回服务器的主机名
       String ServerPort = request.getServerPort();//返回服务器的端口号
 
       String uri = request.getRequestURI();//返回请求行中的资源名称
       String url = request.getRequestURL().toString();//获得客户端发送请求的完整url
       String ip = request.getRemoteAddr();//返回发出请求的IP地址
       String params = request.getQueryString();//返回请求行中的参数部分
       String host=request.getRemoteHost();//返回发出请求的客户机的主机名
       int port =request.getRemotePort();//返回发出请求的客户机的端口号
 
       System.out.println(ServerName);
       System.out.println(ServerPort);
       
       System.out.println(ip);
       System.out.println(url);
       System.out.println(uri);
       System.out.println(params);
       System.out.println(host);
       System.out.println(port);
}

2.详细使用例子---Java项目

真正用到在serviceImpl实现类中

2.1.Controller层

@RestController
@RequestMapping("/api")
public class DataReportController {
private final DataReportService dataReportService;
private final BusinessMsgCodeProperties props;
@Autowired
public DataReportController(DataReportService dataReportService, BusinessMsgCodeProperties props){
    this.dataReportService = dataReportService;
    this.props = props;
}
/**
 * 数据上报接⼝
 */
@PostMapping("/dataReport")//这个接口既传文件参数又传实体实参,request不是参数,前端不传后端可自行获取
public Resource dataReport(@RequestPart(value = "file", required = true) MultipartFile file, @RequestPart  @Validated DataReportInDto dto, HttpServletRequest request){
    String code = dataReportService.dataReport(file,dto,request);
    return new Resource<>(props.getProcessStatus(code));       //Resource为自行封装的返回类型,可以用不用
}
}

2.2service层

2.2.1接口

public interface DataReportService extends IService {
    /**
     * 数据上报接⼝
     */
String dataReport(MultipartFile file, DataReportInDto dto, HttpServletRequest request);
}

2.2.2serviceImpl实现类

@Service
@Slf4j
public class DataReportServiceImpl extends ServiceImpl implements DataReportService {
private final DataReportMapper dataReportMapper;
@Autowired
public DataReportServiceImpl(DataReportMapper dataReportMapper){
    this.dataReportMapper = dataReportMapper;
}
@Override
public String dataReport(MultipartFile file, DataReportInDto dto, HttpServletRequest request) {
    //一、获取调用者的ip+port
    String ip = "";
    String port = "";
    String loginName = "";
    try {
        ip = IpUtils.getRemoteHost(request);     //自己封装一个工具类(对特殊情况做了一定处理)
        String ip1 =  request.getRemoteAddr();   //直接获取
        port = String.valueOf(request.getRemotePort());
        System.out.println("远程端的ip1:"+ip1);
        System.out.println("远程的端口:"+ip);
        System.out.println("远程端口:"+port);
        log.info("获取调用者ip:"+ip+" ,"+"port:"+port);
    } catch (Exception e) {
        e.printStackTrace();
        log.info("获取调用者ip+port失败");
    }
return "COMMON_ERROR";
}
}

3.IpUtils工具类

直接整个粘贴就能用

package com.nengyy.speed_rest_server.utils;        //所在包
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
public class IpUtils {
    public static String getRemoteHost(HttpServletRequest request){
        String ip = request.getHeader("x-forwarded-for");
        if(StringUtils.isNoneBlank(ip) && !"unknown".equalsIgnoreCase(ip)){
            int idx = ip.indexOf(",");
            if(idx != -1){
                ip = ip.substring(0, idx);
            }
        }
        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();
        }
        return ip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip;
    }
}