Là phiên web web Thiết kế xấu Bad? Tại sao?


13

hôm nọ tôi đang thảo luận với một đồng nghiệp và anh ta nói rằng việc sử dụng phiên của người dùng trong ứng dụng web là sai. Tôi đã trả lời rằng nó có thể sai tùy thuộc vào thông tin bạn đang lưu trữ, nếu không thì tại sao một dịch vụ phiên web thậm chí còn được cung cấp bởi Microsoft (chúng tôi đã nói về ASP.NET).

Anh ta trả lời tôi, một lần nữa, rằng ngay cả trong MS họ cũng có thể dễ dàng trả lời tôi rằng đó là thiết kế tồi. Và rằng anh ta có thể cho tôi xem một số tờ giấy trắng chứng minh điều đó.

Thật không may, tôi không có cơ hội để liên lạc với anh chàng này nữa, nhưng tôi thực sự muốn hiểu thêm về quan điểm của anh ta. Có ai có thông tin / quan điểm về điều đó ở đây không?


2
Giao thức HTTP ban đầu được thiết kế là "không trạng thái" - do đó tất cả các giao dịch là số ít và dựa trên thông tin được cung cấp. Phiên là một cách để có được xung quanh đó trong một số sử dụng. Thực tế, mặc dù, đối với nhiều trang web hiện đại, tôi không thể nghĩ ra một cách đơn giản mà bạn tránh các phiên; có lẽ tôi không đủ sáng tạo.
Katana314

@ Katana314 Lưu trữ cơ sở dữ liệu với cookie. Bạn có thể sử dụng phiên cho thông tin rất cơ bản như xác định người dùng, nhưng rất nhiều triển khai phiên (đặc biệt là ở Django, chúng tôi đã đánh nhiều lần) có những lỗi có thể tạo điều kiện chạy đua với dữ liệu thoáng qua hơn bất cứ khi nào nhiều người dùng yêu cầu được gửi cùng một lúc (như với các cuộc gọi AJAX)
Izkata

2
Lưu trữ cơ sở dữ liệu với cookie chỉ là vấn đề chứa phiên của bạn trong cơ sở dữ liệu.
Alan Shutko

Câu trả lời:


11

Tôi không nghĩ anh ấy có nghĩa là "Thiết kế tồi" nhiều như "Thực hành tồi". Nói chung, một ứng dụng web nên không trạng thái càng tốt. Mặc dù, ví dụ, bạn có thể cần biết thông tin người dùng để cho phép xem trang, thông tin đó có thể được lưu trên máy khách dưới dạng cookie và máy chủ chỉ cần xác thực thông tin người dùng mỗi lần.

Điều đó sẽ rất lý tưởng, nhưng bạn không thể luôn tin tưởng vào việc khách hàng có thể lưu cookie. Hơn nữa, nó liên quan đến việc xác nhận người dùng theo kiểu không trạng thái, có khả năng liên quan đến việc truy vấn thông tin từ cơ sở dữ liệu cho một yêu cầu trang đơn giản. Thông thường, việc lưu thông tin đó trong phiên sẽ đơn giản hơn.

Tuy nhiên, một khi bạn đã vượt qua Rubicon, rất nhiều lập trình viên muốn lưu lại không chỉ thông tin xác thực trong phiên mà còn nhiều thứ khác nữa. Đây là một mô hình chống và có xu hướng làm cho ứng dụng web của bạn phụ thuộc nhiều vào trạng thái, đó chính xác là những gì được cho là nên tránh ở nơi đầu tiên.

Một số lập trình viên sẽ xoay quanh công nghệ như Spring (nếu bạn đang sử dụng Java) để gỡ rối những gì sẽ là một mớ hỗn độn của các phụ thuộc, nhưng tôi cho rằng điều đó chỉ giúp tạo ra các phụ thuộc dễ dàng hơn thay vì loại bỏ chúng. Những công nghệ như vậy sẽ hỗ trợ sự phát triển của bạn, không làm cho vấn đề chống mô hình của bạn giảm bớt vấn đề.

Do đó, một nguyên tắc nhỏ là nếu bạn có thể viết nó không trạng thái, có lẽ nên làm như vậy hoặc bạn có nguy cơ rơi vào cái bẫy này. Rõ ràng là bạn sẽ gặp phải những tình huống bắt buộc, nhưng nói chung, bạn chỉ nên lưu thông tin mà nếu không khó có thể truy vấn.


1
but you can't always count on the client being able to save cookiessau đó là AFAIK, bạn cũng không thể tin vào các phiên. Không phải cookie được sử dụng để xác định phiên nào thuộc về người dùng nào, hoặc có các phương pháp khác và đó đơn giản là phổ biến nhất?
Izkata

Thông tin phiên thường được lưu trên máy chủ cho mỗi kết nối máy chủ / máy khách và điều này trở thành xu hướng phổ biến cho các trang web lớn không thể dựa vào người dùng đã bật cookie. Có các tùy chọn (và / hoặc thư viện js) buộc lưu thông tin đã nói trên PC khách (đã trở nên rất phổ biến vào cuối), nhưng không có HTML 5, cookie là cách duy nhất để đạt được điều này. Theo hiểu biết của tôi, không có cách nào khác để làm điều này.
Neil

8

Tôi nghĩ bạn đang nhầm lẫn hai chủ đề khác nhau: 1) phiên và 2) mô hình trang của biểu mẫu web asp.net

Một phiên web là cần thiết để xác thực người dùng. Tốt nhất là một phiên chỉ nên được sử dụng cho mục đích này. Bạn không nên lưu trữ dữ liệu người dùng trong một phiên (cho dù đó là trên máy chủ, trong cookie hoặc như asp.net/webforms thực hiện: trong chính trang đó). Không ai nên nói rằng một phiên web là xấu, nhưng thay vào đó, lưu trữ dữ liệu người dùngtrong một phiên là một thực hành xấu. Các lý do không lưu trữ dữ liệu người dùng trên máy chủ bao gồm các lý do tương tự để tránh các biến toàn cục. Lưu trữ dữ liệu người dùng trong cookie hoặc trong trang có thể giới thiệu các vấn đề bảo mật. Sử dụng mô hình trang của asp.net cũng không tuân thủ bản chất không trạng thái của web. Bạn có thể thực hiện tìm kiếm để tìm hiểu thêm về lý do tại sao webforms là một thiết kế tồi. Phiên khác là một phần cần thiết của các ứng dụng web.


"Mặt khác, phiên là một phần cần thiết của các ứng dụng web." Số
masterxilo

6

Kiểm soát và lưu trữ trạng thái phiên trên một trang về cơ bản là một hack. Đây có phải là trường hợp của MS - một điều cần thiết vì họ muốn có thể cung cấp một môi trường phát triển nơi bạn có thể thiết kế các trang như bạn có thể trong môi trường winform.

MS đã tự mình chuyển sang kiến ​​trúc MVC (phiên bản mới nhất - MVC 4), điều này trở lại nhiều hơn so với giao thức thực sự nên là - không trạng thái.

Có những tình huống lưu trữ trạng thái vẫn còn tiện dụng nhưng nên hiểu rằng đây là ngoại lệ chứ không phải là quy tắc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.