在学习javaweb过程中由于软件设计者都是外国人,他们所支持的编码都是ISO8859-1对于我们中国人来讲必须是中文,所以我们一般使用的编码就是utf-8或者GBK,然而开发工具都是用ISO8859-1编码,我们用utf-8解码的话就会产生乱码。

解决响应乱码一般都很好解决只需要加下面的一段代码就可以:

response.setContentType("text/html;charset=utf-8");

然而对于请求乱码的解决根据请求方式的不同解决乱码的方式也不同,通常我们常用的是POST和GET这两种方式。对于POST方式使用下面的代码就可以解决:

request.setCharacterEncoding("utf-8");
但是对于get方式的请求方式上面的代码就不能解决了,get的解决方案是将iso8859-1的编码通过反编码,再通过utf-8解码就可以解决:

str=new String(str.getByte("iso8859-1"),"utf-8");
所以在servlet的doGet方法中就可以解决乱码问题(POST提交方式):
<span style="white-space:pre">  </span>public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");}

但是在这里就存在一个问题,每创建servlet都需要加上这样一段代码,还需要知道是POST提交还是GET提交,这样就显得很繁琐,需要解决这个问题就要用到web开发中另一个重要的知识点-过滤器。

Filter是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
开发一个Filter分两个步骤:
一、写一个类实现特定的接口Filter;
二、在web.xml文件中注册这个Filter。

<span style="white-space:pre">    </span><filter><description>全局编码过滤器</description><filter-name>EncodingFilter</filter-name><filter-class>com.ruijie.filter.EncodingFilter</filter-class><init-param><param-name>encode</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

在实现的类中处理乱码,当所有的资源访问时都会通过这个过滤器过滤,从而达到解决乱码的目的。

<span style="white-space:pre">   </span>public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {response.setContentType("text/html;charset="+encode); //解决响应乱码chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);}

上文也说了在解决乱码过程中get方式提交的方式是需要主要解决的,在获取参数过程中通常是通过以下三个方法获取:

<span style="white-space:pre">  </span>getParameterMap()getParameterValues(String name)getParameter(String name)

所以问题就转移到解决这三个方法的乱码问题就可以解决get方式的乱码问题。解决方案是将ServletRequest进行改造成MyHttpServletRequest,可以通过两种方式进行改造一种是装饰模式,一种是动态代理;由于为我们提供了HttpServletRequestWrapper,所以在这里我们使用装饰者模式更加方便

<span style="white-space:pre">  </span>class MyHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest request = null;private boolean isNotEncode = true;public MyHttpServletRequest(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic Map getParameterMap() {try{if(request.getMethod().equalsIgnoreCase("POST")){//--如果是post提交request.setCharacterEncoding(encode);return request.getParameterMap();}else if(request.getMethod().equalsIgnoreCase("GET")){//--如果是get提交Map<String,String[]> map = request.getParameterMap();if(isNotEncode){//只能在第一次解决乱码for(Map.Entry<String, String[]> entry : map.entrySet()){String [] vs = entry.getValue();for(int i=0;i<vs.length;i++){vs[i] = new String(vs[i].getBytes("iso8859-1"),encode);}}isNotEncode = false;//设置为false,第二次就不会再进这个代码块了}return map;}else{return request.getParameterMap();}}catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}@Overridepublic String[] getParameterValues(String name) {return (String[]) getParameterMap().get(name);}@Overridepublic String getParameter(String name) {return getParameterValues(name) == null ? null : getParameterValues(name)[0];}}

点击下载源码

javaweb 解决请求相应的乱码问题相关推荐

  1. 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)

    前述: 在写这篇笔记之前,对笔记中的设计模式进行介绍: 本篇笔记中将要使用到的设计模式是:装饰(包装)设计模式 (1)装饰(包装)设计模式口诀: ①定义一个类,实现被装饰对象的接口 ②定义一个成员变量 ...

  2. ​ SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器

    文章目录 ​ SpringMVC的参数绑定支持的数据类型 基本数据类型和字符串类型 JavaBean 包装类 Map类型 List类型 POST请求参数中文乱码的解决方法 自定义类型转换器(Date类 ...

  3. JavaWeb解决中文下载出现乱码问题

    用这个方法靠谱 response.setHeader("Content-Disposition", "attachment; filename=" + java ...

  4. GET方式请求参数中文乱码问题 [JavaWeb][Servlet]

    请求参数中文乱码问题(GET) 同样的我们要解决GET方式下的请求参数中文乱码问题,那么我们首先要知道GET请求方式之下为什么中文数据就会出现乱码? 因为我们GET方式之下的请求参数是在请求行中,是紧 ...

  5. 解决获取请求参数的乱码问题

    解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册 <!--配置springMVC的编码过滤 ...

  6. 解决: VUE 项目中表单提交中文乱码、接口请求参数中文乱码

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 表单提交出现乱码: 接口请求乱码同于上图. 2. 解决: 在出现乱码的内容外面加函数:deco ...

  7. 使用SpringMVC参数传递时,解决get请求时中文乱码的问题

    问题描述: 使用SpringMVC参数传递时, 遇到get请求中文信息时,页面应答会显示中文乱码. 解决办法: 一, 我们需要把request.getParameter("参数名" ...

  8. 解决GET请求时中文乱码的问题

    之前项目中的web.xml中的编码设置: <filter><filter-name>CharacterEncoding</filter-name><filte ...

  9. SpringMVC学习系列-解决GET请求时中文乱码的问题

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" ...

最新文章

  1. 什么是7层负载均衡?
  2. 作者:林春雨,男,现任北京拓尔思信息技术股份有限公司高级副总裁、助理研究员。...
  3. hive之分区表详解
  4. 使用PackageManager获得应用(包)信息
  5. 文字描边加粗_这些PPT描边字,效果好到没朋友~
  6. NVMe驱动详解系列_第一部:NVMe驱动初始化与注销
  7. 中国银行C语言笔试题,中国银行软件中心2016校园招聘笔试题经验
  8. 课程作业练习 K均值聚类 python实现(最小误差平方和准则)
  9. CH6202 黑暗城堡 最短路径生成树
  10. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (有上下界可行流)
  11. 我打算去广东第一“鬼城”,买房安家
  12. 电脑使用DP线连接显示器,插在显示器音频口的音响没有声音解决办法
  13. Logic Pro 使用教程之实时循环乐段(非常详细)
  14. 自定义view----六边形战斗力图表
  15. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU量产神器RT-Flash用户指南
  16. python文件夹操作_Python文件夹与文件的操作 ZZ
  17. 海尔旗下有屋智能IPO被终止:年应收账款10亿 受恒大拖累
  18. 机器视觉中的视觉引导定位系统
  19. 基于JAVA校园教务排课系统(Springboot框架) 开题报告
  20. php求1-100内的质数/素数

热门文章

  1. matlab cameraman,cameraman.tif 原图
  2. 单应性矩阵和仿射变换_单应矩阵 基本矩阵 本质矩阵的区别与联系
  3. cocos cr躲避类游戏的暂停、继续、重新开始_社团班级团建游戏活动安排
  4. Java 中==和 equals 的区别, equals 和 hashCode 的区别
  5. 第1节 yarn:15、关于yarn中常用的参数设置
  6. JS排序算法之插入排序
  7. python之知乎的正确打开方式
  8. 团体程序设计天梯赛-练习集L1-007. 念数字
  9. Google Chrome v48.0.2564.
  10. byte 8位有符号 与 char 16位无符号