2009-07-29 30 views
9

Có ai biết cách nào để chỉ nhận các tham số POST từ một đối tượng HttpServletRequest không?Chỉ truy xuất các tham số POST (Java)

IE, PHP có $ superglobal và Perl's CGI.pm sẽ chỉ truy xuất thông số POST nếu phương thức HTTP là POST (theo mặc định).

HttpServletRequest.getParameter (Chuỗi) sẽ bao gồm các thông số URL GET ngay cả khi phương thức HTTP là POST.

+2

Như tôi đã hiểu, bạn chỉ muốn tham số trong nội dung POST và KHÔNG tham số từ URL POST. – McDowell

+0

Chính xác. Đó là một mô tả chính xác hơn. – dankuck

Trả lời

6

Tôi đoán một cách có thể là phân tích cú pháp theo cách thủ công HttpServletRequest.getQueryString() và kiểm tra xem thông số không có trong đó hay không.

Một thực hiện ngây thơ (bỏ qua url thoát giá trị key) sẽ đi một cái gì đó như thế này (chưa được kiểm tra):

public boolean isInQuery(HttpServletRequest request, String key) { 
    String query = request.getQueryString(); 
    String[] nameValuePairs = query.split("&"); 
    for(String nameValuePair: nameValuePairs) { 
    if(nameValuePair.startsWith(key + "=")) { 
     return true; 
    } 
    } 
    return false; 
} 
+1

Đó là một giải pháp thực sự đơn giản. Tuy nhiên, điều này nghe giống như một cách giải quyết. Tôi tự hỏi nếu có một số lớp tiêu chuẩn để làm công việc. Đối với người đọc, hãy thêm dòng này vào đầu phương thức: khóa = URLEncoder.encode (khóa, "UTF-8"); – dankuck

+0

Ah, tôi đoán "cách giải quyết" là từ sai. Nó chỉ cảm thấy sai bởi vì tôi biết có mã làm một cái gì đó rất tương tự ẩn ở đâu đó trong đó. – dankuck

+1

df đề cập đến một lớp được gọi là ParameterParser trong lớp HttpClient của Apache. Nó không nằm trong thư viện chuẩn của Java, nhưng ít nhất nó nghĩ về tất cả những điều nhỏ nhặt mà chúng ta có thể đã quên ở đây. Sau đó, mã có thể đi qua getParameterValues ​​() và bỏ qua bất kỳ giá trị nào có một trong các giá trị được đưa ra bởi ParameterParser.parse(). – dankuck

8

Từ hiểu biết của tôi, không có những thứ như các thông số POST và GET tham số trong HTTP, có là các phương thức POST và GET. Khi một yêu cầu được thực hiện bằng cách sử dụng phương thức POST, các tham số đi vào bên trong nội dung thư. Trong trường hợp yêu cầu GET, các tham số đi vào URL.

Suy nghĩ đầu tiên của tôi là đó là lỗi triển khai trong vùng chứa servlet của bạn. Nhưng, vì mọi thứ không phải lúc nào bạn mong đợi, đặc tả kỹ thuật java servlet (ít nhất là phiên bản 2.4) không phân biệt giữa hai loại tham số. Vì vậy, không có cách nào để có được các thông số bài viết hoặc url bằng cách sử dụng API servlet.

Chắc chắn bạn đã có một kế hoạch B. Tuy nhiên, chỉ trong trường hợp, tôi gửi hai lựa chọn thay thế mà đến tâm trí của tôi:

  1. Nếu bạn có quyền truy cập vào các định nghĩa tên tham số, bạn có thể sử dụng một tiền tố để phân biệt giữa hai khi bạn lặp lại kết quả getParameterNames().

  2. Bạn có thể phân tích URL tạo đối tượng URL và sử dụng phương thức getQuery() để chỉ lấy thông số. Sau đó, phân tích các tham số trên chuỗi truy vấn bằng cách sử dụng một số lớp tiện ích như ParameterParser trong thư viện HttpClient. Và cuối cùng, trừ các tên đó khỏi kết quả getParameterNames().

+0

Hmm ... Tôi chỉ đang thử nghiệm một triển khai (Tomcat cho Win32). Bạn đã thử nghiệm những người khác chưa? – dankuck

+1

ParameterParser có vẻ giống như gói hoàn hảo cho nhiệm vụ xác định thông số và giá trị URL. Sau đó, một cái gì đó giống như cơ chế trong câu trả lời của ykaganovich có thể được sử dụng. – dankuck

3

Không thể bạn chỉ nhận được các thông số từ HttpServletRequest trong doPost hoặc doGet trong một lớp con của HttpServlet?

Bất kỳ thứ gì bạn lấy (qua getParemeter) bên trong doPost là POST và bất kỳ thứ gì bên trong doGet đều là GET.

+0

Tôi đang cố gắng bỏ qua các tham số được chuyển vào URL. Chúng được bao gồm bởi getParameter bất kể phương thức HTTP nào được sử dụng. – dankuck

+1

Yêu cầu bài đăng có thể có cả tham số GET và POST. Nếu chỉ GET tham số (nói "biệt hiệu") là hiện tại, sau đó nếu bạn request.getParameter ("biệt hiệu") bên trong doPost, bạn sẽ nhận được "biệt hiệu" GET tham số, mà nên được null từ lời giải thích của bạn. – Jamol

1

Tôi không chắc liệu điều này có hiệu quả hay không, nhưng bạn có thể thử trích xuất nội dung thô của nội dung POST bằng cách sử dụng request.getReader(). Tuy nhiên, vùng chứa có thể xóa dữ liệu đó trước khi chuyển quyền kiểm soát cho ứng dụng của bạn và ngay cả khi không, bạn phải tự giải mã chuỗi tham số.

+0

Hài hước, tôi có khuynh hướng sử dụng các ý tưởng vòng được gợi ý ở trên vì dữ liệu POST có hai định dạng phổ biến khác nhau (và bất kỳ số nào khác). – dankuck

2

Tôi nghĩ bạn có thể làm điều gì đó với getMethod() có sẵn từ Giao diện HttpServletRequest.

Java doc 1.6

này cũng có sẵn trong 1.4 và 1.5.

+0

Điều đó sẽ không cho bạn biết bất cứ điều gì về nguồn gốc của các tham số. Nó sẽ chỉ cho bạn biết phương thức HTTP nào được sử dụng trong yêu cầu. – Yinzara

0

Câu hỏi đã được trả lời trong this related post:

Normaly bạn có thể GET và các thông số POST trong một servlet theo cùng một cách:

request.getParameter("cmd"); 

Nhưng chỉ khi dữ liệu POST được mã hóa như là chìa khóa-giá trị các cặp nội dung loại: "ứng dụng/x-www-form-urlencoded" giống như khi bạn sử dụng biểu mẫu HTML chuẩn .

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