从Tomcat8开始,默认编码已经改为UTF-8,所以已经不会出现Get请求乱码问题了。
只需处理Post乱码。
我们往常对乱码的处理都放在Servlet的doGet和doPost方法中:

这个案例采用的Tomcat7

但是这样太麻烦了,每写一个Servlet都要处理乱码。于是就想到用Filter处理。我能想到的有两种处理方式:装饰者模式、动态代理。
装饰者模式处理乱码的方案大家可以直接看崔老师的视频:
案例3:全站编码问题
这里主要讲动态代理方式。


Filter+动态代理解决全站编码问题
对动态代理不熟悉的朋友,可以参考:Java 动态代理作用是什么?
web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name><!--编码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.summerframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping><!--测试Servlet-->
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>org.summerframework.web.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
</web-app>

TestServlet

public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println(username);
response.getWriter().write(username);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println(username);
response.getWriter().write(username);
}
}

CharacterEncodingFilter

public class CharacterEncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {// 【响应编码设置】后面Servlet拿到的Response对象都是已经设置过编码的 res.setContentType("text/html;charset=utf-8");/*
* 【请求编码设置】思路:
*
* 1.特别注意,这里的request/response类型是ServletRequest/ServletResponse,我们要强转成Http相关的
*
*
* 2.Filter传给后面Servlet的Request对象肯定不能是原先的,不然request.getParameter()还是会乱码
* 这里使用动态代理生成代理对象,所以后面Servlet拿到的其实是代理Request
*
* 3.对于Get、Post请求,解决乱码的方式是不同的,所以代理对象内部必须有针对两者的判断
* */
// 1.强转req/res 【思考一下为什么要加final】 final HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;// 2.使用Proxy.newProxyInstance()创建Request代理对象 Object proxyRequest = Proxy.newProxyInstance(
this.getClass().getClassLoader(), /*类加载器*/
req.getClass().getInterfaces(), /*代理对象要和目标对象实现相同接口*/
new InvocationHandler() { /*InvocationHandler,采用匿名内部类的方式*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 由于乱码的根源在于getParameter(),所以我们只盯着这个方法 if (!"getParameter".equalsIgnoreCase(method.getName())) {
return method.invoke(request, args);
}// 3.判断是Get还是Post if ("GET".equalsIgnoreCase(request.getMethod())) {// 按默认编码ISO-8859-1取出 String value = (String) method.invoke(request, args);// 按IOS-8859-1得到字节,再按UTF-8转成中文 value = new String(value.getBytes("ISO-8859-1"), "UTF-8");// 返回正确的中文 return value;
} else {// 目标方法前设置编码 request.setCharacterEncoding("UTF-8");
Object value = method.invoke(request, args);
return value;
}
}
});//把代理request对象传给Servlet chain.doFilter((HttpServletRequest) proxyRequest, res);
}
public void init(FilterConfig config) throws ServletException {
}
}

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/TestServlet?username=张三">点击发送Get请求</a><br/>
<form action="/TestServlet" method="post">
用户名:<input type="text" name="username" value="李四"/>
<input type="submit" value="提交Post请求">
</form>
</body>
</html>

示意图:

java steam filter 动态条件_Filter解决全站编码问题相关推荐

  1. javabean反射改字段内容_BAT程序员编写:深入理解 Java 反射和动态代理源码分析...

    什么是反射 反射(Reflection)是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. 通过反射机制,可以在运行时访问 Java ...

  2. 通过Filter统一全站编码

    为什么在filter 中设置编码 之前每个servlet都设置编码方式,防止请求和响应出现乱码,那么出现大量重复代码,而filter能够对请求消息和响应消息进行处理,所以把重复代码提取到filter中 ...

  3. springDataJpa入门教程(5)-单表动态条件查询+分页

    springDataJpa入门教程 springDataJpa入门教程(1)-基于springBoot的基本增删改查 springDataJpa入门教程(2)-Specification动态条件查询+ ...

  4. Java+Servlet+filter+javascript+html+jsp登入注册更新个人信息

    eclipse+Java+Servlet+filter+javascript+html+jsp+EL登入注册更新个人信息 数据库sql用vs2008或者mysql用mysql 代码粗糙,提示信息未处理 ...

  5. java全站_javaWeb_全站编码

    目的 : 实现javaweb项目的全站编码问题 需要解决的问题 : 在何时进行编码问题的解决, 在何处进行编码问题的解决, 才用什么方法进行解决 设计思路 : 在Filter进行全站的编码转换, 对于 ...

  6. 吃透Java中的动态代理

    动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...

  7. java线程同步——竞争条件的荔枝+锁对象

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--竞争条件的荔枝+锁对象 的相关知识: 0.2) for full sou ...

  8. 【渝粤题库】陕西师范大学164111 Java及JSP动态网页编程与应用 作业 (高起专)

    <JAVA与JSP动态网页编程与应用>作业 一.单选题 1.以下哪项都是关键字( ) A.package privati protect throw B. false final fina ...

  9. 列表页的动态条件搜索

    之前在搞.net的时候,我们可以借助强大的ExpressionTree来解决,之前有一篇是微软的EntityFramework表达式转换:Linq to Entity经验:表达式转换,是将一种表达式转 ...

最新文章

  1. c语言中volatile关键字的作用
  2. Java编程思想 学习笔记7
  3. 如何使用robots.txt[摘自网络]
  4. vba 定义类_VBA中类的介绍及应用简介
  5. android room数据库embed,Android room数据库基操
  6. javascript紧接上一张for循环的问题,我自己的理解
  7. Mac Os的java开发环境以及MySql环境配置
  8. html 给word插入页眉和页脚,Word文档如何在任意页插入页眉和页脚
  9. ios frame和bounds区别
  10. S7-1200 PLC与电子秤进行MODBUS RTU通信的具体步骤
  11. 验房师专用验房项目验收内容
  12. 台式计算机的规格参数有什么,台式机主流配置型号参数
  13. Sushi的MISO:不断扩展的DeFi边界
  14. 网页分享到贴吧,微博
  15. 计算机玩电脑游戏,玩电脑游戏250字
  16. 初识Git与GitHub和使用案例
  17. R语言 计算 赫芬达尔−赫希曼指数(HHI)
  18. php一条SQL语句mysql插入两条重复的数据
  19. IOS 定位城市和切换城市
  20. 良心推荐:机器学习入门资料汇总及学习建议(2018版)--黄海广

热门文章

  1. kindeditor图片上传
  2. T1042/T2080芯片工控主板对比
  3. Hammer.js分析(三)——input.js
  4. 企业级账号 版本更新总结
  5. HDFS Client 设计实现解析
  6. 信息学奥赛一本通 1152:最大数max(x,y,z)
  7. 信息学奥赛一本通 1258:【例9.2】数字金字塔
  8. 信息学奥赛一本通 1034:计算三角形面积 | OpenJudge NOI 1.3 17
  9. 信息学奥赛一本通(1208:2的幂次方表示)
  10. Easy Math(2018 ACM-ICPC 徐州赛区网络赛 D)