使用Filter过滤器+重写Request完美解决乱码问题
一:原理
- 1.对于Post方式提交的数据,我们可以通过直接设置request和response的编码方式来解决乱码问题;但是Get方式提交的数据,那么就需要编码再解码的方式解决乱码问题。
- 2.我们一般对于GET请求获取参数有两个常用方法:
request.getParameter(String name)是获得相应名的数据,如果有重复的名,则返回第一个的值 . 接收一般变量 ,如text类型。
request.getParameterValues(String name)是获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkobx类型 。- 3.所以我们的思路就是重写上述这两个方法,达到解决GET取参乱码问题。
二:代码
package cn.zyzpp.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* 指定过滤器的名称以及过滤的内容
* 单个页面可用urlPatterns="/advice"
* 多个页面可用urlPatterns={"/advice","/advice"}
* @author www.zyzpp.cn
*
*/
@WebFilter(filterName="filter", urlPatterns="/*")
public class FilterImpl implements javax.servlet.Filter {
private String encoding="UTF-8";
public FilterImpl() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//1 解决中文乱码问题:1)只能解决POST乱码2)响应乱码
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
//2 创建自定义的Request对象 :解决get乱码
MyRequest myRequest = new MyRequest((HttpServletRequest) request);
//3 放行
chain.doFilter(myRequest, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
- 继承HttpServletRequestWrapper类 , 重写getParameter()和 getParameterValues()方法
package cn.zyzpp.filter;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 继承HttpServletRequestWrapper
* 重写getParameter()和 getParameterValues()方法
* @author www.zyzpp.cn
*/
public class MyRequest extends HttpServletRequestWrapper {
public MyRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (super.getMethod().equalsIgnoreCase("GET")&&value!=null) {
try {
value = new String(value.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return value;
}
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (super.getMethod().equalsIgnoreCase("GET")&&values!=null) {
try {
int i=0;
for (String value : values) {
values[i++] = new String(value.getBytes("ISO-8859-1"), "utf-8");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return values;
}
}
本篇博客借鉴于:
http:// blog.csdn.net/melissa_heixiu/article/details/52705457
http:// blog.csdn.net/csdn_gia/article/details/54094426
可以看到,第一篇博客的思想是利用的req.getParameterMap()来获取到单个或多个参数;第二篇博客较简单,重写了request.getParameter()。
笔者比着葫芦画瓢,增加了request.getParameterValues()方法,并解决了参数为空导致的自定义Request类空指针异常。
使用Filter过滤器+重写Request完美解决乱码问题的更多相关文章
- 【shell mysql 导出数据到csv脚本,完美解决乱码转义符等问题】-费元星
#!/bin/bash#@author:feiyuanxing [既然笨到家,就要努力到家]#@date:2017-12-05#@E-Mail:feiyuanxing@gmail.com#@TARGE ...
- 通过过滤器和增强request对象解决get提交请求服务器端乱码。
1.表单用get方式提交 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 通过重写request.getParameter方法来解决中文乱码问题。
在原生servlet的商城项目中,BeanUtils.populate方法封装不上注册的参数. 已知BeanUtils.populate方法是封装不上date对象的,于是自定义了一个转换器用来封装Da ...
- java web过滤器实际应用(解决中文乱码 html标签转义功能 敏感字符过滤功能)
转载地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可 ...
- 如何配置Filter过滤器处理JSP中文乱码
参考Tomcat服务器目录webapps的examples示例 简单配置步骤:1.在项目web.xml文件添加过滤器标记<filter>和<filter-mapping>:2. ...
- 单点登录(十六)-----遇到问题-----cas4.2.x登录成功后报错No principal was found---cas中文乱码问题完美解决
情况 我们之前已经完成了cas4.2.x登录使用mongodb验证方式并且自定义了加密. 单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密 但是悲剧的是 ...
- 遇到问题-----cas4.2.x登录成功后报错No principal was found---cas中文乱码问题完美解决
情况 我们之前已经完成了cas4.2.x登录使用MongoDB验证方式并且自定义了加密. 单点登录(十五)-----实战-----cas4.2.x登录mongodb验证方式实现自定义加密 但是悲剧的是 ...
- 完美解决Informix的中文乱码问题
完美解决Informix的中文乱码问题 Informix是IBM旗下的一款数据库,要不是这个项目需要,估计这辈子我都不知道居然还有这么一款数据库.想来公司的项目遍布全国各地,各种部署环境各种应用场景 ...
- AJAX中文乱码PHP完美解决(IE和Firefox兼容)
最近在做一个项目,遇到AJAX中文乱码问题,经过一个下午的努力终于完美解决,现将心得写下来,希望对那些还困绕在这个问题而头痛不已的人们有所帮助. 众所周知,使用AJAX传送和接收中文参数时,如果不在客 ...
随机推荐
- java面试整理(会持续更新..)
本人出道至今,经历了大大小小百余场战斗,,,下面整理的面试题有些有答案,有些没答案,那个谁说过:"要抱着怀疑的态度去编程,所以,即便有答案,也不一定正确,即便我本地正确,但是由于屏幕前的你和 ...
- UE3多参数函数实现
基础宏定义 #define VARARG_EXTRA(A) A, #define VARARG_NONE #define VARARG_PURE =0 static inline DWORD Chec ...
- Table 'performance_schema.session_variables' doesn't exist错误的一
mysql驱动 jar 换到现在最新的mysql-connector-java-5.1.39-bin.jar
- [20190305]删除审计登录信息不适合使用logrotate.txt
[20190305]删除审计登录信息不适合使用logrotate.txt --//生产系统数据库sys用户登录会在/u01/app/oracle/admin/${ORACLE_SID}/adump/目 ...
- [20181109]12c sqlplus rowprefetch参数5
[20181109]12c sqlplus rowprefetch参数5.txt --//这几天一直在探究设置sqlplus参数rowprefetch与arraysize的关系,有必要做一些总结以及一 ...
- EOS与以太坊有哪些区别?
以太坊是一个专门为开发和运行去中心化应用(DAPP)搭建的智能合约平台:EOS与以太坊类似,同样是基于智能合约和区块链而搭建.但是,从技术和设计理念等方面来看,这两者之间实际上存在明显的区别. 那么E ...
- 解决PowerDesigner不同表输入相同字段名被禁止问题
选择"Tools -> Model Options"后,弹出如下图所示窗口: 这两个选项取消勾选
- Bcompare工具永久使用方法
bcompare的简介 我们在工作中会经常用到bcompare工具:合入驱动,对比原始文件等. bcompare,即Beyond Compare 是一个综合的比对工具. 可比对的对象包括纯文字档. ...
- 阿里云ECS配置踩坑之路
1.利用shadowsocks配置SVN(用于软件部署环境) 2.安全组设置 3.FTP搭建 https://www.cnblogs.com/hexige/p/7809481.html
- 下载时出现using cached如何解决
pip3 --no-cache-dir install xlsxwriter 这样就可以了