`

spring mvc 乱码问题

阅读更多

tomacat对GET和POST请求处理方式是不同的

POST: 加过滤器, 即可解决

GET: 加过滤器, 还需要改tomcat的server.xml配置文件(特别注意: eclipse下的 Servers下的server.xml也要改

 

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

 改为:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"  useBodyEncodingForURI="true"/>

 

 

过滤器的几种加法: 

 

方法一: 自定义过滤器,  

	<!-- 自定义编码过滤器 -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>com.lw.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>characterEncoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>enabled</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 实现方法:

package com.lw.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter {

    private String characterEncoding; //编码方式配置在web.xml文件中
    private boolean enabled;   //是否启用此Filter,配置在web.xml中

    @Override
    public void destroy() {
        characterEncoding = null;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        if (enabled || characterEncoding != null) {
            request.setCharacterEncoding(characterEncoding);
            response.setCharacterEncoding(characterEncoding);
        }
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        characterEncoding = config.getInitParameter("characterEncoding");
        enabled = "true".equalsIgnoreCase(config.getInitParameter("enabled").trim());
    }
}

 

方法二: spring mvc 自带过滤器

	<!-- spring mvc 自带编码过滤器  -->
	<filter>  
	    <filter-name>CharacterEncodingFilter</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>  
	</filter>  
	<filter-mapping>  
	    <filter-name>CharacterEncodingFilter</filter-name>  
	    <url-pattern>/*</url-pattern>  
	</filter-mapping>

 

方法三: 集成到spring mvc 核心过滤器,   实现org.springframework.web.servlet.DispatcherServlet

    <!-- 集成过滤到核心拦截器中。  自定义过滤, EncodingDispatcherServlet实现核心拦截器DispatcherServlet, -->
	<servlet>  
	 <servlet-name>springMVC</servlet-name>  
	 <servlet-class>com.lw.filter.EncodingDispatcherServlet</servlet-class>  
	 <load-on-startup>1</load-on-startup>
		 <init-param>  
		  <param-name>encoding</param-name>  
		  <param-value>UTF-8</param-value>  
		 </init-param>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </init-param>
	</servlet>

 实现方法:

package com.lw.filter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.DispatcherServlet;

public class EncodingDispatcherServlet extends DispatcherServlet {

	private String encoding;

	public void init(ServletConfig config) throws ServletException {
		encoding = config.getInitParameter("encoding");
		super.init(config);
	}

	protected void doService(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		request.setCharacterEncoding(encoding);
		response.setCharacterEncoding(encoding);
		super.doService(request, response);
	}

}

 

附:

很多人说get请求乱码处理办法如下, 但本人测试好像不太奏效

 

<Connector port="8080" maxHttpHeaderSize="8192"    
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"    
               enableLookups="false" redirectPort="8443" acceptCount="100"    
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" /> 

 

 

0
3
分享到:
评论
1 楼 Gozs_cs_dn 2015-04-30  
较简单的方式就是 修改server.xml > URIEncoding="UTF-8"
否则 springMVC 中配置的 CharacterEncodingFilter 对于GET请求无效

相关推荐

Global site tag (gtag.js) - Google Analytics