学习笔记——JavaWeb过滤器

学习笔记——JavaWeb过滤器


1.什么是过滤器

过滤器是一个服务器端组件,它可以截取用户端的请求与相应信息,并对这些信息过滤。

简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。


2.过滤器的工作原理和生命周期


2.1工作原理

根据过滤器在Web.xml中的设置,特定的网址会经过特定的过滤器。随后通过过滤器的处理,再将处理过的用户请求发送至web资源,资源响应之后再发送到过滤器,过滤器再处理之后,才发送给用户。


2.2 生命周期

过滤器在Tomcat服务器启动时加载,通过Web.xml中的设置实例化,之后通过Filter.init()方法初始化。在触发过滤要求时,调用Filter.doFilter()执行过滤处理。最后在Tomcat服务器关闭时,调用Filter.destroy()销毁过滤器。


2.3 过滤器链

当一个请求符合多个过滤器的要求是,就会形成过滤器链。服务器会按在web.xml中过滤器定义的顺序将过滤器组装成一条链,用户请求通过这条链访问web资源。


具体处理过程:
多个过滤器的情况下,会先执行第一个过滤器chain.doFilter()前的代码,然后doFilter()到达第二个过滤器。第二个过滤器也会先执行chain.doFilter()前的代码,然后doFilter()到达Servlet.service()方法。之后在返回过滤器2doFilter()之后的代码,在返回过滤器1doFilter()之后的代码,最后才返回用户。



3.如何编写一个简单过滤器

3.1过滤器的三个主要方法

编写过滤器之前,先熟悉一下过滤器的三个主要方法:

3.2 继承 javax.servlet.Filter

开始编写第一步:继承
public class MyFirstFilter implements javax.servlet.Filter

3.3 重写doFilter

第二步:重写
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
        //你的代码
        chain.doFilter(req, resp);
    }

3.4 注册Filter

第三步:注册

4.过滤器的分类

过滤器根据其处理的请求类别,分为5类。Servlet2.5中定义了request,Forward,Include,Error四类,而Servlet3.0中定义了第5类:Async。下图中的RequestDispatcher的forward方法等于<jsp:forward>方法,同理,include等于<jsp:include>方法。第5类,Async用于通过过滤器访问的Servlet有大量耗时操作时,可直接回到过滤器chain.doFilter()之后的代码运行,让Servlet异步运行计算操作。


5.过滤器的应用



1.登录验证
1.1将过滤器的url地址设为“/*”
  <filter-mapping>
    <filter-name>MyFirstFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>
1.2查看session中是否有登录名
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;       
        HttpSession session = request.getSession();
        String username = (String) session.getAttribute("username");
        if ("".equals(username) || username == null) {
            response.sendRedirect("login.jsp");
        }
        chain.doFilter(req, resp);
    }
2.编码 转换
在过滤其中添加以下语句:
  request.setCharacterEncoding("UTF-8");

6.过滤器的其他问题


1.过滤器能否改变用户请求的资源,即改变用户请求的路径?
答:可以的。过滤器可通过,request.sendRedirect()方法或response.getDispatcher().forword()方法改变用户请求的路径。

2.过滤器能否直接诶返回数据?
答:不能。
发布了15 篇原创文章 · 获赞 1 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览