package util;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MyHttpServletRequest extends HttpServletRequestWrapper {

protected Log log = LogFactory.getLog(getClass());
private static final String ENCODED = "UTF-8",DECODE="ISO8859-1";

public MyHttpServletRequest(HttpServletRequest request) {
super(request);
}

@Override
public String getQueryString() {
String queryString = super.getQueryString();
if(queryString != null){
try {
return new String(queryString.getBytes(DECODE),ENCODED);
} catch (UnsupportedEncodingException e) {
log.info(e.getMessage(),e);
}
}
return queryString;
}

@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (value != null) {
try {
return new String(value.getBytes(DECODE), ENCODED);
} catch (UnsupportedEncodingException e) {
log.info(e.getMessage(),e);
}
}
return value;
}

@SuppressWarnings("unchecked")
@Override
public Map getParameterMap() {
Map<String, String[]> values = super.getParameterMap();
Map<String, String[]> valuesMap = new HashMap<String, String[]>();
Set<String> names = values.keySet();
for (Iterator<String> iter = names.iterator(); iter.hasNext();) {
String name= iter.next();
String[] v = values.get(name);
if(v != null) {
String[] valuesCopy = new String[v.length];
for(int i = 0; i < v.length; i++) {
try {
valuesCopy[i] = new String(v[i].getBytes(DECODE), ENCODED);
} catch (UnsupportedEncodingException e) {
log.info(e.getMessage(),e);
}
}
valuesMap.put(name, valuesCopy);// 向新Map放入转码过的值
}
}
return valuesMap;// 返回是副本
}

@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if(values != null) {
String[] valuesCopy = new String[values.length];//原数组是只读的,不能修改
for(int i = 0; i < values.length; i++) {
try {
valuesCopy[i] = new String(values[i].getBytes(DECODE), ENCODED);
} catch (UnsupportedEncodingException e) {
log.info(e.getMessage(),e);
}
}
return valuesCopy;
}
return values;
}
}

后台调用

request = new MyHttpServletRequest(request);

来自:http://bbs.csdn.net/topics/320081498  回答的二楼作者

A标签中传递的中文参数到Servlet 后台request.getParameter()接收时出现中文乱码的更多相关文章

  1. SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析

    SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析 一:问题demo展示 ...

  2. css pre如果同时运用了css的border-radius、 overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡

    pre如果同时运用了css的border-radius. overflow两个属性且标签中内容太多时,外部div滚动条在firefox下滚动时很卡. 解决方法:去掉css中border-radius. ...

  3. MyBatis 中传递多个参数的 4 种方式

    方式 1 :封装成对象入参  #{对应实体类的属性} //UserMapper.java 接口 /** * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参) * @para ...

  4. Mybatis中传递多个参数的方法总结

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...

  5. Mybatis接口中传递多个参数

    1.接口 public interface MemberMapper { public boolean insertMember(Members member); public Members sel ...

  6. 分享url带中文参数,打开html操作完毕跳转jsp页面中文乱码解决

    1.在app端分享参数组合时不对传递的url进行任何编码. 2.打开html页面时使用 escape函数对有中文的参数进行编码 escape(GetQueryString("paramete ...

  7. 过滤器中处理multipart/form-data头部的post请求request.getParameter(")获取不到参数问题

    如果不是文件类型请求,我们使用request.getParameter("");方法是可以获取到参数内容的,如果是文件类型的请求即请求的头部信息为“multipart/form-d ...

  8. request.getParameter()及解决数据库中文乱码问题——实习第七天

    今天老师让我们自己做一个小项目,我开始着手于实现这个小项目.途中遇到过几个小问题,在此做个小记录, 相信后期还是会借鉴的. 1,从前台传入数据给后台传入数据,并没有传入成功: 输出的为Null. 当然 ...

  9. 通过重写request.getParameter方法来解决中文乱码问题。

    在原生servlet的商城项目中,BeanUtils.populate方法封装不上注册的参数. 已知BeanUtils.populate方法是封装不上date对象的,于是自定义了一个转换器用来封装Da ...

随机推荐

  1. python传参数

    Python参数传递采用的肯定是“传对象引用”的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对 ...

  2. 关于gevent的一些理解(一)

    前言:gevent是python的一个并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效.而且其中有个monkey类, 将现有基于Python线程直接转化 ...

  3. C++ 11 中的 Lambda 表达式的使用

    Lambda在C#中使用得非常频繁,并且可以使代码变得简洁,优雅. 在C++11 中也加入了 Lambda. 它是这个样子的 [] () {}...  是的三种括号开会的节奏~ [] 的作用是表示La ...

  4. bat 批量更改文件名的批处理文件

    bat 批量更改文件名的批处理文件 最近下了不少动画,不过文件名都太长,一般都是 [字幕组][名称][集数][语言][分辨率][编码].后缀 这样的格式 我喜欢简单的名字,比如 01.rmvb 之类, ...

  5. delphi 颜色转换函数总结

    unit UColor; interface uses windows, sysutils, classes, graphics; function HexToInt(Hexa: String): L ...

  6. afinal框架下 ViewInject的使用

    1.可以在BaseActivity界面onCreate 方法setContentView后加上该语句. initInjectedView(this); 2.@ViewInject(id=R.id.v_ ...

  7. ElementTree 解析xml(minidom解析xml大文件时,MemoryError)

    在使用minido解析xml文件时,因为文件过大,结果报错MemoryError.查询后得知是因为minidom在解析时是将所有文件放到内存里的,很占用内存,所以要考虑换一种方法来处理xml文件.   ...

  8. Ajax的get方式传值 避免& 与= 号

    js代码 例如: var name = $("#name”).value;//为a&b=7 name=encodeURLComponent(name); 可以将a&b=7转化 ...

  9. Java的Reflection机制

    什么时候使用Reflection: 在java语言中,创建一个类的对象通常使用new operator,但是如果预先不知道Class的名字,类名是在程序运行过程中通过参数传递过来,就没法使用这种方法了 ...

  10. 121. Best Time to Buy and Sell Stock买卖股票12

    一 [抄题]: If you were only permitted to complete at most one transaction (ie, buy one and sell one sha ...