2012-03-01 38 views
6

Đây là câu hỏi đầu tiên của tôi ở đây (vì vậy hãy nhẹ nhàng :)). Tôi đã nhìn khắp mọi nơi và không thể tìm thấy câu trả lời cho vấn đề của tôi (cũng đã đi một chút điên rồ trong quá trình này).Apache Tomcat: Tài nguyên được yêu cầu() không khả dụng (trong khi nhập tài nguyên cần sẵn có)

Tôi đang sử dụng Tomcat 7 và IDE Eclipse mới nhất cho các nhà phát triển Java EE (nền tảng Eclipse 3.7.2 và Java EE IDE 1.4.2). Vì vậy, tôi nhận được lỗi này: "Tài nguyên được yêu cầu() không khả dụng" khi truy cập http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp. Tôi đã kiểm tra nhiều lần rằng tệp này nằm trên đĩa trong thư mục chính xác. Tôi đã thử chạy Tomcat bên trong Eclipse và triển khai chiến dịch xuất khẩu trong Tomcat. Mỗi lần cùng một lỗi xuất hiện.

My files:

myTest/index.jsp 
myTest/WEB-INF/html/GetName.html 
myTest/WEB-INF/jsp/savename.jsp 

Khi tôi chạy "http: // localhost/MyTest" index.jsp luôn chạy đúng. Sau đó, tôi sử dụng

"<jsp:forward page="WEB-INF/html/GetName.html"></jsp:forward>" 

bên trong index.jsp để điều hướng đến GetName.html và điều đó cũng hoạt động. Vấn đề bật lên trong GetName.html:

<form action='WEB-INF/jsp/savename.jsp' method="post" > 
What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20> 
<P><INPUT TYPE=SUBMIT> 
</form> 

Khi tôi bấm nút gửi theo hình thức, trình duyệt chuyển hướng đến: http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp và lỗi bật lên.

Vì vậy, tôi thực sự không hiểu tại sao điều này xảy ra ... Ứng dụng Tomcat mặc định hoạt động hoàn hảo ...

P.S. Tôi đã cố gắng cũng manualy điều hướng đến file:

http://127.0.0.1:8080/myTest/WEB-INF/html/GetName.html 
http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp 

nhưng tôi cũng nhận được lỗi (ngay cả khi idex.jsp cũng điều hướng tới GetName.html mà không cần bất kỳ vấn đề) ..

Bất kỳ giúp đỡ được nhiều apreciated! Cảm ơn !!

Trả lời

4

Bạn không thể điều hướng trực tiếp đến bất kỳ tệp/hiện vật nào được đặt trong thư mục WEB-INF (cũng hợp lệ cho META-INF). Đây là tính năng bảo mật của động cơ servlet: nội dung trong WEB-INF được bảo vệ và không thể truy cập từ "bên ngoài" qua URL. Khác, ai cũng có thể đọc các chi tiết nhạy cảm như cấu hình ứng dụng/cơ sở dữ liệu, vv bằng cách chỉ cần lắp ráp các URL thích hợp.

Lý do tại sao thẻ "jsp: forward" vẫn có thể truy cập tệp trong/dưới thư mục WEB-INF là chuyển tiếp thực hiện nội bộ trên máy chủ, tức là yêu cầu đã đến công cụ servlet và index.jsp được thực hiện, do đó servlet engine đã hoàn thành nhiệm vụ bảo mật của nó và bây giờ là tác giả của ví dụ index.jsp chịu trách nhiệm quyết định các tệp nào phải được truy cập.

PS
Ngoài việc sử dụng thẻ "jsp: forward", bạn có thể sử dụng chỉ thị bao gồm (bao gồm tĩnh), ví dụ:

<%@ include file=”/WEB-INF/dir/file.extension” %> 

hoặc thẻ JSP bao gồm (bao gồm động), ví dụ:

<jsp:include page=”/WEB-INF/dir/file.extension” /> 

Sự khác biệt giữa hai loại bao gồm này có thể được googled, kết quả tốt sẽ là http://java.sun.com/products/jsp/tags/11/syntaxref117.html
http://java.sun.com/products/jsp/tags/11/syntaxref1112.html
http://www.coderanch.com/how-to/java/IncludesActionDirective
http://docs.oracle.com/cd/B14099_17/web.1012/b14014/keydev.htm#i1005631

+0

Cảm ơn người đàn ông! Nhưng vấn đề vẫn còn ... Làm thế nào tôi có thể liên kết các tệp khác nhau trong các thư mục khác nhau? Tại sao biểu mẫu trong GetName.html không thể truy cập WEB-INF/jsp/savename.jsp? Điều gì sẽ là giải pháp? (ngoại trừ việc đặt tất cả các tập tin trong thư mục gốc ...) – MoD

+1

Xin lỗi để nói, nhưng với các JSP đơn giản thì không có giải pháp nào khác. Dữ liệu biểu mẫu được gửi bởi trình duyệt, do đó trình duyệt lắp ráp URL và gửi dữ liệu đến máy chủ bằng URL đó và máy chủ nói "KHÔNG, bạn không thể truy cập vào WEB-INF". Vì vậy, bạn phải đặt * savename.jsp * vào thư mục gốc hoặc một thư mục khác trong thư mục gốc và sử dụng các thẻ hoặc chỉ thị để tải nội dung thực từ các tệp trong WEB-INF. – t0r0X

+3

Tôi nghĩ rằng tôi biết những gì bạn đang cố gắng đạt được: bảo vệ/ẩn tất cả các JSP và mã liên quan. Như tôi đã nói, điều đó không thể thực hiện được với các JSP đơn giản. Bạn cần xây dựng một servlet hoặc một bộ lọc phục vụ như là "gateway" và được ánh xạ tới một URI không có trong/bên dưới WEB-INF, và chuyển tiếp các yêu cầu tới các JSP của bạn bên trong WEB-INF. Tôi muốn khuyên bạn nên sử dụng một khung công tác cung cấp cho bạn các khả năng như vậy, ví dụ: Spring MVC framework. Hãy để tôi cung cấp cho bạn một số gợi ý: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-features – t0r0X

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