package xxx;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; public class SetCharacterEncodingFilter implements Filter{
String encoding = null;
FilterConfig filterConfig = null; /** 初始化方法 */
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
} /** 过滤处理方法 */
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (encoding!=null){
//对请求进行编码设置
request.setCharacterEncoding(encoding);
HttpServletRequest httprequest=(HttpServletRequest) request;
if(httprequest.getMethod().equalsIgnoreCase("get")){
MyRequest myRequest = new MyRequest(httprequest);
myRequest.setEncoding(encoding); chain.doFilter(myRequest, response);
}else{
//将处理权转交给下一个处理器
chain.doFilter(request,response);
}
}else{
//将处理权转交给下一个处理器
chain.doFilter(request,response);
}
} /**
* Wrapper包装类,装饰设计模式,内部有个真实对象的引用
*/
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
private String encoding; public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
} public void setEncoding(String encoding) {
this.encoding = encoding;
} @Override
//重写父类的方法
public String getParameter(String name) {
String[] p = getParameterMap().get(name);
if(p!=null&&p.length>0){
return p[0];
}else{
return null;
}
} @Override
//获取参数的方法
public Map<String, String[]> getParameterMap() {
//获取客户端传过来的参数数据,并且包装成一个Map集合
Map<String, String[]> resMap = new HashMap<String, String[]>();
Map map = request.getParameterMap();
Set set = map.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
String key=(String) it.next();
Object value= map.get(key);
if(value instanceof String[]){
String[] values=(String[]) value;
for(int i=0;i<values.length;i++){
try {
values[i] = java.net.URLDecoder.decode(values[i], encoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} //翻页参数中的中文解码,编码在dbpage.java中进行的
} resMap.put(key, values);
}
}
return resMap;
}
} /** 销毁方法 */
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}}

解决tomcat7中request会对中文重新编码,导致后台接收到为encode编码后参数问题的更多相关文章

  1. Web jsp开发学习——终极解决jsp中request和response中文乱码的问题(加个过滤器)

    中文乱码真的很烦人的.而且每次都要写,可麻烦了,而且有时候写了还不一定管用,所以我们可以试试过滤器 1.每个jsp头上当然要写上utf8啦 <%@ page language="jav ...

  2. 解决Docker中运行的MySQL中文乱码

    docker exec -it mysql bash 如果没有安装vim,请参考 解决Docker容器中不能用vim编辑文件 vim /etc/mysql/mysql.conf.d/mysql.cnf ...

  3. 解决mac 中的myeclipse控制台中文乱码问题

    http://www.myexception.cn/eclipse/1742588.html 解决 http://my.oschina.net/u/555006/blog/195013

  4. 解决ubantu中sublime不支持中文的方法

    更新然后将系统升级到最新版本,在linux终端输入 sudo apt-get update && sudo apt-get 在本地目录中克隆此repo:    如果你没有git的话就安 ...

  5. 解决PHP中json_encode()不支持中文的替代函数

    json_encode()是PHP中将数组转换成JSON格式的函数,因为各种原因只要是中文就会乱码= = 找到了这么一个函数替代了原有的json_encode(),能很好地输出中文~ function ...

  6. 解决ArcGIS中因SDE或数据库配置问题而导致服务宕掉的一种思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 最近连续有两个项目现场出现了AGS服务荡掉的问题,一个是通州 ...

  7. 解决Hibernate中不同包内有形同实体导致映射失败的问题

    报错代码如下: Caused by: org.hibernate.DuplicateMappingException: duplicate import: Engin refers to both t ...

  8. request、response 中文乱码问题与解决方式

    request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码:   response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码: ...

  9. java中可以出现的中文乱码的集中解决

    从学习javaweb开始就会经常遇到中文乱码,今天就做以下记录: 1. 要避免项目中遇到乱码,首先就是在搭建项目的设置工作空间的字符编码,若是多人开发,就更应该做到统一,在eclipse中选择widn ...

随机推荐

  1. 在jsp中显示List中的数据

    <% ArrayList list = (ArrayList)request.getAttribute("class"); for(int i = 0; i < lis ...

  2. XCTF(MISC) give_you_flag

    题目描述:菜狗找到了文件中的彩蛋很开心,给菜猫发了个表情包 1.下载附件,点击查看 发现在数完钱后,有出现一个二维码的东西. 2.使用stegsolv工具,进行逐帧查看. 说个题外话,stegsolv ...

  3. Android 开发学习进程0.32 dwonloadmanager使用

    downloadmanager时Android系统下载器,使用系统下载器可以避免用stream流读入内存可能导致的内存溢出问题.以下为downloadmanager初始化部分.apkurl为下载网络路 ...

  4. Asp.net mvc使用SignaIR

    一.Asp.net SignalR 是个什么东东 Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long polling) ...

  5. Java | 集合(Collection)和迭代器(Iterator)

    集合(Collection) 集合就是Java中提供的一种 空器,可以用来存储多个数据. 集合和数组都是一个容器,它们有什么区别呢? 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同一类型的 ...

  6. Js中关于构造函数,原型,原型链深入理解

    在 ES6之前,在Javascript不存在类(Class)的概念,javascript中不是基于类的,而是通过构造函数(constructor)和原型链(prototype chains)实现的.但 ...

  7. lucene 入门简介

    Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.Lucene 目前是 Apache Jakarta 家族中的一个开源项目. ...

  8. 【LeetCode】144. 二叉树的前序遍历

    144. 二叉树的前序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给你二叉树的根节点 root ,返回它节点值的 前序 遍历. 示例 输入:root = [1,null,2,3] 输出:[ ...

  9. ThinkPHP3.2.3使用PHPExcel类操作excel导出excel

    如何导入excel请看:ThinkPHP3.2.3使用PHPExcel类操作excel导入读取excel // 引入PHPExcel类 import("Org.Util.PHPExccel& ...

  10. 虚拟机安装RHEL8.0.0

    在VMware Workstations 15.0.0中安装RHEL8.0.0 使用到的软件和主机基本配置 此处宿主机基本硬件配置:i3-7100U 4核,内存:12G 虚拟化软件:VMware Wo ...