最近在重温JavaWeb基础内容,碰到了之前也时常遇到的中文乱码问题,想着反正是经常要处理的,不如当即就把它整理出来放在博客里,省得遇到时再去到处搜。

  1. Post请求乱码的解决方案:

   手工创建一个过滤器实现javax.servlet.Filter接口:

public class CharacterEncodingFilter implements Filter {

    @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//解决以Post方式提交的中文乱码问题
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8"); chain.doFilter(request, response);
} @Override
public void destroy() { } }

  在web.xml中配置该过滤器:

  <filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>cn.lby.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

  当然,实际开发中一般不会去自己做这个Filter,都是利用框架里封装好的,传参也能通过配置来完成,十分方便,比如spring通常我们会在web.xml中写入下面的代码:

    <filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

2. Get请求乱码的解决方案:

  在字符过滤器中使用动态代理解决中文乱码:

public class CharacterEncodingFilter implements Filter {

	@Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//解决以Post方式提交的中文乱码问题
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8"); ServletRequest requestProxy = getHttpServletRequestProxy((HttpServletRequest)request);
chain.doFilter(requestProxy, response);
} @Override
public void destroy() { } /**
* @Method: getHttpServletRequestProxy
* @Description: 获取HttpServletRequest对象的代理对象
* @param request
* @return HttpServletRequest对象的代理对象
*/
private ServletRequest getHttpServletRequestProxy(final HttpServletRequest request){
ServletRequest proxy = (ServletRequest) Proxy.newProxyInstance(
CharacterEncodingFilter.class.getClassLoader(),
request.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//如果请求方式是get并且调用的是getParameter方法
if (request.getMethod().equalsIgnoreCase("get") && method.getName().equals("getParameter")) {
//调用getParameter方法获取参数的值
String value = (String) method.invoke(request, args);
if(value==null){
return null;
}
//解决以get方式提交的中文乱码问题
return new String(value.getBytes("iso8859-1"),"UTF-8");
}else {
//直接调用相应的方法进行处理
return method.invoke(request, args);
}
}
});
//返回HttpServletRequest对象的代理对象
return proxy;
} }

  如果觉得上面的方式太繁琐,也可以通过修改 tomcat 的 server.xml 配置文件:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

  改成:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>

  注: 如果是ajax发起的get请求中文依然会乱码,这时候需要把 useBodyEncodingForURI="true" 改为 URIEncoding="UTF-8" 。

  下面是测试两种乱码问题解决方案的 demo ,如果懒得写可以参考一下:

  首先是jsp页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>使用字符过滤器解决解决get、post请求方式下的中文乱码问题</title>
body {
text-align: center;
padding: 60px 150px;
margin-right: 150px;
line-height: 2.0em;
}
</head> <body> <%--使用get的方式访问 --%>
<a onclick="myClick()" href="javascript:void(0)">超链接(get方式请求)</a> <hr/> <form action="EncodingServlet" method="post">
用户名:<input type="text" name="username" value="彬爷" />
<input type="submit" value="post方式提交">
</form> <script type="text/javascript">
function myClick() {
window.location.href = "EncodingServlet?username=彬爷";
}
</script> </body> </html>

  后台服务:

public class EncodingServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public EncodingServlet() {
super();
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String method = request.getMethod();
PrintWriter out = response.getWriter();
System.out.println("请求方式为:" + method);
out.write("请求方式为:" + method);
out.write("<br/>");
System.out.println("请求参数为:" + username);
out.write("请求参数为:" + username);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} }

  web.xml 中的 Servlet 配置我这里就不发了。

JavaWeb——Get、Post请求中文乱码问题的更多相关文章

  1. 尚硅谷面试第一季-09SpringMVC中如何解决POST请求中文乱码问题GET的又如何处理呢

    目录结构: 关键代码: web.xml <filter> <filter-name>CharacterEncodingFilter</filter-name> &l ...

  2. Spring-解决请求中文乱码问题

    解决spring请求中文乱码问题 1.web.xml添加编码拦截器 <filter> <filter-name>CharacterEncoding</filter-nam ...

  3. 使用httpclient post请求中文乱码解决办法

    使用httpclient post请求中文乱码解决办法   在使用httpclient发送post请求的时候,接收端中文乱码问题解决. 正文: 我们都知道,一般情况下使用post请求是不会出现中文乱码 ...

  4. get请求与post请求中文乱码问题的解决办法

    首先出现中文乱码的原因是tomcat默认的编码方式是"ISO-8859-1",这种编码方式以单个字节作为一个字符,而汉字是以两个字节表示一个字符的. 一,get请求参数中文乱码的解 ...

  5. 解决Post请求中文乱码问题

    解决Post请求中文乱码问题 req.setChracterEncoding()要在获取请求参数前调用才有效,不然还是乱码

  6. get请求中文乱码及get,post编码探究

    在我使用get请求进行查询的时候遇到一个问题: 当我的请求参数中有中文时,出现乱码. 可是即使我设置了Spring的characterEncodingFilter,也还是出现乱码. 原因:tomcat ...

  7. android客户端向服务器发送请求中文乱码的问

    android客户端向服务器发送请求的时候,并将参数保存到数据库时遇到了中文乱码的问题: 解决方法: url = "http://xxxx.com/Orders/saveorder.html ...

  8. 5 Http请求中文乱码处理

    java 乱码分很多种,这里主要研究解决http请求中出现乱码的情况. http请求出现中文乱码的主要原因:发送方与接收方编码不一致,服务器默认支持的编码与web应用不一致,如:tomcat 是国外程 ...

  9. SpringMVC如何解决POST请求中文乱码问题,GET的又如何处理呢?

    在web.xml中 <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-c ...

随机推荐

  1. \lib\cmsis\stm32f10x.h(298): error: #67: expected a "}"

    首先介绍一下csdn屏蔽广告 这个至关重要,请参考 https://blog.csdn.net/qq_40881680/article/details/82226562 更新KEIL5以后,原KEIL ...

  2. 7.Redis的发布订阅

    Redis消息的订阅/发布 a)是什么 进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. b)命令 SUBSCRIBE订阅 PUBLISH发布 c)案例 先订阅后发布后才 ...

  3. CSS 样式表{二}

    1 选择器的优先级 选择器的优先主要考虑选择器的权重 可以将各种选择器的权重以数值来表示,数值越大,优先级越高 选择器 权重值 标签selector 1 类选择器 10 ID选择器 100 行内样式 ...

  4. CodeForces 822C Hacker, pack your bags!

    题意 给出一些闭区间(始末+代价),选取两段不重合区间使长度之和恰为x且代价最低 思路 相同持续时间的放在一个vector中,内部再对起始时间排序,从后向前扫获取对应起始时间的最优代价,存在minn中 ...

  5. 【问题】为啥WMWare Workstation里面虚拟机的网关默认是NAT网关

    今天做KickStart自动化安装实验,无意中发现一个奇怪现象. 先描述下我的实验环境:笔记本Win10,安装了WMWare Workstation,在WMWare Workstation上面安装了C ...

  6. win10锁屏壁纸文件夹Assets中无文件问题的解决方法

    一.前言 win10在锁屏时会有很多精美的壁纸,在网上查找到win10锁屏壁纸存放目录为 : C:\Users\你的用户名\AppData\Local\Packages\Microsoft.Windo ...

  7. Spring的使用及Spring3.2控制器增强@ControllerAdvice

    在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component. @Controller.@Service等这些注解的类,则把这 ...

  8. ndk学习之C语言基础复习----结构体、共用体与C++开端

    自己实现sprintf功能: 关于C中的系统函数sprintf在上次[https://www.cnblogs.com/webor2006/p/7545627.html]学习中已经用到过了,这里再来回顾 ...

  9. Java&Selenium 模拟键盘方法封装

    Java&Selenium 模拟键盘方法封装 package util; import java.awt.AWTException; import java.awt.Robot; import ...

  10. 使用Python进行3DES加密-pyDes

    pyDes.py源码 ############################################################################# # Documenta ...