diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/CharsetEncodingFilter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/CharsetEncodingFilter.java index d6a2c6a83..9d45baa78 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/CharsetEncodingFilter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filters/CharsetEncodingFilter.java @@ -3,11 +3,11 @@ package edu.cornell.mannlib.vitro.webapp.filters; import java.io.IOException; +import java.io.UnsupportedEncodingException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; -import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; @@ -16,6 +16,7 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class CharsetEncodingFilter implements Filter { + @Override public void init(FilterConfig filterConfig) throws ServletException { // Nothing to set up @@ -26,25 +27,51 @@ public class CharsetEncodingFilter implements Filter { ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; - ServletContext ctx = req.getSession().getServletContext(); - String url = req.getRequestURL().toString(); - if (!ServletFileUpload.isMultipartContent(req)) { - servletRequest.setCharacterEncoding("UTF-8"); - } - - if (req.getContentType() == null) { - String typeFromContext = ctx.getMimeType(url); - if (typeFromContext == null) { - servletResponse.setContentType("text/html;charset=UTF-8"); - } else { - servletResponse.setContentType(typeFromContext); - } - } + setCharacterEncodingOnRequest(req); + setContentTypeOnResponse(req, servletResponse); filterChain.doFilter(servletRequest, servletResponse); } + private void setCharacterEncodingOnRequest(HttpServletRequest req) + throws UnsupportedEncodingException { + if (!ServletFileUpload.isMultipartContent(req)) { + req.setCharacterEncoding("UTF-8"); + } + } + + private void setContentTypeOnResponse(HttpServletRequest req, + ServletResponse servletResponse) { + if (servletResponse.getContentType() != null) { + return; + } + + String uri = req.getRequestURI(); + if (!hasExtension(uri)) { + servletResponse.setContentType("text/html;charset=UTF-8"); + return; + } + + String typeFromContext = req.getSession().getServletContext() + .getMimeType(uri); + if (typeFromContext == null) { + servletResponse.setContentType("text/html;charset=UTF-8"); + return; + } + + servletResponse.setContentType(typeFromContext); + servletResponse.setCharacterEncoding("UTF-8"); + } + + private boolean hasExtension(String uri) { + return uri.matches(".+" // some stuff + + "\\." // a literal period + + "[^/]+" // some stuff that's not a slash + + "$" // the end of the URI + ); + } + @Override public void destroy() { // Nothing to tear down