当前位置:首页 > 开发 > 编程语言 > Ruby > 正文

Rails获取用户访问的ip

发表于: 2012-07-26   作者:hotsunshine   来源:转载   浏览次数:
摘要: 在rails中获取rails的ip值的方法一般是用: request.remote_ip rails2,rails3都是这样调用,但是两者是有区别的 rails2.3.8中的这个方法封装在ActionController::Request类中 从源代码看 def remote_ip remote_addr_list = @env['REMOTE_ADDR']
在rails中获取rails的ip值的方法一般是用:
request.remote_ip

rails2,rails3都是这样调用,但是两者是有区别的
rails2.3.8中的这个方法封装在ActionController::Request类中
从源代码看
 def remote_ip
       remote_addr_list = @env['REMOTE_ADDR'] && @env['REMOTE_ADDR'].scan(/[^,\s]+/)
 
       unless remote_addr_list.blank?
         not_trusted_addrs = remote_addr_list.reject {|addr| addr =~ TRUSTED_PROXIES}
         return not_trusted_addrs.first unless not_trusted_addrs.empty?
       end
       remote_ips = @env['HTTP_X_FORWARDED_FOR'] && @env['HTTP_X_FORWARDED_FOR'].split(',')
 
       if @env.include? 'HTTP_CLIENT_IP'
         if ActionController::Base.ip_spoofing_check && remote_ips && !remote_ips.include?(@env['HTTP_CLIENT_IP'])
           # We don't know which came from the proxy, and which from the user
           raise ActionControllerError.new("IP spoofing attack?!\nHTTP_CLIENT_IP=\#{@env['HTTP_CLIENT_IP'].inspect}\nHTTP_X_FORWARDED_FOR=\#{@env['HTTP_X_FORWARDED_FOR'].inspect}\n")
         end
 
         return @env['HTTP_CLIENT_IP']
       end
 
       if remote_ips
         while remote_ips.size > 1 && TRUSTED_PROXIES =~ remote_ips.last.strip
           remote_ips.pop
         end
 
         return remote_ips.last.strip
       end
 
       @env['REMOTE_ADDR']
     end

获取用户登录信息的http头都封装在了@env这个实例变量里面了

rails3.2.6对以前的代码作了优化,并单独封装了ActionDispatch::Request 这个类
源代码也只是剩下下面几行了
# File actionpack/lib/action_dispatch/http/request.rb, line 159
def remote_ip
  @remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end


由于领导跟外面公司合作用了某某的加速服务(网站缓存到了其他地方的服务器上),造成ip获取产生了问题,服务商跟我说他们的真实ip放在了http头的 HTTP_X_REAL_FORWARDED_FOR中,于是打算重新给request写一个方法,获取用户的真实ip。

# 增加代理之后,ip发生了变化,需要取原始的ip地址
class ActionController::Request
  def real_ip
    !@env['HTTP_X_REAL_FORWARDED_FOR'].blank? ? @env['HTTP_X_REAL_FORWARDED_FOR'] : remote_ip
  end
end

Rails获取用户访问的ip

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
Java 如何获取客户端IP呢? 核心思想:通过HTTP的request来获取 下面是我总结的几种方法: /** * 获取
Java 如何获取客户端IP呢? 核心思想:通过HTTP的request来获取 下面是我总结的几种方法: /** * 获取
Java 如何获取客户端IP呢? 核心思想:通过HTTP的request来获取 下面是我总结的几种方法: /** * 获取
Java 如何获取客户端IP呢? 核心思想:通过HTTP的request来获取 下面是我总结的几种方法: /** * 获取
Java 如何获取客户端IP呢? 核心思想:通过HTTP的request来获取 下面是我总结的几种方法: /** * 获取
我们大多是WEB的B/S系统,各种各样的用户非常多,但是总有那么一些恶意的搞破坏的人;特别是财务系
我们大多是WEB的B/S系统,各种各样的用户非常多,但是总有那么一些恶意的搞破坏的人;特别是财务系
nginx 为实现反向代理的需求增加了一个 ngx_http_proxy_module 模块。其中 proxy_set_header 指令就
我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了。下面我们就先看看N
获取服务器IP,可以通过下面两种途径获取: 1、Request.ServerVariables[LOCAL_ADDR] Returns the s
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号