2012-03-14 40 views
24

Trong khi điều này nghe có vẻ ngớ ngẩn, tôi vẫn chưa tìm được cách để nhận IP của ứng dụng khách trong Play 2.0. Nó có sẵn trong 1.2.x là Http.Request.remoteAddress, nhưng 2.0 (tôi chủ yếu đã kiểm tra API Scala, nhưng tôi cũng đã kiểm tra nhanh Java) chỉ dường như cung cấp thông tin về phía máy chủ của yêu cầu trong play(.api).mvc.Request. Có cái gì tôi đang mất tích? Các hack gần nhất tôi có thể nghĩ đến ngay bây giờ là thiết lập nó đằng sau một proxy ngược lại và sau đó kiểm tra X-Forwarded-For, nhưng điều này không làm việc quá tốt trong dev.Cách nhận IP của khách hàng?

+0

Xin chào, nếu bạn có yêu cầu Http, bạn đã thử sử dụng một mẹo với 'play.api.http.HeaderNames.FROM' và tiêu đề yêu cầu có thể bạn có thể nhận được bằng cách nào đó không? –

+0

Từ -Địa chỉ email của người dùng thực hiện yêu cầu. Không chắc chắn nếu điều này sẽ làm việc –

Trả lời

13

EDIT: Trở lại với câu trả lời này, điều này đã được bổ sung trong play framework 2.0.2: xem phát hành thông báo trên https://groups.google.com/forum/#!msg/play-framework/Z97GQ2VnR5M/T-STGaeuN68J%5B1-25%5D và quan trọng hơn tài liệu API tại http://www.playframework.org/documentation/api/2.0.2/scala/index.html#play.api.mvc.Request

như bạn có thể thấy hiện nay là hỗ trợ cho Request.remoteAddress

gốc:

hiện nay là một lỗi mở cho điều này trong bộ theo dõi: https://play.lighthouseapp.com/projects/82401/tickets/256-add-back-requestheaderremoteaddress

Tôi nghĩ rằng việc hack các thư viện play2.0 để bao gồm bản vá được liên kết hiện là đặt cược tốt nhất. Nó có lẽ vẫn còn sạch hơn là sử dụng một proxy với mục đích duy nhất là thêm các tiêu đề XFF, và sử dụng chúng để xác định IP.

+2

Trên thực tế, tôi đã đăng bài đó và tôi là người đã tạo ra bản vá đó. –

+1

Tôi nghĩ rằng bây giờ chúng ta có thể giả định đây là một 'Oops' bởi nhóm Play. Xấu hổ không ai nhận thấy nó trước 2.0 cuối cùng. Có lẽ bản báo cáo vẫn sẽ 'không, bạn có thể làm điều đó dễ dàng theo cách khác'. Nhưng tôi nghi ngờ nó. – Martijn

+0

vâng, đó cũng là suy nghĩ của tôi, sau khi không thể tìm thấy nó. Cảm giác đó sau đó được củng cố bởi câu trả lời của Olivier, nó tham chiếu đến http://www.playframework.org/documentation/2.0/HTTPServer mà thực sự tham khảo request.remoteAddress (mặc dù điều đó không thực sự tồn tại). –

7

Vui lòng kiểm tra dự án Github này tại https://github.com/orefalo/play2-xforward

tôi lấy mã từ Play1 và chuyển nó vào Play2, nó sẽ hoạt động giống nhau.

Vẫn là một công việc đang tiến ...

+0

Không, đó là _your_ domain/ip. –

+0

bạn có chắc chắn không? nó được đọc như là "lười biếng val host: String = headers.get (play.api.http.HeaderNames.HOST) .getOrElse (" ")' dường như với tôi khi nó được đọc từ yêu cầu. Nó không thể là IP/miền địa phương. Bây giờ nếu bạn đọc bài viết, nó giải thích làm thế nào để bảo tồn các máy chủ gốc với một 'ProxyPreserveHost On' –

+5

btw, cảm ơn bạn cho -1 cố gắng để sửa chữa vấn đề của bạn! –

Các vấn đề liên quan