Filter过滤器

1.1 基本概念

  • Filter本意为”过滤“的含义,是JavaWeb的三大组件之一,三大组件为:Servlet、Filter、Listener。
  • 过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件。
  • 过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求
    进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等。

1.2 Filter原理

1.3 Filter基本使用

1.3.1 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<form action="login" method="post">
    用户姓名: <input type="text" name="userName"><br/>
    用户密码: <input type="password" name="password"><br/>
    <input type="submit" value="注册"/>
</form>
</body>
</html>

1.3.2 LoginServlet

package cn.guardwhy.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;

/*
控制器:Servlet
*/
@WebServlet(name = "LoginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
        // 1.获取请求中的用户名和密码
        String userName = request.getParameter("userName");
        System.out.println("获取到的用户名:" + userName);
        String password = request.getParameter("password");
        System.out.println("获取到的密码:" + password);
        // 2.用户名和密码校验
        if("Curry".equals(userName) && "1234".equals(password)){
            System.out.println("登录成功,欢迎使用");
            // 3.存储用户信息
            request.getSession().setAttribute("userName", userName);
            // 4.重定向
            response.sendRedirect("main.jsp");
        }else {
            System.out.println("用户名或者密码错误,请重新输入...");
            // 5.转发
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

1.3.3 main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>页面主题</title>
</head>
<body>
<h3>登录成功,欢迎${sessionScope.username}使用</h3>
</body>
</html>

1.3.4 LoginFilter

package cn.guardwhy.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/*
拦截器
*/
public class LoginFilter implements Filter {
    @Override
    // web服务器启动,过滤器开始初始化,随时等待过滤对象出现。
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器开始初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                         FilterChain filterChain) throws IOException, ServletException {
        // 0.设置编码
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        
        // 1.获取session对象
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpSession session = httpServletRequest.getSession();
        // 2.得到用户名
        Object userName = session.getAttribute("userName");
        // 3.获取Servlet请求路径
        String servletPath = httpServletRequest.getServletPath();
        // 4.假设没有登录,则返回登录页面
        if(null == userName && !servletPath.contains("login") ){
            // 转发
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }else{
            // 5.登录则放行
            filterChain.doFilter(request, response);
        }
    }

    @Override
    // web服务器关闭的时候,过滤器销毁
    public void destroy() {
        System.out.println("过滤器销毁。。");
    }
}

1.3.5 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--过滤器-->
    <filter>
        <filter-name>LoginServlet</filter-name>
        <filter-class>cn.guardwhy.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginServlet</filter-name>
        <url-pattern>/main.jsp</url-pattern>
        <!--<url-pattern>/*</url-pattern>-->
    </filter-mapping>
</web-app>

执行结果

1.4 Filter接口

1.4.1 基本概念

javax.servlet.Filter接口主要用于描述过滤器对象,可以对资源的请求和资源的响应操作进行筛选操作。

1.4.2 常用的方法

方法声明 作用
void init(FilterConfig filterConfig) 实现过滤器的初始化操作。
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 执行过滤操作的功能。
void destroy() 实现过滤器的销毁操作。

1.5 FilterConfig接口

1.5.1 基本概念

javax.servlet.FilterConfig接口主要用于描述过滤器的配置信息。

1.5.2 常用方法

方法声明 作用
String getFilterName() 获取过滤器的名字。
String getInitParameter(String name) 获取指定的初始化参数信息。
Enumeration getInitParameterNames() 获取所有的初始化操作名称
ServletContext getServletContext() 获取ServletContext对象。

代码示例

package cn.guardwhy.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;

/*
拦截器
*/
public class LoginFilter implements Filter {
    @Override
    // web服务器启动,过滤器开始初始化,随时等待过滤对象出现。
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化操作正在火热进行中...");
        System.out.println("获取到的过滤器名称为:" + filterConfig.getFilterName());
        String userName = filterConfig.getInitParameter("userName");
        System.out.println("获取到指定初始化参数的数值为:" + userName);  
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()) {
            System.out.println("获取到的初始化参数名为:" + initParameterNames.nextElement());
        }
        ServletContext servletContext = filterConfig.getServletContext();
        System.out.println("获取到的上下文对象是:" + servletContext);
    }

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

    @Override
    public void destroy() {
    }
}

1.6 多个过滤器

如果有多个过滤器都满足过滤的条件,则容器依据映射的先后顺序来调用各个过滤器。

posted @ 2021-10-28 18:35  guardwhy  阅读(78)  评论(0)    收藏  举报