1、jsp页面已设置页面编码:
<%@ page contentType="text/html;charset=UTF-8" %>
表单数据以post方式提交。
2、web.xml添加过滤器,使用的是spring内置过滤器:
<span style="font-size:18px;"> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter></span>
CharacterEncodingFilter源码:
public class CharacterEncodingFilter extends OncePerRequestFilter { private String encoding; private boolean forceEncoding = false; /** * Create a default {@code CharacterEncodingFilter}, * with the encoding to be set via {@link #setEncoding}. * @see #setEncoding */ public CharacterEncodingFilter() { } /** * Create a {@code CharacterEncodingFilter} for the given encoding. * @param encoding the encoding to apply * @since 4.2.3 * @see #setEncoding */ public CharacterEncodingFilter(String encoding) { this(encoding, false); } /** * Create a {@code CharacterEncodingFilter} for the given encoding. * @param encoding the encoding to apply * @param forceEncoding whether the specified encoding is supposed to * override existing request and response encodings * @since 4.2.3 * @see #setEncoding * @see #setForceEncoding */ public CharacterEncodingFilter(String encoding, boolean forceEncoding) { Assert.hasLength(encoding, "Encoding must not be empty"); this.encoding = encoding; this.forceEncoding = forceEncoding; } /** * Set the encoding to use for requests. This encoding will be passed into a * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call. * <p>Whether this encoding will override existing request encodings * (and whether it will be applied as default response encoding as well) * depends on the {@link #setForceEncoding "forceEncoding"} flag. */ public void setEncoding(String encoding) { this.encoding = encoding; } /** * Set whether the configured {@link #setEncoding encoding} of this filter * is supposed to override existing request and response encodings. * <p>Default is "false", i.e. do not modify the encoding if * {@link javax.servlet.http.HttpServletRequest#getCharacterEncoding()} * returns a non-null value. Switch this to "true" to enforce the specified * encoding in any case, applying it as default response encoding as well. */ public void setForceEncoding(boolean forceEncoding) { this.forceEncoding = forceEncoding; } @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) { request.setCharacterEncoding(this.encoding); if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); } }
过滤器已设置request、response编码为“UTF-8”。
3、在Controller中使用request.getParameter("office.name")取值乱码。
4、编解码后取值正常:
String ss = new String(request.getParameter("office.name").getBytes("ISO8859-1"),"utf-8");取值为中文。
但不需要将该值取出进行处理,直接将request作为参数进行处理就行,所以初始打算将值取出处理后再set到request中,但是实际操作发现request只有getParameter()方法没有set方法,有setAttribute()方法,set后取值错误。
request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据。
request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。
getAttribute是返回对象,getParameter返回字符串 总的来说:request.getAttribute()方法返回request范围内存在的对象,而request.getParameter()方法是获取http提交过来的数据。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />问题虽得到解决,但不是在代码中进行修改,而是修改的部署容器,若如此则每次在项目进行部署时都需要检查Tomcat编码,不知道是否还有其他解决方案???