Laravel,捕获访客 IP 的最佳方法是啥?

Posted

技术标签:

【中文标题】Laravel,捕获访客 IP 的最佳方法是啥?【英文标题】:Laravel, What is best approach to capture Visitors Ip?Laravel,捕获访客 IP 的最佳方法是什么? 【发布时间】:2019-08-20 10:10:41 【问题描述】:

我正在寻找最受支持/最安全的方法来捕获访问者的 IP 地址。

目前我可以通过以下方法保存访问者 IP

发出呼叫的路由。

Route::get('/','VisitorController@multidisplay');

在多显示功能中,我正在调用另一个控制器来捕获和存储访客 Ip like->

 public function multidisplay()
       
        //calling log visitor controller
        app()->call('App\Http\Controllers\LogVisitIpController@store');


        return view('welcome')
        ->with('sliderimg', Sliderimage::all())
        ->with('postimg', PostImage::orderBy('created_at', 'desc')->take(3)->get())
        ;

    

最后是在 LogVisitIpController 中存储访问者 Ip 的实际函数

public function store(Request $request)
    
        $bla=$this->getIp();
        $myvisitor = new LogVisitIp();
        $myvisitor->visitorIp=$bla;
        $myvisitor->save();
    

现在我有两个问题。

    可以在另一个控制器中使用这样的控制器吗?

    我是否应该使用另一种方法来捕获访问者 ip 控制器?

注意:VisitorController 用于将访问者的请求保存在数据库中并发送邮件,我可以从访问者的请求中收集 IP 并传递它,但我的目标是在访问者打开我的网站或进行 ping 时立即捕获 Ip要求。

【问题讨论】:

您是否有任何登录系统或任何将访问您网站的特定模块的人? 不,这是一个单页网站。访客只能以访客身份发送请求。 那就没问题了。您可以使用任何方式以您想要的方式存储访问者的 IP。您已经为单个项目使用了调用模型的非常好的方法。 根据***.com/a/30365349从任何其他控制器中的一个控制器调用函数是一种不好的方法我在VisitorController@multidisplay中调用contranLogVisitIpController@store。我想使用一个雄辩的模型作为中间人 b/w 两个控制器或任何其他更好的方法,如 php trait。 【参考方案1】:

即使您的代码确实有效,我也不建议您使用该技术。 这是你应该做的。

定义一个仅用于保存 ips 的类。您将在此处移动真正记录 ip 的代码。

Class VisitIpLoggerService

    public function storeIp(Request $request)
    
        $myvisitor = new LogVisitIp();
        $myvisitor->visitorIp=$request->ip();
        $myvisitor->save();
    

然后您将该服务注入到您的控制器的函数中并像这样调用该函数。这样您的代码将更易于维护。

public function multidisplay(Request $request, VisitIpLoggerService $ipLogger)
   
    //just call the service
    $ipLogger->storeIp($request);

【讨论】:

我会更进一步,创建一个路由中间件 同意。但我想以某种方式保持简单 LogVisitIpController 仅用于捕获 IP 地址,您的方法和我的方法的唯一区别是在 VisitorController 中调用/访问函数 store/storeip 的方式。但是,您的呼叫方式看起来很干净。另外,如果使用 Laravel 的内置方法来捕获 IP 地址,我如何确定它是否是真实 IP,也就是不是代理。 刚刚测试了你的方法。它对我来说不起作用,它会引发异常“ BadMethodCallException Call to undefined method App\LogVisitIp::store()”。 @SyedAqeel 我忍不住要检查没有代码,把它贴在某个地方,我会尝试看看......【参考方案2】:

将此添加到您的控制器中...

'ip_address_variable' => \Request::ip();

对于你的情况,

public function store(Request $request)
    
        $bla=$this->getIp();
        $myvisitor = new LogVisitIp();
        $myvisitor->visitorIp=$request->ip();
        $myvisitor->save();
    

【讨论】:

以上是关于Laravel,捕获访客 IP 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在任务中捕获异常的最佳方法是啥?

在 Laravel 5.2 中捕获保存和删除的最可靠方法是啥?

在 PasswordBox 中捕获返回键的最佳方法是啥? (WPF/XAML)

在 ASP.NET 应用程序中捕获所有异常的最佳方法是啥?

在 Laravel 迁移中更改列类型的最佳方法是啥?

Laravel - 使用大数据优化更新/插入查询的最佳方法是啥?