Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy does getWriter() not get invoked in a simple servlet filter?
    primarykey
    data
    text
    <p>I have downloaded the UpperCaseFilter and CharResponseWrapper classes from <a href="http://www.java2s.com/Tutorial/Java/0400__Servlet/Filterthatusesaresponsewrappertoconvertalloutputtouppercase.htm" rel="nofollow">here</a>: </p> <p>UpperCaseFilter.java</p> <pre><code>package filters; import java.io.CharArrayWriter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class UpperCaseFilter implements Filter { protected FilterConfig config; public void init(FilterConfig config) throws ServletException { this.config = config; } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { ServletResponse newResponse = response; System.out.println("UpperCasefilter begin"); if (request instanceof HttpServletRequest) { newResponse = new CharResponseWrapper((HttpServletResponse) response); } chain.doFilter(request, newResponse); System.out.println("UpperCaseFilter end"); if (newResponse instanceof CharResponseWrapper) { String text = newResponse.toString(); if (text != null) { text = text.toUpperCase(); response.getWriter().write(text); } } } } </code></pre> <p>CharResponseWrapper.java</p> <pre><code>package filters; import java.io.CharArrayWriter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; class CharResponseWrapper extends HttpServletResponseWrapper { protected CharArrayWriter charWriter; protected PrintWriter writer; protected boolean getOutputStreamCalled; protected boolean getWriterCalled; public CharResponseWrapper(HttpServletResponse response) { super(response); charWriter = new CharArrayWriter(); } public ServletOutputStream getOutputStream() throws IOException { if (getWriterCalled) { throw new IllegalStateException("getWriter already called"); } getOutputStreamCalled = true; return super.getOutputStream(); } public PrintWriter getWriter() throws IOException { if (writer != null) { return writer; } if (getOutputStreamCalled) { throw new IllegalStateException("getOutputStream already called"); } getWriterCalled = true; writer = new PrintWriter(charWriter); return writer; } public String toString() { String s = null; if (writer != null) { s = charWriter.toString(); } return s; } } </code></pre> <p>and modified the web.xml file to look like: </p> <pre><code> &lt;filter&gt; &lt;filter-name&gt;Filter1&lt;/filter-name&gt; &lt;filter-class&gt;filters.UpperCaseFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;Filter1&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; </code></pre> <p>I have also downloaded the "apache-tomcat-6.0.37" from the main Apache Foundation website. </p> <p>WHen I run the web app I can see my System.out.println() statements execute so I know it is running the UpperCaseFilter class. </p> <p>However, when I navigate to <code>http://127.0.0.1:8080</code> none of the characters are in upper case! Everything looks normal (a standard Tomcat homepage). </p> <p>I decided to execute "./catalina.sh jpda start" in order to debug this. I noticed the CharWrapperResponse.getWriter() function never gets called, and thus never initializes the "writer" object. Therefore when the UpperCaseFilter invokes CharResponseWrapper.toString() the "text" variable ends up being null since the writer is null (i.e. can't write anything to text because writer=null). </p> <p>I'm not able to figure out why the UpperCaseFilter.getWriter() never gets called. </p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload