javaweb回顾第十一篇过滤器(附实现中文乱码问题)
1:过滤器概念
过滤器就是一种在请求目标资源的中间组件,比喻把污水转换成纯净水中间需要一个污水净化设备,那么这个设备就好比一个过滤器。那么我用图来表示过滤器(可以有多个过滤器)运行的过程
2:Filter(过滤器)接口
Filter接口包含三个方法分别是init、doFilter、 destroy下面先逐个介绍。
2.1:public void init(FilterConfig filterConfig)
这个方法主要来完成初始化过滤器,容器调用这个方法的时候,向过滤器传递FilterConfig对象,FilterConfig的用法和ServletConfig相似,利用FilterConfig对象可以得到ServletContext对象,以及可以得到部署描述符中过滤器初始化的参数。
2.2:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
该方法和Servlet中的service相似,当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter方法,在这个方法中可以对请求和响应进行处理,实现过滤器的特定功能,在处理完成之后调用chain.doFilter把请求传给下一个过滤器(目标资源)
2.3:public void destroy()
当过滤器生命结束的时候,容器就会调用该方法来释放过滤器的资源
3:过滤器的配置
过滤器是通过<filter>和<filter-mapping>元素来完成的。
3.1:<filter>元素
<filter>元素的属性,<filter-name>来为过滤器指定一个名字,<filter-class>元素用于指定过滤器完整的限定类名,<init-param>用来为过滤器指定初始化参数,他下面有2个属性,一个是<param-name>参数名称,另一个是<param-value>参数值。
3.2:<filter-mapping>元素
<filter-mapping>下面有3个主要的属性,<filter-name>用来指定过滤已经在容器声明的过滤器名称,<url-pattren>和<servlet-name>这两个任选其中一个,<url-pattren>表示当请求这样的url时候过滤器被调用,<servlet-name>表示当这个Servlet被调用时候过滤器被调用(可以有多个Servlet)。
基本知识准备完毕了,现在我们一起开始进行实践。
4:过滤器时间应用
4.1:过滤器解决中文乱码问题
由于Web容器默认的编码方式是ISO-8859-1,在Servlet/Jsp程序中,通过请求的对象的getParameter()方法得到的字符串是以ISO-8859-1转换而来(有人说我在jsp程序已经设置了UTF-8为什么还出现这种情况呢,那是由于web容器再次对请求的数据进行一次转换,所以后来得到字符串就是ISO-8859-1编码的),这就是导致乱码的原因。如下图
那么找到根源以后问题就比较好解决了,核心代码如下
public class EncodingFilter implements Filter { protected String encoding=null;
class myRequestWrapper extends HttpServletRequestWrapper{ public myRequestWrapper(HttpServletRequest request) {
super(request);
}
public String getParameter(String param)
{
String value=null;
try{
//post提交
super.setCharacterEncoding(encoding);
value=super.getParameter(param);
if(super.getMethod().equalsIgnoreCase("GET"))//get提交
{
if(value!=null)
{
value=new String(value.getBytes("iso8859-1"), encoding);
}
}
}
catch(UnsupportedEncodingException e){
e.printStackTrace();
}
return value;
}
} public void init(FilterConfig filterConfig) throws ServletException {
this.encoding=filterConfig.getInitParameter("encoding");//从web容器来获取过滤器初始化参数
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//避免响应出现乱码情况
response.setCharacterEncoding("text/html;charset="+this.encoding);
//把过滤器给下一个过滤器或者资源处理器
chain.doFilter(new myRequestWrapper((HttpServletRequest)request), response);
} public void destroy() {
this.encoding=null;
}
}
对过滤器进行配置
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.lp.filters.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<servlet-name>LoginServlet</servlet-name>
<!-- <url-pattern>/LoginServlet</url-pattern> -->
</filter-mapping>
5:过滤器使用场景
5.1:对用户进行统一验证
5.2:对用户的访问要求进行记录或者审核
5.3:对用户请求发送的数据进行过滤或替换
5.4:转换图像格式
5.5:对响应的内容进行压缩,减少传输量
5.6:对请求和响应进行加解密处理
5.7:触发资源访问事件
javaweb回顾第十一篇过滤器(附实现中文乱码问题)的更多相关文章
- SSH项目web.xml文件的常用配置【struts2的过滤器、spring监听器、解决Hibernate延迟加载问题的过滤器、解决中文乱码的过滤器】
配置web.xml(struts2的过滤器.spring监听器.解决Hibernate延迟加载问题的过滤器.解决中文乱码的过滤器) <!-- 解决中文乱码问题 --> <filter ...
- selvert的过滤器filter处理中文乱码
注意问题:在学习用selvert的过滤器filter处理中文乱码时,在filter配置初始化时用了utf-8处理中文乱码,而在提交的jsp页面中却用了gbk.虽然两种都可以出来中文乱码,但是却造成了处 ...
- 关于web.xml中配置Spring字符编码过滤器以解决中文乱码的问题
当出现中文乱码问题,Spring中可以利用CharacterEncodingFilter过滤器解决,如下代码所示: <!-- Spring字符编码过滤器:解决中文乱码问题 --> < ...
- Spring编码过滤器:解决中文乱码
Spring编码过滤器:解决中文乱码 针对问题: 前台JSP页面和JAVA代码中使用了不同的字符集进行编码的时候就会出现表单提交的数据或者上传/下载中文名称文件出现乱码的问题: 解决方案: web.x ...
- 如何配置Filter过滤器处理JSP中文乱码
参考Tomcat服务器目录webapps的examples示例 简单配置步骤:1.在项目web.xml文件添加过滤器标记<filter>和<filter-mapping>:2. ...
- 04_过滤器Filter_02_Filter解决中文乱码问题
[过滤器解决中文乱码问题实例] [工程截图] [web.xml] <?xml version="1.0" encoding="UTF-8"?> &l ...
- SpringCloud(Finchley版本)中Zull过滤器ResponseBoby返回中文乱码解决方案
Spring Cloud带有"Cloud"的字样,但它并不是云计算解决方案,而是在Spring Boot基础上构建的,用于快速构建分布式系统的通用模式的工具集.使用Spring C ...
- 使用Filter过滤器,解决中文乱码问题
首先是建立一个filter.java文件,注意implements的是Filter的servlet的那个包: public class filter11 implements Filter { @Ov ...
- javaweb回顾第十篇JSTL
前言:JSTL(JSP Standard Tag Library)JSP标准标签库.它的目的是为了简化JSP的开发,如何没有JSTL可能我们开发的时候就需要写大量的自定义标签,无疑会加大开发难度,有了 ...
随机推荐
- android 的闪屏效果
android的闪屏效果,就是我们刚开始启动应用的时候弹出的界面或者动画,过2秒之后自动的跳转到主界面. 其实,实现这个效果很简单,使用Handler对象的postDelayed方法就可以实现.在这个 ...
- ButterKnife的原理简述
ButterKnife的原理简述 注解处理器Java5 中叫APT(Annotation Processing Tool),在Java6开始,规范化为 Pluggable Annotation Pro ...
- 丹佛机场行李系统Postmortem
丹佛机场行李系统做Postmortem总结 事情起因是因为丹佛市场承诺进行机场建设,因此此项目问题不可回避,必须完成,合作的双方都是富有经验的公司但是最后依然变成了不可控的项目,经过小组讨论后我们认为 ...
- 在PHP中使用Mysqli操作数据库
PHP的 mysqli 扩展提供了其先行版本的所有功能,此外,由于 MySQL 已经是一个 具有完整特性的数据库服务器 , 这为PHP 又添加了一些新特性 . 而 mysqli 恰恰也支持了 这些新特 ...
- 据说练就了一指禅神功的觅闻实时手机新闻网,正以每天2000+IP的用户量递增。有智能手机的可以当场进行体验,没有的就算了哈
据说练就了一指禅神功的觅闻实时手机新闻网,正以每天2000+IP的用户量递增.有智能手机的可以当场进行体验,没有的就算了哈 觅闻实时手机新闻网 http://m.yunxunmi.com 在IOS. ...
- Eclipse引入外部Jar在发布时没有自动带入,导致出现ClassNoFound错误
今天换了一台电脑重新配置环境调试老程序的时候出现链接数据库错误java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver提示. ...
- ASP.NET 5 入门 (3) – Logging
ASP.NET 5 理解和入门 建立和开发ASP.NET 5 项目 使用自定义配置文件 ASP.NET 5 入门 (3) – Logging 前几天就关注到汤姆大叔的相关文档: 解读ASP.NET 5 ...
- PowerShell笔记
教程: http://www.pstips.net/powershell-online-tutorials/ http://www.3fwork.com/a113/ 1. 查看成员 $MyInvoca ...
- asp.net core开发环境准备
1.1 安装sdk和运行时 浏览器打开网址https://www.microsoft.com/net/download, 到.Net Core下载页面. 根据操作系统,下载对应的SDK进行安装.安装 ...
- 一种另类的解决URL中文乱码问题--对中文进行加密、解密处理
情景:在资源调度中,首先用户需要选择工作目标,然后跟据选择的工作目标不同而选择不同的账号和代理ip.处理过程如下:点击选择账号,在js中获取工作目标对工作目标进行两次编码(encodeURI(enco ...