Duplicate submissions form được chấp nhận trong một số trường hợp. Các tình huống như vậy được gọi là quá trình chuyển đổi idempotent. Khi submissions nhiều dữ liệu quan trọng không đủ để tác động đến hành vi của ứng dụng, Form submissions duplicate không gây ra một mối đe dọa.
Chúng có thể gây ra rất nhiều đau buồn nếu có ví dụ bạn đang mua từ một cửa hàng trực tuyến và vô tình báo chí làm mới trên trang mà bạn đang tính phí. Nếu cửa hàng là đủ thông minh, nó sẽ nhận ra duplicate submission và xử lý nó ân cần mà không tính phí cho bạn hai lần.
Duplicate submissions form có thể xảy ra bằng nhiều cách
- Sử dụng nút Refresh
- Sử dụng nút browser Back để đi qua lại và gửi lại form
- Sử dụng tính năng history của trình duyệt và gửi lại form.
- Malicious submissions cho bất lợi ảnh hưởng đến máy chủ hoặc lợi ích cá nhân
- Nhấp vào nhiều hơn một lần trên một giao dịch mà mất nhiều thời gian hơn thường lệ
Tại sao tất cả trên form được submit một lần nữa sau khi nút Refresh được nhấn? Câu trả lời nằm trong những URL được thấy trong thanh địa chỉ của browser của bạn sau khi submission Form. Hãy xem xét một Form như:
Form nêu trên được submit với những URL /example/submitCustomerForm.do và URL tương tự được hiển thị trên thanh URL. Struts lựa chọn ánh xạ action liên kết với submitCustomerForm và thực thi những trường hợp action. Khi bạn bấm refresh, cùng một URL hiện được gửi và những trường hợp cùng một action và thực thi một lần nữa. Các giải pháp dễ dàng cho vấn đề này là sử dụng HTTP chuyển hướng sau khi submission Form. Giả sử rằng những CustomerForm submission kết quả trong việc hiển thị một trang gọi là Success.jsp. Khi chuyển hướng HTTP được sử dụng, những URL trong thanh địa chỉ URL sẽ trở thành /example/Success.jsp thay vì /example/submitCustomerForm.do. Khi refresh trang, là refresh Success.jsp được tải một lần nữa thay vì /example/submitCustomerForm.do. Vì vậy form sẽ không được submit nữa. Để sử dụng tính năng HTTP chuyển hướng, phía trước thiết lập như sau:
Tuy nhiên có một bắt buộc. Với thiết lập ở trên, tên JSP thực tế được hiển thị trong URL. Bất cứ khi nào tên JSP xuất hiện trong thanh địa chỉ URL, nó hiện một ứng cử viên cho ForwardAction. Do đó thay đổi forward nêu trên để được như sau:
Nơi mà GotoSuccess.do là một action bằng cách sử dụng ánh xạ ForwardAction như sau:
parameter="/Success.jsp" validate="false" />
Bây giờ, bạn đã có được giải quyết những duplicate submission do vô tình refresh của khách hàng.
Struts cung cấp cho bạn với các cấp độ tiếp theo của bảo vệ: Synchronizer Token. Để hiểu làm thế nào các Token Synchronizer làm việc, nền tảng một vài Giới thiệu về xây dựng ở các chức năng trong lớp Action được yêu cầu. Các class Action có phương pháp gọi là saveToken() có logic như sau:
HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}
Phương pháp này tạo ra một session ngẫu nhiên bằng cách sử dụng mã thông báo id, thời gian hiện tại và một MessageDigest và lưu trữ nó ở session sử dụng một tên org.apache.struts.action.TOKEN khóa (Đây là giá trị của biến TRANSACTION_TOKEN_KEY tĩnh trong org.apache.struts Globals class..
Lớp Action đó làm cho Form gọi phương thức là saveToken() để tạo ra một thuộc tính session với các tên nêu trên. Trong JSP, bạn phải sử dụng mã thông báo như là một trường ẩn của Form này như sau:
name="<%=org.apache.struts.taglib.html.Constants.TOKEN_KEY%>"
value=" ">
nhúng tag được hiển thị ở trên, sẽ cho một org.apache.struts.action.TOKEN bean tên (mà là giá trị của Globals TRANSACTION_TOKEN_KEY.) ở phạm vi session và làm cho giá trị của nó là giá trị của thuộc tính ẩn biến đầu vào. Tên của biến đầu vào ẩn là org.apache.struts.taglib.html.TOKEN (Điều này là gì, nhưng giá trị của biến TOKEN_KEY tĩnh trong org.apache.struts.taglib.html.Constants class).
Không có nhận xét nào:
Đăng nhận xét