javaweb -- 获取请求IP(附实现源码)

  • 实现步骤如下

(1)新建一个java web工程

(2)新建servers包,新建类GetRequestIp,用来处理获取请求IP,GetRequestIp类完整代码如下:

package servers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class GetRequestIp {
    public static void post(HttpServletRequest request, HttpServletResponse response) {

        getIpAddress(request);
    }

    public static String getIpAddress(HttpServletRequest request) {

        String ip = null;
        ip = request.getHeader("x-forwarded-for");
        System.out.println("x-forwarded-for:" + ip);

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
            System.out.println("request.getHeader(\"X-Forwarded-For\")=" + ip);
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
            System.out.println("request.getHeader(\"Proxy-Client-IP\")=" + ip);
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
            System.out.println("request.getHeader(\"WL-Proxy-Client-IP\")=" + ip);
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
            System.out.println("request.getHeader(\"HTTP_CLIENT_IP\")=" + ip);
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
            System.out.println("request.getHeader(\"HTTP_X_FORWARDED_FOR\")=" + ip);
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
            System.out.println("request.getRemoteAddr()=" + ip);
        }

        if(null != ip && ip.indexOf(‘,‘) != -1)
        {
            //如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串 IP 值
            //取X-Forwarded-For中第一个非unknown的有效IP字符串
            //如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
            //用户真实IP为: 192.168.1.110
            //注意:当访问地址为 localhost 时 地址格式为 0:0:0:0:0:0:1
            System.out.println("ip=" + ip);
            String[] ips = ip.split(",");
            for (int i = 0; i < ips.length; i++)
            {
                if(null != ips[i] && !"unknown".equalsIgnoreCase(ips[i]))
                {
                    ip = ips[i];
                    break;
                }
            }
            if("0:0:0:0:0:0:1".equals(ip))
            {
                System.out.println("由于客户端访问地址使用 localhost,获取客户端真实IP地址错误,请使用IP方式访问");
            }
        }

        if("unknown".equalsIgnoreCase(ip))
        {
            System.out.println("由于客户端通过Squid反向代理软件访问,获取客户端真实IP地址错误,请更改squid.conf配置文件forwarded_for项默认是为on解决");
        }

        return ip;
    }
}

(3)新建一个JSP页面,命名为MyRequest.jsp,完整代码如下:

<%@ page import="servers.GetRequestIp" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>

<%
    out.clear();
    out = pageContext.pushBody();
    GetRequestIp.post(request, response);
%>

(4)运行,开启tomcat,在浏览器输入网址:http://127.0.0.1:8085/MyDemo/MyRequest.jsp,查看输出结果。

  • 附:获取客户端IP地址时,使用不同代理时三个HTTP请求头的区别

   (learn from:http://www.cnblogs.com/technic-emotion/articles/3701257.html

  一、没有使用代理服务器的情况:

  • REMOTE_ADDR = 您的 IP
  • HTTP_VIA = 没数值或不显示
  • HTTP_X_FORWARDED_FOR = 没数值或不显示

  二、使用透明代理服务器的情况:Transparent Proxies

  • REMOTE_ADDR = 最后一个代理服务器 IP
  • HTTP_VIA = 代理服务器 IP
  • HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

  这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

  三、使用普通匿名代理服务器的情况:Anonymous Proxies

  • REMOTE_ADDR = 最后一个代理服务器 IP
  • HTTP_VIA = 代理服务器 IP
  • HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

  此种情况,隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

  四、使用欺骗性代理服务器的情况:Distorting Proxies

  • REMOTE_ADDR = 代理服务器 IP
  • HTTP_VIA = 代理服务器 IP
  • HTTP_X_FORWARDED_FOR = 随机的 IP,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

  告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

  五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

  • REMOTE_ADDR = 代理服务器 IP
  • HTTP_VIA = 没数值或不显示
  • HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

  完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

时间: 2024-10-06 10:12:40

javaweb -- 获取请求IP(附实现源码)的相关文章

WebService跨域配置、Ajax跨域请求、附开发过程源码

项目开发过程中需要和其他公司的数据对接,当时我们公司提供的是WebService,本地测试,都是好的,Ajax跨域请求,就报错,配置WebService过程中,花了不少功夫,入不少坑,不过最终问题还是解决啦~~~特意将完整开发步骤记录下来,以备下次勿犯,废话不多说,直接上源码! 第一步,右键,新建项,添加"web服务" 第二步:在webservice项目的web.config中添加如下配置,缺一不可: 1 <system.web> 2 <webServices>

转:微信开发之使用java获取签名signature(贴源码,附工程)

微信开发之使用java获取签名signature(贴源码,附工程) 标签: 微信signature获取签名 2015-12-29 22:15 6954人阅读 评论(3) 收藏 举报  分类: 微信开发(5)  版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.前言 微信接口调用验证最终需要用到的三个参数noncestr.timestamp.signature: 接下来将会给出获取这三个参数的详细代码 本文的环境ecli

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

先来张在路上-- 此项目是用Maven创建的,没有使用Maven的,自己百度.谷歌去:直接用Junit测试就行,先执行里面的save方法,添加10000条测试数据提供各种聚合查询等. 废话不多说,上干货-- 一.MongoDB数据库的配置(mongodb.xml) 以下是我自己的配置,红色字体请改为自己本机的东东,你说不懂设置端口,不会创建数据库名称,不会配置用户名密码,那有请查阅本系列的第4节(MongoDB的使用学习之(四)权限设置--用户名.密码.端口==),你说懒得设置,那就@#¥%--

微信公众平台开发-access_token获取及应用(含源码)

微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或者禁止公众平台进行当前的操作. 一.access_token作用及使用场景 (一)access_token的作用 access_token由公众号的AppID和AppSecret组成,所以具有识别公众号的作用. (二)access_token的使用场景

基于Servlet、JSP、JDBC、MySQL的一个简单的用户注册模块(附完整源码)

最近看老罗视频,做了一个简单的用户注册系统.用户通过网页(JSP)输入用户名.真名和密码,Servlet接收后通过JDBC将信息保存到MySQL中.虽然是个简单的不能再简单的东西,但麻雀虽小,五脏俱全,在此做一归纳和整理.下面先上源码: 一.index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path =

VS2008 C++ 利用WinHttp API获取任意Http网址的源码

最近一直在看有关Http的知识,对其基本的理论知识已经有所掌握,想通过一个C++具体的例子进行实际操作..于是上网查找了很多资料,发现在Windows系统上,可以通过WinHttp API接口开啊Http,于是仿照网上例子编写一个获取网页源码的C++程序.其中的代码基本是copy网友,主要是自己对代码的理解,并以此作为入门. 例子代码如下: 1 // WinHttpTest.cpp : 定义控制台应用程序的入口点. 2 // 3 //#include <stdafx.h> 4 #include

SpringSecurity 依据用户请求的过程进行源码解析

SpringSecurity实现安全管理主要通过滤器(filter).验证器(AuthenticationManager).用户数据提供器(ProviderManager).授权器(accessDecisionManager).投票器(AccessDecisionVoter)这几个基本模块协作完成的.大概分为两个部分 用户验证 和授权 这个两个部分.这个部分主要在AuthenticationProcessingFilter和AbstractSecurityInterceptor中完成. 使用过S

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析

Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们应该如何进行网络请求的优化与处理呢? 到底有没有一些好的建议与方案呢? 下面这个文章将揭晓上面的问题,让你对SpringCloud微服务网络请求性能有一个全新的认识. 目录简介 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06

微信小程序 授权登录详解(附完整源码)

一.前言 由于微信官方修改了 getUserInfo 接口,所以现在无法实现一进入微信小程序就弹出授权窗口,只能通过 button 去触发. 官方连接:https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01 二.实现思路 自己写一个微信授权登录页面让用户实现点击的功能,也就是实现了通过 button 组件去触发 getUserInof 接口.在用户进入微信小程序的时候,判断用户是否