问题
I have a page1.jsf, in this page i have a commandButton that put an object in ELFlash, and redirects to page2.jsf. In this page i recover the object by ELFlash. Everything works fine. But while the user remains in page2.jsf, for every ajax request, tomcat shows this warning message:
20/07/2013 09:43:37 com.sun.faces.context.flash.ELFlash setCookie
WARNING: JSF1095: The response was already committed by the time we tried to set the outgoing cookie for the flash. Any values stored to the flash will not be available on the next request.
What does it really mean?
回答1:
Instead of using a Filter as mentioned in @Rafal K answer, you can also increase the response buffer size by setting a context parameter in your web.xml
<!-- increase buffer size to avoid JSF1095 errors -->
<context-param>
<param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name>
<param-value>131072</param-value>
</context-param>
The size is given in bytes and should be larger than your biggest page. You can easily check the size of your pages in Firefox by right clicking and selecting View Page Info
.
回答2:
I think that problem might be related to http chunking. Solution is to increase response buffer size. After that cookies will be set correctly and Flash Scope should work too.
Use this code:
public class FlashScopeFixerFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// Below line: response.getWriter() must be invoked to buffer size setting work. Just DO NOT touch this!
response.getWriter();
HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) response);
wrapper.setBufferSize(10000000);
chain.doFilter(request, wrapper);
}
@Override
public void init(FilterConfig arg0) throws ServletException {}
@Override
public void destroy() {}
}
And in web.xml:
<filter>
<filter-name>FlashScopeFixerFilter</filter-name>
<filter-class>dk.sd.medarbejderdata.common.FlashScopeFixerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FlashScopeFixerFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
回答3:
This warning may be caused if you're using Flash for ajax requests. Probably you're trying to do a redirect with ajax set to true and in the listener you're putting values into Flash. Verify if ajax is needed and set it to false for redirections.
Just don't mix ajax=true
on commandButtons with flash and you'll be free of this warning.
回答4:
Flash as it should suggest the name is meant to be a sort of temporary container concept between the life cycle of jsf. The point is the following: the object stored in the flash will be promoed to the user in the very next view he will encounter(remember that jsf follows the mvc), thus after being 'used' it will disappear, namely will be removed.
I think that's why you get such error, and that is not related directly with mojarra.
来源:https://stackoverflow.com/questions/17762462/getting-warning-from-jsf-the-response-was-already-committed-by-the-time-we-trie