首页 > 网站 > WEB开发 > 正文

学习笔记——JavaWeb过滤器

2024-04-27 15:17:14
字体:
来源:转载
供稿:网友

学习笔记——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.过滤器能否直接诶返回数据?答:不能。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表