java 过滤器 中文_javaweb回顾第十一篇过滤器(附实现中文乱码问题)

1:过滤器概念

过滤器就是一种在请求目标资源的中间组件,比喻把污水转换成纯净水中间需要一个污水净化设备,那么这个设备就好比一个过滤器。那么我用图来表示过滤器(可以有多个过滤器)运行的过程

4340d5e31533d7b567fd9b0cb0046ac1.png

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:过滤器的配置

过滤器是通过和元素来完成的。

3.1:元素

元素的属性,来为过滤器指定一个名字,元素用于指定过滤器完整的限定类名,用来为过滤器指定初始化参数,他下面有2个属性,一个是参数名称,另一个是参数值。

3.2:元素

下面有3个主要的属性,用来指定过滤已经在容器声明的过滤器名称,和这两个任选其中一个,表示当请求这样的url时候过滤器被调用,表示当这个Servlet被调用时候过滤器被调用(可以有多个Servlet)。

基本知识准备完毕了,现在我们一起开始进行实践。

4:过滤器时间应用

4.1:过滤器解决中文乱码问题

由于Web容器默认的编码方式是ISO-8859-1,在Servlet/Jsp程序中,通过请求的对象的getParameter()方法得到的字符串是以ISO-8859-1转换而来(有人说我在jsp程序已经设置了UTF-8为什么还出现这种情况呢,那是由于web容器再次对请求的数据进行一次转换,所以后来得到字符串就是ISO-8859-1编码的),这就是导致乱码的原因。如下图

acd0473b440dc7efc7aedaa6e6f2a9f1.png

那么找到根源以后问题就比较好解决了,核心代码如下

public class EncodingFilter implementsFilter {protected String encoding=null;class myRequestWrapper extendsHttpServletRequestWrapper{publicmyRequestWrapper(HttpServletRequest request) {super(request);

}publicString 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();

}returnvalue;

}

}public void init(FilterConfig filterConfig) throwsServletException {

this.encoding=filterConfig.getInitParameter("encoding");//从web容器来获取过滤器初始化参数

}public voiddoFilter(ServletRequest request, ServletResponse response, FilterChain chain)throwsIOException, ServletException {//避免响应出现乱码情况

response.setCharacterEncoding("text/html;charset="+this.encoding);//把过滤器给下一个过滤器或者资源处理器

chain.doFilter(newmyRequestWrapper((HttpServletRequest)request), response);

}public voiddestroy() {

this.encoding=null;

}

}

对过滤器进行配置

encoding

com.lp.filters.EncodingFilter

encoding

UTF-8

encoding

LoginServlet

5:过滤器使用场景

5.1:对用户进行统一验证

5.2:对用户的访问要求进行记录或者审核

5.3:对用户请求发送的数据进行过滤或替换

5.4:转换图像格式

5.5:对响应的内容进行压缩,减少传输量

5.6:对请求和响应进行加解密处理

5.7:触发资源访问事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值