过滤器Filter

爱被打了一巴掌 2022-10-29 13:24 422阅读 0赞

文章目录

    • 介绍
    • 使用
    • Filter生命周期
    • Filter的顺序
    • Filter的应用场景

介绍

过滤器是用来拦截传入的请求和传出的响应,可以处理客户端和服务端之间传输的数据流。

使用

过滤器和Servlet类似,是java web提供的一个接口,开发者需要自定义一个类并实现该接口即可。

  1. public class MyFilter implements Filter {
  2. @Override
  3. public void init(FilterConfig filterConfig) throws ServletException {
  4. }
  5. @Override
  6. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  7. servletRequest.setCharacterEncoding("UTF-8");
  8. filterChain.doFilter(servletRequest,servletResponse);
  9. }
  10. @Override
  11. public void destroy() {
  12. }
  13. }

然后需要在web.xml对服务端的请求映射到filter上:

  1. <filter>
  2. <filter-name>encoding</filter-name>
  3. <filter-class>com.julian.filter.MyFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>encoding</filter-name>
  7. <url-pattern>/login</url-pattern>
  8. <url-pattern>/test</url-pattern>
  9. </filter-mapping>

另外我们可以通过注解的方式简化Filter的xml配置:

  1. @WebFilter("/login")
  2. public class MyFilter implements Filter {
  3. ...
  4. }
  5. @WebFilter(urlPatterns={ "/test","/login"}) //1个filter配置多个servlet
  6. public class MyFilter implements Filter {
  7. ...
  8. }

Filter生命周期

当tomcat启动是,通过反射机制调用Filter的无参构造创建实例化对象,同时调用init方法完成初始化,doFilter方法可重复调用,当tomcat关闭的时候,调用destroy方法销毁Filter对象。

  • 无参构造函数:调用一次,当tomcat启动是调用(需要在web.xml里配置)
  • init():创建实例化对象后调用一次
  • doFilter():调用多次
  • destroy():调用一次,tomcat关闭时调用

Filter的顺序

如果配置多个Filter,Filter的调用顺序由web.xml的配置顺序决定的,web.xml按顺序读取,由上到下顺序执行。

  1. <filter>
  2. <filter-name>encoding</filter-name>
  3. <filter-class>com.julian.filter.MyFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>encoding</filter-name>
  7. <url-pattern>/login</url-pattern>
  8. <url-pattern>/test</url-pattern>
  9. </filter-mapping>
  10. <filter>
  11. <filter-name>test</filter-name>
  12. <filter-class>com.julian.filter.YourFilter</filter-class>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>test</filter-name>
  16. <url-pattern>/login</url-pattern>
  17. </filter-mapping>

如上面的配置,配置两个Filter映射了login,那么顺序是这样的:
在这里插入图片描述

注意:如果配置多个filter,有严格的执行顺序,那么就不能通过注解的方式进行配置,只能通过xml的方式配置

Filter的应用场景

实际开发中需要用到Filter的场景:

  1. 统一处理中文乱码
  2. 屏蔽敏感词

    package com.julian.filter;

    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;

    @WebFilter(“/login”)
    public class WordFilter implements Filter {

    1. @Override
    2. public void init(FilterConfig filterConfig) throws ServletException {
    3. }
    4. @Override
    5. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    6. servletRequest.setCharacterEncoding("UTF-8");
    7. String name = servletRequest.getParameter("name");
    8. name = name.replaceAll("敏感词","***");
    9. servletRequest.setAttribute("name",name);
    10. filterChain.doFilter(servletRequest, servletResponse);
    11. }
    12. @Override
    13. public void destroy() {
    14. }

    }

    package com.julian.servlet;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;

    @WebServlet(“/login”)
    public class MyServlet extends HttpServlet {

    1. @Override
    2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. String name = (String) req.getAttribute("name");
    4. System.out.println(name);
    5. }
    6. @Override
    7. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    8. }

    }

  3. 控制资源的访问权限:
    访问download.jsp,如果是登录状态,则进下载页面,如果不是登录状态,返回登录页面

login.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <form action="/login" method="post">
  8. 用户名:<input type="text" name="name"><br>
  9. 密码:<input type="text" name="password"><br>
  10. <input type="submit" value="确定">
  11. </form>
  12. </body>
  13. </html>

LoginServlet.java

  1. package com.julian.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebFilter;
  4. import javax.servlet.annotation.WebServlet;
  5. import javax.servlet.http.HttpServlet;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import javax.servlet.http.HttpSession;
  9. import java.io.IOException;
  10. @WebServlet("/login")
  11. public class LoginServlet extends HttpServlet {
  12. @Override
  13. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14. String name = req.getParameter("name");
  15. String password = req.getParameter("password");
  16. if(name.equals("admin")&& password.equals("123"))
  17. {
  18. HttpSession session = req.getSession();
  19. session.setAttribute("name", name);
  20. session.setAttribute("password", password);
  21. resp.sendRedirect("/download.jsp");
  22. }
  23. }
  24. @Override
  25. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  26. super.doGet(req, resp);
  27. }
  28. }

DownloadFilter.java

  1. package com.julian.filter;
  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebFilter;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import javax.servlet.http.HttpSession;
  7. import java.io.IOException;
  8. @WebFilter("/download.jsp")
  9. public class DownloadFilter implements Filter {
  10. @Override
  11. public void init(FilterConfig filterConfig) throws ServletException {
  12. }
  13. @Override
  14. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  15. HttpServletRequest req = (HttpServletRequest) servletRequest;
  16. HttpServletResponse resp = (HttpServletResponse) servletResponse;
  17. HttpSession session = req.getSession();
  18. String name = (String) session.getAttribute("name");
  19. if(name == null)
  20. {
  21. resp.sendRedirect("/login.jsp");
  22. }
  23. else
  24. {
  25. filterChain.doFilter(servletRequest, servletResponse);
  26. }
  27. }
  28. @Override
  29. public void destroy() {
  30. }
  31. }

download.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>Title</title>
  5. </head>
  6. <body>
  7. <a href="">资源1</a>
  8. <a href="">资源2</a>
  9. <a href="">资源3</a>
  10. </body>
  11. </html>

发表评论

表情:
评论列表 (有 0 条评论,422人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Filter 过滤器

    Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。 1.什么是Filter及其作用介绍      Filter是sun公司中servlet2.3后增加的一

    相关 Filter过滤器

    Filter的基本功能是对servlet容器调用servlet的过程进行拦截,从而在servlet进行响应处理的前后实现一些特殊的功能。 在servletAPI中定义了三个接

    相关 Filter过滤器

    过滤器: 过滤   过滤请求 可以写多个 从用户访问  ->第一个过滤器  -> 第二个过滤 -> servlet   生命周期:随着项目的启动而创建 当访问了地址后而

    相关 Filter过滤器

    一、Filter过滤器 1、介绍       Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态资源文件等进行

    相关 Filter 过滤器

    > 过滤器,其实就是对客户端发出来的请求进行过滤。浏览器发出,然后服务器派Servlet处理。在中间就可以过滤,其实过滤器起到的是拦截的作用,也就是拦截器。 作用