详解JavaWeb中的过滤器Filter

一、什么是过滤器

1.Filter过滤器的作用:拦截请求

2.拦截请求常见场景:

(1)权限检查
(2)日记操作
(3)事务管理

1.1 使用步骤

Filter 过滤器的使用步骤:
1、编写一个类去实现Filter 接口
2、实现过滤方法doFilter()
3、到web.xml 中去配置Filter 的拦截路径

二、初体验

web工程下新建一个admin目录,作为需要权限才能访问的目录,其中有两个文件

2.1 mynav.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>导航</title>
</head>
<body>
<table>
    <tr>
        <td>
            百度<input type="text">
        </td>
    </tr>
    <tr>
        <td>
            Google<input type="text">
        </td>
    </tr>
    <tr>
        <td>
            必应<input type="text">
        </td>
    </tr>
</table>
</body>
</html>

2.2 FilterServlet程序

package com.filter.filter;

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

/**
 * @author ningqian
 * @create -05-16 20:17
 */
 //注意导包是javax
public class FilterServlet implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("来到Filter过滤器");
        HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
        HttpSession session = httpServletRequest.getSession();
        //如果session的属性user为空,转发到首页
        if(session.getAttribute("user")==null){
            servletRequest.getRequestDispatcher("/index.jsp").forward(servletRequest,servletResponse);
        }
        else{//如果session的属性user不为空,则放行
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

2.3 HelloServlet程序

package com.filter.filter;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
    private String message;

    public void init() {
        message = "Hello World!";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");

        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
        HttpSession session = request.getSession();
        session.setAttribute("user","ningqian");
    }

    public void destroy() {
    }
}

2.4 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>FilterServlet</filter-name>
        <filter-class>com.filter.filter.FilterServlet</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterServlet</filter-name>
         <!--表示受限的文件-->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.filter.filter.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

2.5 index.jsp

<?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>FilterServlet</filter-name>
        <filter-class>com.filter.filter.FilterServlet</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterServlet</filter-name>
         <!--表示受限的文件-->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.filter.filter.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

三、测试

1.启动服务器

2.在浏览器地址栏输入:http:localhost:8080/filter/admin/1.jpg
表示直接访问admin目录下的图片
由于此目录下的文件在web.xml中配置为受限,所以此时请求被FilterServlet收到,使用doFilter方法进行请求过滤检查,发现会话session中没有user属性,所以将该请求转发到index.jsp

3.在浏览器地址栏输入:http:localhost:8080/filter/
首页不在受限的目录下,所以可以直接访问,点击页面上的链接Hello Servlet,此时,将请求发到服务器,HelloServlet程序接收,通过doGet()方法,给会话session的user赋值

4.再次在浏览器输入:http:localhost:8080/filter/admin/1.jpg,此时就可以正常访问。

四、Filter的生命周期

Filter 的生命周期包含几个方法

1、构造器方法

2、init 初始化方法

第1,2 步,在web 工程启动的时候执行(Filter 已经创建)

3、doFilter 过滤方法

第3 步,每次拦截到请求,就会执行

4、destroy 销毁

第4 步,停止web 工程的时候,就会执行(停止web 工程,也会销毁Filter 过滤器)

五、FilterConfig类

FilterConfig 类见名知义,它是Filter 过滤器的配置文件类。
Tomcat 每次创建Filter 的时候,也会同时创建一个FilterConfig 类,这里包含了Filter 配置文件的配置信息。
FilterConfig 类的作用是获取filter 过滤器的配置内容

1、获取Filter 的名称filter-name 的内容:filterConfig.getFilterName()

2、获取在Filter 中配置的init-param 初始化参数(在web.xml中配置):filterConfig.getInitParameter(“username”)

3、获取ServletContext 对象:filterConfig.getServletContext()

<!--filter 标签用于配置一个Filter 过滤器-->
<filter>
<!--给filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置filter 的全类名-->
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost3306/test</param-value>
</init-param>
</filter>

六、FilterChain过滤器链

多个过滤器

七、Filter 的拦截路径

Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!

八、精确匹配

8.1 目录匹配

<url-pattern>/admin/*</url-pattern>

8.2 后缀名匹配

<url-pattern>*.html</url-pattern>

到此这篇关于详解JavaWeb中的过滤器Filter的文章就介绍到这了,更多相关JavaWeb Filter内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaWeb之Filter过滤器详解

    原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼.言归正传,过滤器从字面理解她的话有拦网.过滤的功能,可以算是JavaWeb的拦精灵. 一.由来 客户端发起请求,那服务器不能什么请求都做出响应,做拦截处理,不仅能减轻服务器的压力,还能保护数据的安全,同样服务端做出响应给客户端时有时也需要进行过滤,比如我们常见的图片添加水印.为了处理这些问题,于是过滤器出现了.有时不仅仅对请求与响应进行一层的过滤

  • JavaWeb实战之编写单元测试类测试数据库操作

    首先导入jar包 使用Mybatis generator生成,dao.entity.mappers 没有dataSource,我圈错了... jdbc.properties是数据库链接配置文件 sqlMapConfig.xml是Mybatis 配置文件 如何自动生成这些文件夹? 如下.右键generatorConfig -> 选择Run as -> 如何点击Run Mybatis Generator 新建MyBatisTool public class MybatisTool { public

  • javaweb中Filter(过滤器)的常见应用

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 package me.gacl.web.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException;

  • JavaWeb实现文件的上传与下载

    JavaWeb实现文件的上传与下载,供大家参考,具体内容如下 第一步:导包 导入commons-fileupload-1.3.3.jar和commons-io-2.4.jar两个依赖包 第二步:编写前端页面 1.提交页面 index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ tagl

  • JavaWeb实战之用Servlet+JDBC实现用户登录与注册

    一.前言 使用到的技术栈: (1)JDBC (2)Servlet (3)MySQL 二.准备工作 (1)书城用户数据库与表创建 (2)编写用户类对象JavaBean (3)编写JdbcUtils对数据库进行交互(使用德鲁伊数据库连接池) (4)编写web层 最终编写好的第二阶段登陆注册文件结构为 dao中定义了基础的操作数据库代码,具体功能有 1.Insert.update.delete(修改) 2.查询一个对象(返回一个对象) 3.查询一个数组对象(数组返回多个对象) 4.返回某一个特定值对象

  • javaweb设计中filter粗粒度权限控制代码示例

    1 说明 我们给出三个页面:index.jsp.user.jsp.admin.jsp. index.jsp:谁都可以访问,没有限制: user.jsp:只有登录用户才能访问: admin.jsp:只有管理员才能访问. 2 分析 设计User类:username.password.grade,其中grade表示用户等级,1表示普通用户,2表示管理员用户. 当用户登录成功后,把user保存到session中. 创建LoginFilter,它有两种过滤方式: 如果访问的是user.jsp,查看sess

  • JavaWeb Servlet中Filter过滤器的详解

    JavaWeb Servlet中Filter过滤器的详解 1.简述 Filter过滤器,对web服务器所有web资源进行过滤,从而实现一些特殊的功能(权限访问控制.过滤敏感词汇.压缩响应信息).Filter能够对Servlet容器的请求和响应进行检查和修改,其本身不能生成请求request和响应response,只提供过滤作用(Servlet被调用之前检查Request对象修改其相关信息,Servlet被调用后检查Response修改其相关信息),Filter对象常驻服务器. 2.Lifecyc

  • JavaWeb学习笔记之Filter和Listener

    Filter:过滤器 过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能.一般用于完成通用的操作.如:登录验证.统一编码处理.敏感字符过滤... 过滤器相当于浏览器与 Web 资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求进行修改.判断以及拦截等,也可以对响应进行修改.判断以及拦截等. 执行流程: 客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet 如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队. 只要有一个过滤器, 不放行

  • JavaWeb中Servlet的深入讲解

    Servlet 1 Servlet 简介 Servlet就是Sun 公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet ,如果你向开发一个Servlet程序,只需要完成两个小步骤 编写一个类,实现Servlet接口 把开发好的Java类部署到web服务器中 把实现Servlet接口的Java程序叫做 Servlet 2 HelloServlet 构建一个普通的Maven项目,删除里面的src目录.这个空的工程就是Maven主工程 关于Maven父子工程的理解: 父

  • javaweb开发提高效率利器JRebel详解

    JRebel用了有一段时间了,发现确实好用,节省了很多不必要的时间,提高了开发效率.在这里记录一下他的安装和使用过程,希望能帮助到有需要的人. 官网:https://www.jrebel.com/ 一.JRebel简介 jrebel是国外公司perforce于2007年开发的一款java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序.jrebel提供了常用的开发IDE如IntelliJ Idea.eclipse.myEclipse.NetBeans等的jrebel插件,可以很方便

随机推荐