Tại sao các ứng dụng web Java sử dụng phần mở rộng .do? Nó từ đâu đến?


114

Tôi luôn tự hỏi tại sao rất nhiều nhà phát triển Java sử dụng ".do" làm phần mở rộng cho tài nguyên bộ điều khiển web (MVC) của họ. Ví dụ: http://example.com/register.do

Nó thậm chí không có vẻ là khung cụ thể như tôi đã thấy trong các dự án Spring MVC và Struts. Thực hành mở rộng ".do" này đến từ đâu. Tại sao điều này được thực hiện thay vì không có phần mở rộng? Tôi cảm thấy như tôi đã bỏ lỡ bản ghi nhớ thế giới Java về điều này.

Cá nhân tôi không muốn mở rộng.


4
Lưu ý thân thiện cho những người muốn di chuyển từ ".do" và có URL thân thiện. Sử dụng đường dẫn servlet thay vì phần mở rộng tức là / do / login và sau đó sử dụng Tuckey Filter URL ghi lại để tạo / do / login ==> / login.
Adam Gent

Đúng, viết lại URL (có thể là thông qua mod_rewrite hoặc bộ lọc của Tuckey) sẽ thực hiện thủ thuật.
Pascal Thivent,

1
nó khá ngu ngốc, và không có lý do gì cho điều đó.
chối cãi vào

Câu trả lời:


75

Theo hiểu biết của tôi, quy ước này đã được truyền bá bởi Struts1. Hướng dẫn sử dụng đặt nó như thế này:

5.4.2 Định cấu hình ánh xạ ActionServlet

Lưu ý: Tài liệu trong phần này không dành riêng cho Struts. Cấu hình của ánh xạ servlet được định nghĩa trong Đặc tả Servlet của Java. Phần này mô tả các phương tiện phổ biến nhất để cấu hình một ứng dụng.

Có hai cách tiếp cận phổ biến để xác định các URL sẽ được xử lý bởi bộ điều khiển servlet - đối sánh tiền tố và đối sánh phần mở rộng. Một mục ánh xạ thích hợp cho từng cách tiếp cận sẽ được mô tả dưới đây.

Đối sánh tiền tố có nghĩa là bạn muốn tất cả các URL bắt đầu (sau phần đường dẫn ngữ cảnh) với một giá trị cụ thể được chuyển đến servlet này. Mục nhập như vậy có thể trông như thế này:

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>/do/*</url-pattern>
</servlet-mapping>

có nghĩa là một URI yêu cầu khớp với /logonđường dẫn được mô tả trước đó có thể trông giống như sau:

http://www.mycompany.com/myapplication/do/logon

đâu /myapplicationlà đường dẫn ngữ cảnh mà ứng dụng của bạn được triển khai.

Mặt khác, ánh xạ mở rộng đối sánh các URI yêu cầu với servlet hành động dựa trên thực tế là URI kết thúc bằng một dấu chấm theo sau bởi một tập ký tự đã xác định. Ví dụ, servlet xử lý JSP được ánh xạ tới *.jspmẫu để nó được gọi để xử lý mọi trang JSP được yêu cầu. Để sử dụng *.do tiện ích mở rộng (ngụ ý "làm điều gì đó") , mục nhập ánh xạ sẽ trông giống như sau:

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

và một URI yêu cầu khớp với /logonđường dẫn được mô tả trước đó có thể trông giống như sau:

http://www.mycompany.com/myapplication/logon.do

CẢNH BÁO - Khung sẽ không hoạt động chính xác nếu bạn xác định nhiều <servlet-mapping>phần tử cho servlet bộ điều khiển.

CẢNH BÁO - Nếu bạn đang sử dụng hỗ trợ mô-đun mới kể từ phiên bản 1.1, bạn nên biết rằng chỉ hỗ trợ ánh xạ mở rộng.

Và tôi nghĩ rằng quy ước này đã được giữ (đôi khi không thay đổi URL ngay cả sau khi thay thế Struts1, đôi khi chỉ vì mọi người hài lòng với nó).


2
Tôi nghĩ rằng đó là Struts 1. Một thời gian dài như vậy chắc tôi đã quên. Đó là những ngày không mấy tốt đẹp đối với Java Web Dev.
Adam Gent

4
@Adam Vào thời điểm đó (~ 2001), tôi rất vui với Struts1. Hôm nay, sử dụng nó sẽ khiến tôi khóc.
Pascal Thivent,

5
Năm 2001, chúng tôi MAY MẮN khi có Struts 1!
Thorbjørn Ravn Andersen

2
Với Struts 2, tất cả chúng ta đều có thể hạnh phúc!
Alireza Fattahi

9

Thực tế phổ biến là ánh xạ servlet thanh chống của bạn thành * .do trong web.xml để chuyển URL đến servlet thanh chống. Ví dụ:

<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

Thực sự không có lý do gì ngoại trừ quy ước cho điều này. Nếu bạn không sử dụng tiện ích mở rộng, bạn cần thực hiện một số phép thuật để xử lý hình ảnh và nội dung tĩnh khác theo cách không gửi chúng đến sevlet của bạn. Thường thì điều này được thực hiện tại bộ cân bằng tải của máy chủ web phía trước.


2
Tôi không biết nó là ma thuật. Tất cả là có một servlet điều phối chính và có thể thực hiện một số viết lại URL để tránh có tiền tố / myservlet /. Xem ghi lại URL Tuckey.
Adam Gent

-2

Chỉ là một mẹo bảo mật!

Cách tốt là sử dụng một số tiện ích mở rộng bất thường cho bộ điều khiển của bạn, bằng cách này, những kẻ xâm nhập sẽ cần dành nhiều thời gian hơn để tìm một số thông tin về trang web.

Vì vậy, nếu bạn thay đổi tiện ích mở rộng mặc định, cộng với một số tĩnh trong khuôn khổ của bạn có thể tiết lộ bàn tay của bạn, thì khung công tác MVC của bạn có thể hoàn toàn không xác định.

Thậm chí thay đổi phần mở rộng thành phphoặc aspxcó thể là ý tưởng hay.

Thực sự đây là bảo mật bằng cách xáo trộn, nhưng điều này không ngược lại với bảo mật tốt. Phân lớp bảo mật bằng cách che khuất trên hệ thống đã an toàn có thể hữu ích. Có những ưu và nhược điểm thú vị của bảo mật bằng cách xáo trộn và khi nào chúng có thể được sử dụng trên internet.


5
Đó là bảo mật bằng cách che khuất.
TGO

Thực sự đây là obfuscation
Brandon G

4
Sự che khuất không phải là điều đối lập với bảo mật tốt. Từ chối tiết lộ thông tin mà khách hàng không cần biết là một phương pháp hay. Tại công ty của tôi, chúng tôi đã loại bỏ tất cả các tiêu đề máy chủ web và máy chủ ứng dụng và thay thế nó bằng một chuỗi tạo sẵn. Số lần quét lỗ hổng bảo mật thậm chí cả các trang web ít người biết đến cũng là một điều tích cực, bất cứ điều gì bạn có thể làm để khiến bản thân không trở thành mục tiêu là điều tích cực.
XP84 ngày

Theo mặc định, các tiêu đề phản hồi sẽ đủ để tìm ra những thứ.
Kannan Ramamoorthy
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.