2010-09-20 30 views
8

Tôi đang tạo trang web gửi url đến servlet cho mục đích phân tích. Về phía khách hàng, tôi gửi url như một tham số được mã hóa. Ví dụ ...Java Servlet getParameter cho tham số là URL

Submit: http://www.site.com 
Goes to: http://localhost/myservlet/?url=http%3A%2F%2Fwww.site.com 

Về phía server, tôi có yêu cầu servlet tôi tham số như vậy ...

String url = request.getParameter("url"); 

Những gì tôi nhận được là một chuỗi được giải mã: http://www.site.com. Cho đến nay rất tốt - điều này hoạt động như mong đợi ... hầu hết thời gian.

Vấn đề xảy ra khi một param url chứa các thông số của riêng nó ...

Submit: http://www.site.com?param1=1&param2=2 
Goes to: http://localhost/myservlet/?url=http%3A%2F%2Fwww.site.com%3Fparam1%3D1%26param2%3D2 

Mọi thứ đều tốt trên các trang web của khách hàng, nhưng trong servlet của tôi khi tôi nhận được thông số tôi nhận được chỉ là một phần của url param!

http://www.site.com?param1=1 

Nó bỏ thông số thứ hai từ thông số url đầu vào của tôi! Tôi chắc chắn mã hóa tham số url trước khi gửi nó đến máy chủ ... những gì đang xảy ra?

+0

Không thể sao chép điều này trên Tomcat 6.0.29. Servletcontainer nào? – BalusC

+0

Sử dụng Tomcat 6.0.29. Servlet của tôi đang mở rộng HttpServlet. –

+0

giống như BalusC, tôi không thể tái tạo lỗi của bạn trong tomcat 5.5 hoặc 6. Không cần phải mã hóa/giải mã bất kỳ văn bản nào. Bạn có thể cho chúng tôi thấy mã/biểu mẫu phía khách hàng của bạn không? – Sean

Trả lời

9

Tôi không thể tạo lại sự cố của bạn trên Tomcat 6.0.29. Có nhiều vấn đề hơn. Có lẽ một bộ lọc trong chuỗi đang làm điều gì đó với đối tượng yêu cầu?

Dù sao, đây là một SSCCE trong hương vị của một JSP duy nhất:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <title>Test</title> 
    </head> 
    <body> 
     <p><a href="?url=http%3A%2F%2Fwww.site.com%3Fparam1%3D1%26param2%3D2">click here</a> 
     <p>URL: ${param.url} 
    </body> 
</html> 

Copy'n'paste'n'run nó và nhấp vào liên kết. Ngay tại đây tôi thấy các kết quả sau:

bấm vào đây

URL: http://www.site.com?param1=1&param2=2

Điều này cũng tái sản xuất với một servlet đơn giản như thế này mà được gọi trực tiếp bằng thanh địa chỉ trình duyệt:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.getWriter().write(request.getParameter("url")); 
} 

Tomcat được định cấu hình bằng URIEncoding="UTF-8" trong trình kết nối HTTP, nhưng ngay cả với ISO-8859-1 (đó là mặc định), hành vi là -as dự kiến ​​trong trường hợp cụ thể này- như nhau.

+0

Cảm ơn, vấn đề là tôi đã gửi url của tôi (thông qua biểu mẫu) đến một trang khác. Trang thứ hai đã sử dụng một cuộc gọi ajax đến máy chủ. Trong quá trình này, url đã được giải mã, vì vậy tôi phải recode một lần nữa trước khi thực hiện cuộc gọi của tôi đến servlet. –