Làm cách nào để đảm bảo ứng dụng web java servlets của tôi là an toàn? Tôi cần phải làm gì liên quan đến các biến phiên, các biến tĩnh của một lớp, hoặc bất kỳ thứ gì khác có thể là một vấn đề an toàn thread?Trong Java, Làm cách nào để đảm bảo ứng dụng web của tôi an toàn?
Trả lời
Thực tế: chỉ có 1 thể hiện của một servlet trong của webapp cả đời. Nó được tạo ra khi khởi động webapp và nó bị phá hủy khi tắt webapp. Ngoài ra, hãy xem this answer để biết cách giải thích sơ bộ.
Vì vậy, nó được chia sẻ giữa tất cả các yêu cầu (chủ đề). Nếu bạn chỉ định yêu cầu hoặc phiên dữ liệu scoped như trường hợp (hoặc thậm chí tệ hơn, như static
) biến, sau đó nó chắc chắn không phải là threadsafe, bởi vì nó sau đó được chia sẻ giữa tất cả các yêu cầu (chủ đề) từ tất cả người dùng (phiên) applicationwide. Bạn chỉ cần gán chúng làm phương thức biến cục bộ để giữ chúng an toàn. Vì vậy:
public class MyServlet extends HttpServlet {
private Object thisIsNOTThreadSafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
Về cơ bản, tất cả những gì bạn cần phải tính đến khi phát triển các servlet có chủ đề an toàn.
Sau đó có các thuộc tính phiên (HttpSession
) có thể được chia sẻ giữa nhiều yêu cầu từ cùng một người dùng, nhưng trong thế giới thực, bạn thực sự không cần phải lo lắng về việc đồng bộ hóa quyền truy cập phiên. Bạn thường chỉ đặt dữ liệu người dùng cụ thể ở đó, chẳng hạn như người dùng đã đăng nhập, tùy chọn dành riêng cho người dùng, giỏ mua hàng, v.v. Bạn chỉ cần đảm bảo rằng bạn không đặt dữ liệu phạm vi yêu cầu thuần túy trong phạm vi phiên. Nó sẽ được phản ánh trong nhiều cửa sổ trình duyệt/tab trong cùng một phiên.
Sau đó có ứng dụng (ServletContext
) thuộc tính được chia sẻ giữa tất cả người dùng trên toàn ứng dụng, nhưng bạn thường chỉ đặt hằng số và dữ liệu tĩnh khác, như cấu hình webapp, nhà máy DAO, nội dung danh sách thả xuống, v.v.Tất cả điều này có thể được thực hiện bằng cách thực hiện với ServletContextListener
, cũng xem this answer để có ví dụ cơ bản. Bạn chỉ cần đảm bảo rằng bạn không đặt dữ liệu phạm vi yêu cầu hoặc phiên thuần túy trong phạm vi ứng dụng.
Bạn có ý nghĩa trong ngữ cảnh trái với bất kỳ ứng dụng java nào khác không? Thực sự không có nhiều khác biệt. Mỗi yêu cầu đối với một servlet làm cho thùng chứa phát hành một luồng mới để xử lý nó, do đó các biến mẫu trong servlet phải là an toàn luồng. Tốt hơn là xử lý tất cả các biz của bạn với các biến cục bộ trong các phương thức doGet/doPost(). Có một thứ mà tôi có thể nghĩ đến. Với các biến phiên, có thể là trường hợp người dùng có hai cửa sổ trình duyệt đang mở, cả hai đều trỏ đến ứng dụng của bạn. Trong trường hợp này, bạn sẽ cần phải xem ra cho an toàn thread với phạm vi phiên là tốt.
Ồ, đó là câu hỏi được tải.
Để đơn giản, bạn cần đảm bảo rằng quyền truy cập vào bất kỳ dữ liệu được chia sẻ nào được đồng bộ hóa cẩn thận. Ví dụ: bạn có thể muốn đồng bộ hóa quyền truy cập vào biến tĩnh với mutex hoặc chức năng được đồng bộ hóa.
Lưu ý rằng bạn cũng có thể cần phải đồng bộ hóa ở các cấp cao hơn nếu bạn cần giao dịch nguyên tử sửa đổi nhiều tài nguyên được chia sẻ cùng một lúc.
Thiết kế ứng dụng đồng thời không đơn giản và không có viên đạn ma thuật (không may). Tôi rất khuyên bạn nên cuốn sách "Java Concurrency in Practice" để biết thêm thông tin về cách viết mã đồng thời an toàn.
- không sử dụng các biến thể hiện của servlets và bộ lọc
- không sử dụng các biến tĩnh
- read this article on session thread safety
- nghĩ
- 1. Làm cách nào để bảo mật ứng dụng web java của tôi?
- 2. Làm thế nào để đảm bảo an toàn luồng của phương pháp tĩnh tiện ích?
- 3. Đảm bảo trang web của tôi
- 4. Làm cách nào để bảo mật dịch vụ web an toàn với oauth?
- 5. Làm cách nào để đảm bảo yêu cầu đến từ trang web của tôi?
- 6. Làm cách nào để phân tích mã nguồn Java và đảm bảo nó là Chủ đề an toàn
- 7. Đảm bảo rằng mã của tôi là an toàn chủ đề
- 8. Làm cách nào để đảm bảo quyền truy cập vào dịch vụ web của tôi chỉ từ mã của tôi?
- 9. Làm cách nào để đảm bảo ứng dụng iPhone của tôi sử dụng hộp cát của Trung tâm trò chơi?
- 10. Trình lọc HTML làm gì để đảm bảo lập trình PHP an toàn?
- 11. Làm api web của tôi có an toàn không?
- 12. Làm cách nào để kết nối an toàn ứng dụng Backbone.js với cơ sở dữ liệu?
- 13. Làm cách nào để đảm bảo toàn bộ nhóm của tôi có cùng phiên bản .Net thời gian giống nhau?
- 14. Đảm bảo dịch vụ web?
- 15. Sử dụng 'typedef' để đảm bảo an toàn loại hợp lý
- 16. Dịch vụ web an toàn
- 17. Đảm bảo tải JSON, XML và YAML an toàn trong dự án Django
- 18. làm thế nào để bảo mật trang web của tôi
- 19. Tôi làm cách nào để thực hiện các truy vấn Xpath loại an toàn trong Java?
- 20. Làm thế nào để bạn đảm bảo nhiều luồng có thể truy cập một cách an toàn một trường lớp?
- 21. Đảm bảo không đảm bảo VirtualMachineError
- 22. Cách tạo ứng dụng Java EE được cấp phép an toàn?
- 23. Làm thế nào để bảo đảm Elmah.axd?
- 24. Làm cách nào để hủy an toàn cửa sổ hộp thoại của ứng dụng wxPython?
- 25. Sử dụng Java 6, trên linux làm cách nào tôi có thể đảm bảo sử dụng ổ cắm ipv4?
- 26. Đảm bảo an toàn chủ đề trên phương pháp tĩnh Trong C#
- 27. JavaScript - Làm cách nào để đảm bảo jQuery được tải?
- 28. Cách tạo REST Api an toàn cho ứng dụng của tôi?
- 29. Làm cách nào để sử dụng an toàn -XX: -UseSplitVerifier?
- 30. Cách ứng dụng Java WebStart Lấy địa chỉ MAC để truy cập trang web của tôi
Một câu hỏi liên quan đến "một servlet trong đời của ứng dụng web" - Tôi nghĩ đó là một đối tượng gộp, vì vậy ở đó * có thể * nhiều hơn một tùy theo động cơ của servlet tùy thuộc vào tải. Điều đó không đúng? – duffymo
Chỉ khi nó thực hiện (theo Servlet 2.4 không được chấp nhận) 'SingleThreadModel'. – BalusC
@ BalusC: Cảm ơn rất nhiều Ngài, câu trả lời này đã giúp tôi cuối cùng. Tôi đã xóa câu hỏi của tôi và upvoted câu trả lời của bạn. Không có ai giống bạn trong Java. Cảm ơn một triệu lần nữa. –