Tore Eriksson wrote:
> Hello everybody,
> 
> As I found a solution to my problem, I thought I would share it in case
> someone else comes up against the same issue. The reason for the client
> not acting on the redirect is that sendRedirect does not send any
> Content-length header, and the client will then wait for an eventual
> Content body until the servlet finishes. This could be avoided if the
> sendRedirect would include "Content-length: 0" in its HTTP headers. I
> solved my problem by manually constructing the redirect on the
> HttpServletResponse object ('out' below).

Why don't you just insert "return;" after the first redirect was called?

p

> Old code:
> 
> final int PARTIAL_HITS = 25;
> 
> for (int i = 0; i < hits.length(); i++) {
> 
>   /** Insert into table omitted */
> 
>   if (i == PARTIAL_HITS) {
>     // Intermittant redirect, not acted on until doPost returns
>     out.sendRedirect(resultUrl);

      return; // why not terminate the method call here?

>   }
> }
> 
> if (!out.isCommitted()) {
>   // Final redirect
>   out.sendRedirect(resultUrl);
> }
> 
> New code:
> 
> final int PARTIAL_HITS = 25;
> 
> for (int i = 0; i < hits.length(); i++) {
> 
>   /** Insert into table omitted */
> 
>   if (i == PARTIAL_HITS) {
>     // Intermittant redirect, acted on immediately
>     out.setHeader("Location", resultUrl);
>     out.setStatus(303);
>     out.setContentLength(0);
>     out.flushBuffer();
>   }
> }
> 
> if (!out.isCommitted()) {
>   // Final redirect (if case less than PARTIAL_HITS found)
>   out.sendRedirect(resultUrl);
> }
> 
>> Hello again,
>>
>> Thanks for the response, but it seems like my phrasing was a bit unclear.
>> The problem is not the second redirect - in fact there will be no
>> multiple redirects. The second redirect is only there for the case when
>> less than 25 hits are found and the first redirect is not called. The if
>> clause will prevent the program for trying to redirect twice.
>>
>> My problem is rather that the redirect is only commited - the response
>> is sent to the client - until the doPost method/thread finishes. I
>> expected to be able to redirect (once) in the middle of the loop. What I
>> am trying to accomplish is to do a query, enter the hits into a
>> temporary table, and redirect to another program that displays a paged
>> list of hits by reading from the table - in effect using the table as a
>> queue. Since the paged display only shows the top 25 hits, there is no
>> need to wait for all the query results.
>>
>> So once more, my problem is that the redirect is not committed until the
>> function returns. Any help much appreciated.
>>
>> Tore
>>
>> Alan Chaney wrote:
>>> Tore
>>>
>>> Your code below is written as though the 'out' was like writing data to 
>>> a console. The processing in a servlet is part of a  request/response 
>>> cycle, where the 'request' tells it what to do and the response is the 
>>> reply.
>>>
>>> Because of the nature of the request/response cycle you only get one 
>>> chance at the reply. The javadocs for HttpServletResponse.sendRedirect 
>>> make this clear.
>>>
>>> "If the response has already been committed, this method throws an 
>>> IllegalStateException. After using this method the response should be 
>>> considered to be committed and should not be written to."
>>>
>>> In other words, in one servlet request/response cycle you get exactly 
>>> one chance to issue a 'sendRedirect'. If you think this through you'll 
>>> see that this is how it has to be:
>>>
>>> Browser sends request to servlet
>>> Servlet process request and sendsRedirect
>>> Browser display response.
>>>
>>> Your problem is that you are trying to generate a second response 
>>> without a correspondng request. The first response is for the 'top 25' 
>>> and the second is for 'all the rest', but by then you've already 
>>> committed the response.
>>>
>>> To achieve what I think you are trying to achieve would require you to 
>>> create some mechanism where the lucene query results are processed in a 
>>> separate thread and your application makes TWO requests - one for the 
>>> first set of results and then one for the final set of results.
>>>
>>> There are far too many different ways to do this to detail here - I hope 
>>> this helps
>>>
>>> Regards
>>>
>>> Alan Chaney
>>>
>>>
>>>
>>> Tore Eriksson wrote:
>>>> Hi everybody,
>>>>
>>>> I have a problem with redirects in Tomcat 5.5.25. I am doing a Lucene
>>>> search and would like to send a redirect after finding the top 25 hits,
>>>> commit this response, and then continue processing the remaining hits.
>>>> The relevant parts of the doPost() code are as below:
>>>>
>>>> final int PARTIAL_HITS = 25;
>>>>
>>>> for (int i = 0; i < hits.length(); i++) {
>>>>
>>>>   Document doc = hits.doc(i);
>>>>   String citation = doc.get("citation");
>>>>
>>>>   /** Insert into table */
>>>>   try {
>>>>     insertId.setInt(1, java.lang.Integer.parseInt(citation));
>>>>     insertId.executeUpdate();
>>>>   }
>>>>   catch (SQLException e) {
>>>>     out.sendError(500, "Bad SQL insert: " + e);
>>>>   }
>>>>   catch (Exception e) {}
>>>>
>>>>   if (i == PARTIAL_HITS) {
>>>>     // Intermittant redirect
>>>>     out.sendRedirect(resultUrl);
>>>>   }
>>>> }
>>>>
>>>> insertId.close();
>>>>
>>>> if (!out.isCommitted()) {
>>>>   // Final redirect
>>>>   out.sendRedirect(resultUrl);
>>>> }
>>>>
>>>> My problem is that the intermittant redirect is not committed until the
>>>> function returns, which will take quite some time for some queries. I
>>>> have tried HttpServletResponse.flushBuffer() and other possible
>>>> variations. Any pointers would be most appreciated.
>>>>
>>>> Tore
>>
>> _______________________________________________________________
>> Tore Eriksson [tore.eriksson ad po.rd.taisho.co.jp]
> 
> _______________________________________________________________
> Tore Eriksson [tore.eriksson at po.rd.taisho.co.jp]
> 
> 
> 
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to