javaWeb实战教程3-过滤器filter

javaWeb实战教程


2.4 过滤器Filters

我们在访问http://localhost/javaWeb/lesson2_post.html提交的表单,如果内容里输入了中文,servlet内取到的值就是乱码,如提交你好,后台打印的却是??????

这是因为浏览器使用的编码和我们后台使用的编码不相同导致。我们可以在取值之前修改编码req.setCharacterEncoding("utf-8");,这样再取值就不会乱码了。但每次取值前都要执行一遍很麻烦,我们可以使用过滤器Filters来统一处理编码问题。

我们先来了解一下什么是过滤器Filters。

过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。可以实现以下目的:

  • 在客户端的请求访问后端资源之前,拦截这些请求。
  • 在服务器的响应发送回客户端之前,处理这些响应。

在我们的项目里新建一个包:cn.funsoftware.Lesson.filter,再在包内新建一个类:Lesson3Filter.java,让该类实现接口javax.servlet.Filter:

public class Lesson3Filter implements Filter{

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, 
        ServletResponse response, FilterChain chain) throws IOException,
        ServletException {

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}

filter的生命周期和servlet非常相同,不同的地方是,doFilter方法会在拦截到servlet前执行,并在servlet执行后再次执行,分割是chain.doFilter(request, response);

@Override
public void doFilter(ServletRequest request, 
    ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
    //运行servlet前
    chain.doFilter(request, response);
    //运行servlet后
}

想要让这个filter发挥作用,我们还需要配置一下;和servlet一样,配置filter也有两种方法:

可以在类前加上注解@WebFilter(“/*”);

也可以在web.xml内配置:

  <filter>
    <filter-name>Lesson3Filter</filter-name>
    <filter-class>cn.funsoftware.Lesson.filter.Lesson3Filter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Lesson3Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

其中/*设置 filter 所拦截的请求路径。

我们在Lesson3Filter里输出一些话,看看访问servlet是否会打印出来:

@Override
public void doFilter(ServletRequest request, 
ServletResponse response, FilterChain chain) throws IOException,
        ServletException {
    //调用servlet前
    System.out.println("filter被调用啦");
    chain.doFilter(request, response);
    System.out.println("filter又被调用啦");
    //调用servlet后
}

当我们再次提交刚刚的表单http://localhost/javaWeb/lesson2_post.html时,控制台打印

filter被调用啦
你好
value2
filter又被调用啦

我们下面来做一个统一编码拦截器;新建一个拦截器,命名为EncodingFilter.java,在doFilter方法里设置编码格式为utf-8request.setCharacterEncoding("utf-8");

@Override
public void doFilter(ServletRequest request, 
ServletResponse response, FilterChain chian) throws IOException,
        ServletException {
    request.setCharacterEncoding("utf-8");
    chian.doFilter(request, response);
    response.setCharacterEncoding("utf-8");
}

再把Lesson2.java中的req.setCharacterEncoding("utf-8");删除,提交带中文的表单看看,已经不会出现乱码了。

过滤器filter除了可以做统一编码以外,还可以做其他的功能:

  • 身份验证过滤器(Authentication Filters)。
  • 数据压缩过滤器(Data compression Filters)。
  • 加密过滤器(Encryption Filters)。
  • 触发资源访问事件过滤器。
  • 图像转换过滤器(Image Conversion Filters)。
  • 日志记录和审核过滤器(Logging and Auditing Filters)。
  • MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
  • 标记化过滤器(Tokenizing Filters)。
  • XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程详细讲解了以下内容:    1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程    2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例    3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题     4.session与cookie问题及application、cookie补充说明及四种范围对象作用域     5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别     6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据     7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)     8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析     9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)    1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)     11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet     12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题     13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove     14.过滤器过滤器通配符、过滤器链、监听器     15.session绑定解绑、钝化活化     16.以及Ajax的各种应用     17. Idea环境下的Java Web开发

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值