Filter过滤器教程

Filter过滤器

在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时就会将敏感信息用*等字符替代,这就是过滤器对信息进行了处理。它不仅能预处理数据,只要发送过来的请求它都是可以预处理,同时它还可以对服务器返回的响应进行预处理,大大减轻了服务器的压力。

Filter 过滤器它是 Java Web 的三大组件之一。

三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器

Filter 过滤器它是 Java EE 的规范。也就是接口

  • Filter 过滤器它的作用是:拦截请求,过滤响应。

  • 拦截请求常见的应用场景有:

    • 1、权限检查
    • 2、日记操作
    • 3、事务管理
  • 拦截请求常见的应用场景有:1.权限检查2.日记操作

概念

它主要起过滤作用,对从客户端向服务器发送的请求进行过滤,也可以对服务器端返回的响应进行处理。它使用户可以改变一个request和修改一个response。

Filter不是一个servlet,它不能产生一个response,但是它能在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response。换句话说,filter其实就是客户端与servlet中间的一个传递者,并且它可以对要传递的东西进行修改。

**javax.servelt.Filter**是一个接口

过滤器能够在浏览器发出的请求到达请求资源目标前运行一些代码,通常是用来检查这个请求是不是满足某些要求,如果发现特定条件成立,可以阻止请求访问这个资源。

为什么使用过滤器

过滤器不但能过滤servlet的请求,还能过滤访问图片、页面等的请求,如果多个servlet有相同的代码,我们可以将这些代码提取到过滤器种,减少代码冗余。【过滤器可以减少代码冗余,避免一些非正确的请求。】

具体使用

如:必须登录以后才能访问项目中的页面,这样导致我们在很多的servlet中编写了判断session中是否包含信息的逻辑,如果有过滤器,我们只要编写一次就可以了。

使用filter的三个步骤:

  1. 定义类,实现Filter接口,并重写所有方法
  2. 配置Filter拦截资源路径,在类上通过WebFilter("/*")来配置 (/*)表示拦截所有资源
  3. doFilter方法中完成具体过滤

案例编写

我们首先编写一个MyFilter

package filters;

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

/*
* 运行的顺序
* init初始化
* doFilter 具体处理请求是否过滤的方法
* destroy 最终销毁方法
* */
@WebFilter("/*")
///*表示访问所有资源前都要经过过滤器
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
       //初始化
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       //放行  如果不写这行代码则所有请求都被过滤掉了
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        //销毁
    }
}

注意doFilter()方法中什么也不写的话就表示什么都

登录注册进阶

使用之前的登录注册,从零开始servlet-jdbc-mysql登录注册实现https://blog.csdn.net/zhulir/article/details/148049458?spm=1011.2415.3001.5331
设主页面只能在登录状态下访问。使用过滤器验证用户登录状态

在这个项目中,login.html、register.html时登录和注册界面,我们把demo.html当成项目的主页,此时我们想访问主页必须要保证登录状态,所以我们需要在Login Servlet中添加Session记录用户数据。

1、首先在Login Servlet中添加session,用于记录用户数据

当用户名密码正确的时候,创建session对象

@WebServlet("/user/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置字符集
        request.setCharacterEncoding("UTF-8");
        //获取用户的请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //处理和数据库的连接
        Connection conn = DruidUtils.getConnection();
        String sql = "select count(*) from users where username=? and password=?";
        try {
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, username);
            pstmt.setString(2, password);
            ResultSet rs =pstmt.executeQuery();
              while(rs.next()) {
                  int num = rs.getInt(1);
                  if (num > 0) {
                      //登录成功处理
                     System.out.println(username);
                     HttpSession session = request.getSession();
                     session.setAttribute("username", username);
                     //重定向到主页
                     response.sendRedirect(request.getContextPath() + "/demo.html");

                  } else {
                      // 登录失败处理
                      response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                      response.setContentType("text/html;charset=utf-8");
                      PrintWriter out = response.getWriter();
                      out.println("登录失败!用户名或者密码失败!");
                  }
              }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

2、重写doFilter方法:

@WebFilter("/demo.html")
///*表示访问所有资源前都要经过过滤器
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
       //初始化
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       //将过滤器中的请求和响应对象转换为HTTP协议封装的
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //检查用户是否登录
        HttpSession session = request.getSession();
        //获取用户信息
     String user=(String)session.getAttribute("username");
     if(user!=null){
         //允许访问主页面
         filterChain.doFilter(servletRequest, servletResponse);
     }else{
         //用户没有登录
         response.sendRedirect(response.encodeRedirectURL(request.getContextPath()+"/login.html"));
     }
    }

    @Override
    public void destroy() {
        //销毁
    }
}

运行项目发现,访问demo.html会自动转成访问login.html界面。

Filter过滤器路径配置

过滤路径表示Filter会对请求的哪些资源进行过滤,使用@WebFilter注解进行配置。如:@WebFilter("过滤路径")。过滤路径有四种方式配置:

  • 过滤具体的资源:/index.jsp 只有访问index.jsp时才会被拦截
  • 目录过滤:/user/* :访问/user下的所有资源都会被拦截
  • 后缀名过滤:*.jsp :访问后缀名为jsp的资源都会被拦截
  • 过滤所有:/* :访问所有资源都会被拦截

Filter过滤器链

在一个WEB应用里,可以配置多个过滤器,多个过滤器就会组成过滤器链

多个过滤器链存在优先级问题,以注解方式配置的Filter过滤器,它的执行优先级是按时过滤器类名的自动排序确定的,类名排名越靠前,优先级越高。
比如有如下两个过滤器:BFilterAFilter。那一定时AFilter过滤器先执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值