最近在重温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. python之re(正则表达式)

    可以参考以下博客 https://www.cnblogs.com/guyuyun/p/5839881.html https://www.runoob.com/python/python-reg-exp ...

  2. zabbix-设置邮箱预警

    设置预警系统 机器是被监控上了,但是出了问题怎么通知呢?之前学过监控软件的都知道可以使用报警机制啊,如果监控平台zabbix server发现某个机器异常了,可以给运维管理员发邮件啊,通过邮件通知管理 ...

  3. javascript实现Html Table数据表分页

    直接调用: <style type="text/css">           th         {             font-size:18px;     ...

  4. c多线程不加锁demo

    // // Created by gxf on 2019/12/13. // #include <stdio.h> #include <stdlib.h> #include & ...

  5. linux目录太长怎么办?分享一点小技巧

    在linux使用cd的时候,可能会遇到目录比较深的时候,这个时候总是cd一个很长的目录会很麻烦,那有没有什么比较方便的方法呢? 若是在两个目录中来回切换,这个时候可以使用cd - 这个命令,可以完成在 ...

  6. 模糊查询的sql语句

    Java程序中使用的sql语句一直不明白是什么作用,在网上搜索了一些资料,看到一篇博客,稍微解答了具体每条代码的作用,因为作者加了详细的注解,可以作为参考 <JavaWeb dao层条件查询(模 ...

  7. WCF之.NET Remoting通讯

    一.NET Remoting 介绍 简介 .NET Remoting与MSMQ不同,它不支持离线可得,另外只适合.NET平台的程序进行通信.它提供了一种允许对象通过应用程序域与另一个对象进行交互的框架 ...

  8. [Google Guava] 6-字符串处理:分割,连接,填充

    原文链接 译文链接 译者:沈义扬,校对:丁一 连接器[Joiner] 用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦.如果字符串序列中含有null,那连接操作会更难.Fluent风格的Joine ...

  9. Sql Server中REPLACE函数的使用

    在sql的使用过程当中,我们偶尔会遇到这样一种情况,就是需要改变数据的存储形式,比如数据库某一张表(Info)当中有一个字段Educational(学历),以前存储的是Json数组,现在由于需求的改变 ...

  10. click([[data],fn]) 触发每一个匹配元素的click事件。

    click([[data],fn]) 概述 触发每一个匹配元素的click事件. 这个函数会调用执行绑定到click事件的所有函数.大理石平台精度等级 参数 fnFunctionV1.0 在每一个匹配 ...