001: /*
002: * Copyright 2002-2007 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.springframework.web.filter;
018:
019: import java.io.IOException;
020:
021: import javax.servlet.FilterChain;
022: import javax.servlet.ServletException;
023: import javax.servlet.http.HttpServletRequest;
024: import javax.servlet.http.HttpServletResponse;
025:
026: import org.springframework.util.ClassUtils;
027:
028: /**
029: * Servlet 2.3/2.4 Filter that allows one to specify a character encoding for
030: * requests. This is useful because current browsers typically do not set a
031: * character encoding even if specified in the HTML page or form.
032: *
033: * <p>This filter can either apply its encoding if the request does not
034: * already specify an encoding, or enforce this filter's encoding in any case
035: * ("forceEncoding"="true"). In the latter case, the encoding will also be
036: * applied as default response encoding on Servlet 2.4+ containers (although
037: * this will usually be overridden by a full content type set in the view).
038: *
039: * @author Juergen Hoeller
040: * @since 15.03.2004
041: * @see #setEncoding
042: * @see #setForceEncoding
043: * @see javax.servlet.http.HttpServletRequest#setCharacterEncoding
044: * @see javax.servlet.http.HttpServletResponse#setCharacterEncoding
045: */
046: public class CharacterEncodingFilter extends OncePerRequestFilter {
047:
048: // Determine whether the Servlet 2.4 HttpServletResponse.setCharacterEncoding(String)
049: // method is available, for use in the "doFilterInternal" implementation.
050: private final static boolean responseSetCharacterEncodingAvailable = ClassUtils
051: .hasMethod(HttpServletResponse.class,
052: "setCharacterEncoding",
053: new Class[] { String.class });
054:
055: private String encoding;
056:
057: private boolean forceEncoding = false;
058:
059: /**
060: * Set the encoding to use for requests. This encoding will be passed into a
061: * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call.
062: * <p>Whether this encoding will override existing request encodings
063: * (and whether it will be applied as default response encoding as well)
064: * depends on the {@link #setForceEncoding "forceEncoding"} flag.
065: */
066: public void setEncoding(String encoding) {
067: this .encoding = encoding;
068: }
069:
070: /**
071: * Set whether the configured {@link #setEncoding encoding} of this filter
072: * is supposed to override existing request and response encodings.
073: * <p>Default is "false", i.e. do not modify the encoding if
074: * {@link javax.servlet.http.HttpServletRequest#getCharacterEncoding()}
075: * returns a non-null value. Switch this to "true" to enforce the specified
076: * encoding in any case, applying it as default response encoding as well.
077: * <p>Note that the response encoding will only be set on Servlet 2.4+
078: * containers, since Servlet 2.3 did not provide a facility for setting
079: * a default response encoding.
080: */
081: public void setForceEncoding(boolean forceEncoding) {
082: this .forceEncoding = forceEncoding;
083: }
084:
085: protected void doFilterInternal(HttpServletRequest request,
086: HttpServletResponse response, FilterChain filterChain)
087: throws ServletException, IOException {
088:
089: if (this.encoding != null
090: && (this.forceEncoding || request
091: .getCharacterEncoding() == null)) {
092: request.setCharacterEncoding(this.encoding);
093: if (this.forceEncoding
094: && responseSetCharacterEncodingAvailable) {
095: response.setCharacterEncoding(this.encoding);
096: }
097: }
098: filterChain.doFilter(request, response);
099: }
100:
101: }
|