Hi,
   Thank you very much for your reply.
I searched my entire webapp and found out that the only methods I call in the request object are: getRequestURI(), getAttribute(...), setAttribute(...), getRequestDispatcher() and getSession(...). Some of these methods are called before request.getParameter(...). I don't get nor read the request input stream in any servlet or filter. I use some filters in my application. Do filters have any influence on request parameter processing?
Thanks,
   Jair Jr

Duan, Nick escreveu:

Do you do any request processing before invoking request.getParameter in
your servlet (e.g. getting and reading the input stream)?  Do you use
any filters in your web app?

ND

-----Original Message-----
From: Jair da Silva Ferreira Jr [mailto:[EMAIL PROTECTED] Sent: Thursday, January 19, 2006 11:26 AM
To: users@tomcat.apache.org
Subject: problem with lost request parameters

Hi,
I have my web application hosted at brazilian Locaweb. It runs on a Linux as40-32bits server with tomcat 5.5.15 and java 5. My application runs with many (I don't know exactly how many) others in the same tomcat

server. My application uses postgresql 8 database, hibernate 2.1.7c, servlet 2.4, jsp 2.0, jstl 1.1 and tiles without struts.

My problem is that I can't get the request parameters submitted by some of my users. My form uses the post method to submit its data. When I call request.getParameter("validationScheme") in my servlet I get null. request.getParametersNames() also returns an empty Enumeration. My

servlet then throws a ServletException because it can't find a mandatory

parameter. I have never experienced this problem in forms that use the "get" method to submit its data. My form has few parameters, they are: validationScheme (hidden), email and password. It is a simple login form. Here is the relevant html code for my form: <form action="<c:url value="v.servlet"/>" method="post" style="margin:0"

enctype="application/x-www-form-urlencoded" accept-charset="ISO-8859-1">
   <table width="153"  border="0" cellspacing="2" cellpadding="0">
       <tr align="left">
<td width="30%" class="textologin" align="right"><strong>e-mail</strong></td> <td width="70%"><input name="email" type="text" class="combos" size="17" maxlength="50"></td>
       </tr>
       <tr align="left">
<td width="30%" class="textologin" align="right"><strong>senha</strong></td> <td width="70%"><input name="password" type="password" class="combos" size="10">
       <input name="validationScheme" type="hidden" value="loginUsual">
       <input type="submit" value="ok" class="botaook"></td>
       </tr>
   </table>
   </form>

   I have already tried the following:
- adding <%@ page contentType="text/html; charset=ISO-8859-1" %> declaration in all my jsp pages; - adding <form ... enctype="application/x-www-form-urlencoded" accept-charset="ISO-8859-1"> attributes in all my html forms; - adding <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> in all my jsp and html pages; - adding a filter that sets the request character encoding to ISO-8859-1 (request.setCharacterEncoding("ISO-8859-1")). This filter is executed for every jsp and servlet in my application; - searched the web for "tomcat lost request parameter" and "tomcat lose request parameter" using google and found nothing that could help me;

I asked the support people from Locaweb to execute tcpdump while my user tried to submit the form. tcpdump results showed that the request parameters are getting to tomcat correctly. So, I think that tomcat is losing these parameters for some reason that I don't understand.

I also noticed that these errors don't happen to all of my users, but when it happens to a specific user, it can be easily reproduced by that user. Unfortunately, I have never been able to reproduce the error in my machines.

Here is some user information logged by my error page when the problem happens:
=======
user 1
=======
Thu Jan 19 11:45:05 BRST 2006
Request that failed: /v.servlet
Status code: 500
Protocol: HTTP/1.0
Remote Address: 201.9.198.113
Remote Host: 201.9.198.113
Remote Port: 0
Local Address:
Local Name: www.dvdfilme.com.br
Local Port: 80
Server Name: www.dvdfilme.com.br
Server Port: 80
User Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; FunWebProducts)
Request Character Encoding: ISO-8859-1
Request Content-type: application/x-www-form-urlencoded
Response Character Encoding: ISO-8859-1
Response Content-type: text/html
Request Locale: pt_BR
Response Locale: pt_BR
Throwable: javax.servlet.ServletException: 'validationScheme' request parameter not found
.... (exception stack trace)
request parameters: {}

=======
user 2
=======
Thu Jan 19 12:13:37 BRST 2006
Request that failed: /v.servlet
Status code: 500
Protocol: HTTP/1.1
Remote Address: 201.29.118.23
Remote Host: 201.29.118.23
Remote Port: 0
Local Address:
Local Name: www.dvdfilme.com.br
Local Port: 80
Server Name: www.dvdfilme.com.br
Server Port: 80
User Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Request Character Encoding: ISO-8859-1
Request Content-type: application/x-www-form-urlencoded
Response Character Encoding: ISO-8859-1
Response Content-type: text/html
Request Locale: pt_BR
Response Locale: pt_BR
Throwable: javax.servlet.ServletException: 'validationScheme' request parameter not found
.... (exception stack trace)
request parameters: {}

I also looked at tomcat 5.5.15 source code, class org.apache.coyote.tomcat4.CoyoteRequest, method parseRequestParameters()

and noticed that expections (Throwable) are "swallowed" in request parameter processing. So, I think that if any problem happens during this process, the code will silently ignore the request parameter. I also think that this is what is happening in my case. Here is the relevant part of the code:

   /**
    * Parse request parameters.
    */
   protected void parseRequestParameters() {
       ....
       int len = getContentLength();

       if (len > 0) {
           try {
               byte[] formData = null;
               if (len < CACHED_POST_LEN) {
                   if (postData == null)
                       postData = new byte[CACHED_POST_LEN];
                   formData = postData;
               } else {
                   formData = new byte[len];
               }
               int actualLen = readPostBody(formData, len);
               if (actualLen == len) {
                   parameters.processParameters(formData, 0, len);
               }
           } catch (Throwable t) {
               ; // Ignore
           }
       }
   }

Please, is there anything else I can do to fix this problem? Do you have any ideas to help me? Any help would be really appreciated.
   Thank you very much for your help.

Thanks,
   Jair Jr

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to