2008-09-24 36 views
15

Tôi đang làm việc trên một ứng dụng web (J2EE) và tôi muốn biết các tùy chọn có sẵn để xử lý bài đăng kép từ trình duyệt.Làm cách nào để ngăn người dùng đăng dữ liệu nhiều lần trên trang web

Các giải pháp mà tôi đã nhìn thấy và sử dụng trong quá khứ đều là client-side:

  • Vô hiệu hóa nút gửi ngay sau khi người dùng nhấp chuột nó.
  • Làm theo mẫu POST-Redirect-GET để ngăn POST khi người dùng nhấp vào nút quay lại.
  • Xử lý sự kiện onSubmit của biểu mẫu và theo dõi trạng thái gửi bằng JavaScript.

Tôi muốn triển khai giải pháp phía máy chủ nếu có thể. Có cách tiếp cận nào tốt hơn các phương pháp tôi đã đề cập ở trên hay giải pháp phía khách hàng tốt nhất?

Trả lời

8

Khó có thể thực hiện giải pháp chống idiot (vì chúng đang cải thiện các idiots). Không có vấn đề gì bạn làm, phía khách hàng có thể được thao tác hoặc thực hiện không chính xác.

Giải pháp của bạn phải là phía máy chủ đáng tin cậy và bảo mật. Điều đó nói rằng, một cách tiếp cận là xem lại yêu cầu và kiểm tra trạng thái cơ sở dữ liệu/trạng thái cơ sở dữ liệu hoặc nhật ký để xác định xem nó đã được xử lý chưa. Lý tưởng nhất, quy trình ở phía máy chủ phải là không có giá trị nếu có thể và sẽ phải bảo vệ chống lại các lần gửi song song nếu không thể.

8

Bạn có thể cung cấp "vé" như một phần của biểu mẫu, một số số ngẫu nhiên - và đảm bảo rằng nó không được chấp nhận hai lần, ở phía máy chủ.

+0

Làm thế nào để bạn xử lý một người dùng nhấn nút quay lại (hầu hết các trình duyệt không tái yêu cầu), thay đổi dữ liệu trong biểu mẫu, và nộp cùng một "tấm vé" một lần nữa? – JeremyWeir

+4

Bạn không thể ngăn người dùng gửi lại yêu cầu mới với cùng một vé, nhưng bạn có thể từ chối yêu cầu đó ở phía máy chủ, với lỗi "Yêu cầu trùng lặp". – zigdon

+0

Phải, nhưng mọi người làm điều đó có chủ đích - gửi một biểu mẫu, nhấn lại vì họ biết họ cần sửa lại điều gì đó, gửi lại biểu mẫu. Việc sử dụng hợp pháp nút quay lại của trình duyệt để chỉnh sửa bản ghi sẽ dẫn đến lỗi. – JeremyWeir

3

Hai giải pháp server-side tôi suy nghĩ:

  1. Tạo một lần sử dụng "thẻ" trong một trường mẫu ẩn. Khi một mã thông báo được sử dụng, nó sẽ bị xóa khỏi bất kỳ cơ sở dữ liệu hoặc đối tượng bối cảnh phiên nào mà bạn đang lưu trữ. Lần thứ hai, nó không được chấp nhận.
  2. Đã nhận được thông tin bộ nhớ cache và nếu nhận được biểu mẫu giống hệt nhau trong một khoảng thời gian nhất định (10 phút? Một giờ? Bạn quyết định!) Nó bị bỏ qua.
+0

1. Làm thế nào để bạn xử lý một người dùng nhấn nút quay lại (hầu hết các trình duyệt không yêu cầu lại), thay đổi dữ liệu trong biểu mẫu và gửi lại cùng một mã thông báo? 2. Điều gì xảy ra nếu trong khoảng thời gian biểu mẫu được gửi với giá trị A, thì người dùng thay đổi biểu mẫu để có giá trị B, sau đó thay đổi lại thành giá trị A? Nó sẽ không bỏ qua sự thay đổi cuối cùng? – JeremyWeir

2

Triển khai uniqueid để đi cùng với yêu cầu và đăng nhập cùng với quá trình thực thi. Nếu id đã được đăng nhập, bạn không thực hiện lại công việc. Điều này giống như giải pháp dự phòng - bạn nên thử và vô hiệu hóa nút hoặc liên kết clientside cũng như bạn đã đề xuất cho mình

-2

Tôi muốn sử dụng dấu thời gian và so sánh các giá trị với mã phía máy chủ của bạn. Nếu hai dấu thời gian đủ gần và có cùng địa chỉ IP, hãy bỏ qua việc gửi biểu mẫu thứ hai.

+0

op yêu cầu giải pháp phía máy chủ – paan

+0

Tôi không đọc đủ bài đăng, nhưng tôi đã chỉnh sửa câu trả lời của mình để câu trả lời phù hợp hơn với câu hỏi. – VirtuosiMedia

+0

Và nếu người dùng thực sự có hai bit dữ liệu họ muốn đăng trong khoảng thời gian đó thì sao? Tough may mắn dường như là anwer của bạn. – roryf

2

chúng tôi sử dụng thẻ có thời gian nhạy cảm, một lần. Nó giống như một phiên id của sắp xếp. Nhưng nó được gắn với biểu mẫu/trang.

Bạn hủy vé khi người dùng gửi trang và bạn chỉ xử lý các trang đi kèm với một vé hợp lệ. Bạn có thể, đồng thời, thắt chặt an ninh bằng cách đính kèm vé cho người dùng, vì vậy nếu một vé đi vào đó được gửi bởi người dùng không phải là người dùng mà vé đã được gửi đến, bạn từ chối yêu cầu.

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