月嫂公司网站建设构思,一键优化win10,雄安优秀网站建设,jsp网站开发遇到问题8. 乱码问题
网络编程中乱码绝大部分都与编码格式有关#xff0c;常常在涉及到中文的文件编译或者数据传输中出现。
Spring MVC 使用 post 方式传输带中文数据时便会出现乱码#xff0c;get 方式则不会#xff0c;解决方式如下#xff1a;
(1) 自定义过滤器
过滤器
pu…8. 乱码问题
网络编程中乱码绝大部分都与编码格式有关常常在涉及到中文的文件编译或者数据传输中出现。
Spring MVC 使用 post 方式传输带中文数据时便会出现乱码get 方式则不会解决方式如下
(1) 自定义过滤器
过滤器
public class EncodingFilter implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding(utf-8);response.setCharacterEncoding(utf-8);chain.doFilter(request, response);}public void destroy() {}
}!--web.xml--
filterfilter-nameencoding/filter-namefilter-classcom.why.filter.EncodingFilter/filter-class
/filter
filter-mappingfilter-nameencoding/filter-nameurl-pattern/*/url-pattern
/filter-mapping注意url-pattern 设置为 /* 否则过滤器匹配不到 jsp 页面
(2) 配置 Spring MVC 的字符编码过滤器
!--web.xml--
!--Spring MVC 字符编码过滤器--
filterfilter-nameencoding/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueutf-8/param-value/init-param
/filterfilter-mappingfilter-nameencoding/filter-nameurl-pattern/*/url-pattern
/filter-mapping(3) 修改 Tomcat 配置文件文件
Connector executortomcatThreadPoolport8080 protocolHTTP/1.1connectionTimeout20000redirectPort8443 URIEncodingUTF-8/(4) 网络大神的过滤器
package com.why.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/*** 解决get和post请求 全部乱码的过滤器*/
public class GenericEncodingFilter implements Filter {Overridepublic void destroy() {}Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//处理response的字符编码HttpServletResponse myResponse(HttpServletResponse) response;myResponse.setContentType(text/html;charsetUTF-8);// 转型为与协议相关对象HttpServletRequest httpServletRequest (HttpServletRequest) request;// 对request包装增强HttpServletRequest myrequest new MyRequest(httpServletRequest);chain.doFilter(myrequest, response);}Overridepublic void init(FilterConfig filterConfig) throws ServletException {}
}
//自定义request对象HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {private HttpServletRequest request;//是否编码的标记private boolean hasEncode;//定义一个可以传入HttpServletRequest对象的构造函数以便对其进行装饰public MyRequest(HttpServletRequest request) {super(request);// super必须写this.request request;}// 对需要增强方法 进行覆盖Overridepublic Map getParameterMap() {// 先获得请求方式String method request.getMethod();if (method.equalsIgnoreCase(post)) {// post请求try {// 处理post乱码request.setCharacterEncoding(utf-8);return request.getParameterMap();} catch (UnsupportedEncodingException e) {e.printStackTrace();}} else if (method.equalsIgnoreCase(get)) {// get请求MapString, String[] parameterMap request.getParameterMap();if (!hasEncode) { // 确保get手动编码逻辑只运行一次for (String parameterName : parameterMap.keySet()) {String[] values parameterMap.get(parameterName);if (values ! null) {for (int i 0; i values.length; i) {try {// 处理get乱码values[i] new String(values[i].getBytes(ISO-8859-1), utf-8);} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}}hasEncode true;}return parameterMap;}return super.getParameterMap();}//取一个值Overridepublic String getParameter(String name) {MapString, String[] parameterMap getParameterMap();String[] values parameterMap.get(name);if (values null) {return null;}return values[0]; // 取回参数的第一个值}//取所有值Overridepublic String[] getParameterValues(String name) {MapString, String[] parameterMap getParameterMap();String[] values parameterMap.get(name);return values;}
}