【JavaWeb】Filter

news/2024/4/20 4:03:02/文章来源:https://blog.csdn.net/qq_53798578/article/details/128094048

文章目录

  • 1.Filter过滤器
  • 2.Filter的初体验
  • 3.Filter的生命周期
  • 4.FilterConfig类
  • 5.FilterChain过滤器链
  • 6.Filter的拦截路径

1.Filter过滤器

(1).概念及作用

  • Filter过滤器是JavaWeb的三大组件之一
  • 三大组件分别是:Servlet程序,Listener监听器,Filter过滤器
  • Filter过滤器是JavaEE的规范,也就是接口
  • 作用:拦截请求,过滤响应
    拦截请求的常见应用场景有:权限检查,日记操做,事物管理等

2.Filter的初体验

  • 根据我们之前学过的内容,我们知道,用户登录之后会把用户登录的信息保存到Session域中,所以要检查用户是否登录,可以判断Session中是否包含用户登录的信息即可

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

在这里插入图片描述

我们部署工程的时候,在浏览器输入我们要访问的资源路径,之后的整个过程就如上图所示
有权限,就会访问到我们要访问的资源

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;HttpSession  session = httpServletRequest.getSession();Object user = session.getAttribute("user");//如果为null,说明还没登录if(user == null){servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);return;}else {//让程序继续往下访问用户的目标资源filterChain.doFilter(servletRequest,servletResponse);}}
<!--filter标签用于配置一个Filter过滤器--><filter><!--给filter起一个别名--><filter-name>AdminFilter</filter-name><!--配置filter的全类名--><filter-class>filter.AdminFilter</filter-class></filter><!--filter-mapping配置Filter过滤器的拦截路径--><filter-mapping><!--filter-name表示当前的拦截路径给哪个filter使用--><filter-name>AdminFilter</filter-name><!--url-pattern配置拦截路径/ 表示请求地址为:http://ip:port/工程路径/ 映射到IDEA的web目录/admin/* 表示请求地址为:http://ip:port/工程路径/admin/*--><url-pattern>/admin/*</url-pattern></filter-mapping>

没有权限就会返回到下图界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
这是登陆页面,login.jsp页面
</body>
</html>

注意:
利用jsp也可以起到拦截的作用,但是这种方法有一定的局限性,servlet程序只能写在jsp(只能拦截访问当前jsp资源),所以使用的是Filter用于拦截路径.

  • 完整的用户登录和权限检查
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset=UTF");String username = req.getParameter("username");String password = req.getParameter("password");if("wyl168".equals(username) && "123456".equals(password)){req.getSession().setAttribute("user",username);resp.getWriter().write("登陆 成功! ! !");}else{req.getRequestDispatcher("/login.jsp").forward(req,resp);}}
}
<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>filter.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/loginServlet</url-pattern></servlet-mapping>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
这是登陆页面,login.jsp页面</br>
<form action="http://localhost:8080/15_filter/loginServlet" method="get">用户名: <input type="text" name="username"/></br>密  码: <input type="password" name="password"/></br><input type="submit" />
</form>
</body>
</html>

说明:当用户提交完正确的用户名和密码,点击提交,就会执行Servlet程序,执行Servlet程序就会保存用户信息到Session域中,此时再次在浏览器输入要访问的资源路径,会执行Filter程序,执行Filter程序就会在Session中找到用户信息,所以就能访问到相应的资源了.

3.Filter的生命周期

Filter的生命周期包含的方法:

(1).构造器方法

public AdminFilter(){System.out.println("1.Filter构造器方法AdminFilter()");}

(2).init初始化方法

 public void init(FilterConfig filterConfig) throws ServletException {System.out.println("2.Filter的init(FilterConfig filterConfig)初始化");}

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

(3).doFilter过滤方法

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("3.Filter的doFilter()过滤方法");HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;HttpSession  session = httpServletRequest.getSession();Object user = session.getAttribute("user");//如果为null,说明还没登录if(user == null){servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);return;}else {//让程序继续往下访问用户的目标资源filterChain.doFilter(servletRequest,servletResponse);}}

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

(4).destroy销毁

 public void destroy() {System.out.println("4.Filter的destroy()销毁方法");}

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

4.FilterConfig类

基本介绍:

(1)见名知意,它是Filter过滤器的配置文件类
(2)Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,这里包含了Filter配置文件的配置信息

作用:获取Filter过滤器的配置内容(filter-name,init-param,ServletContext对象)

 public void init(FilterConfig filterConfig) throws ServletException {System.out.println("2.Filter的init(FilterConfig filterConfig)初始化");//1.获取Filter的名称filter-nameSystem.out.println("filter-name的值是: " + filterConfig.getFilterName());//2.获取Filter的初始化参数init-paramSystem.out.println("初始化参数username的值是: " + filterConfig.getInitParameter("username"));System.out.println("初始化参数url的值是: " + filterConfig.getInitParameter("url"));//3.获取ServletContext对象System.out.println(filterConfig.getServletContext());}

5.FilterChain过滤器链

FilterChain过滤器链(多个过滤器在一起工作)

在这里插入图片描述

  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter1 前置代码");filterChain.doFilter(servletRequest,servletResponse);System.out.println("Filter1 后置代码");}
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter2 前置代码");filterChain.doFilter(servletRequest,servletResponse);System.out.println("Filter2 后置代码");}
<filter><filter-name>Filter1</filter-name><filter-class>filter.Filter1</filter-class></filter><filter-mapping><filter-name>Filter1</filter-name><url-pattern>/target.jsp</url-pattern></filter-mapping><filter><filter-name>Filter2</filter-name><filter-class>filter.Filter2</filter-class></filter><filter-mapping><filter-name>Filter2</filter-name><url-pattern>/target.jsp</url-pattern></filter-mapping>

在这里插入图片描述
如果是下面这种情况:

  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter2 前置代码");//      filterChain.doFilter(servletRequest,servletResponse);//      System.out.println("Filter2 后置代码");}

那么最后的结果是:

在这里插入图片描述
如果是这种情况:

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter1 前置代码");// filterChain.doFilter(servletRequest,servletResponse);// System.out.println("Filter1 后置代码");}

那么结果就是:

在这里插入图片描述

注意:Filter1和Filter2的执行顺序,是根据web.xml里面的配置顺序有关

多个Filter过滤器执行的特点:

  • 所有filter目标资源默认都执行在同一个线程
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter1 前置代码");System.out.println("Filter1 线程: " + Thread.currentThread().getName());filterChain.doFilter(servletRequest,servletResponse);System.out.println("Filter1 线程: " + Thread.currentThread().getName());System.out.println("Filter1 后置代码");}
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter2 前置代码");System.out.println("Filter2 线程: " + Thread.currentThread().getName());filterChain.doFilter(servletRequest,servletResponse);System.out.println("Filter2 线程: " + Thread.currentThread().getName());System.out.println("Filter2 后置代码");}
<body>
<%System.out.println("target.jsp页面执行了");System.out.println("target.jsp 线程: " + Thread.currentThread().getName());
%>
</body>
  • 多个Filter共同执行的时候,它们都使用同一个Request对象
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter1 前置代码");System.out.println("Filter1 线程: " + Thread.currentThread().getName());servletRequest.setAttribute("key1","value1");filterChain.doFilter(servletRequest,servletResponse);System.out.println("Filter1 线程: " + Thread.currentThread().getName());System.out.println("Filter1 后置代码");}
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter2 前置代码");System.out.println("Filter2 线程: " + Thread.currentThread().getName());System.out.println("Filter2取Filter1中保存的数据: " + servletRequest.getAttribute("key1"));filterChain.doFilter(servletRequest,servletResponse);System.out.println("Filter2 线程: " + Thread.currentThread().getName());System.out.println("Filter2 后置代码");}

在这里插入图片描述

6.Filter的拦截路径

  • 精确匹配
 <url-pattern>/target.jsp</url-pattern>

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

  • 目录匹配
 <url-pattern>/admin/</url-pattern>

以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

  • 后缀名匹配
<url-pattern>*.html</url-pattern>

以上配置的路径,表示请求地址必须以.html结尾才会拦截到

这种匹配方式,后缀名可以自定义,Filter过滤器只关心请求的地址是否匹配,不关心请求的资源是否存在

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_39207.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MBA管理类联考英语二题型答题时间及次序问题

还有不到一个月时间&#xff0c;2023年MBA联考也进入到最后的收官阶段&#xff0c;这个阶段对于多数已经系统复习过的考生&#xff0c;一般需要进行通盘梳理备考&#xff0c;而不是专注于单个模块的复习。在做试卷或真题的过程中&#xff0c;如何才能更有利于分数这个问题需要大…

闲人闲谈PS之三十五——物资备货与提前采购

惯例闲话&#xff1a;又一年快过去了&#xff0c;回想刚刚开始在CSDN上写笔记&#xff0c;还是2年前的事情。闲人其实是一个拖延症十分严重的人&#xff0c;自从开始走上写作这条路之后&#xff0c;治疗拖延症找到了办法&#xff0c;每天总有一些事情让闲人去思考&#xff0c;然…

Miniconda:在pycharm的terminal中无法使用Conda命令

在pycharm的terminal中无法使用Conda命令 问题&#xff1a; 在本地下载好conda系列后&#xff0c;在pycharm的terminal中无法使用conda命令 问题分析&#xff1a; 说的很清楚了&#xff0c;是因为当前支持的shells没有初始化conda 所以我们只需要把Shell 路径改成激活cond…

如何制作一个微信小程序【微信小程序是怎么做的】

为什么现在这么多人使用微信小程序呢&#xff1f;因为微信小程序除了便捷易开发&#xff0c;公司企业可以用来做小程序展示官网&#xff0c;商家也可以做小程序商城&#xff0c;甚至个人也可以拥有自己的小程序。那么如何制作一个微信小程序&#xff1f;微信小程序是怎么做的呢…

基于微信小程序奶茶店在线点单管理系统ssm框架-计算机毕业设计

面对目前奶茶店林立的现状&#xff0c;大城市奶茶店多为连锁奶茶店他们都有统一的管理和相应的系统。但是个别小县城和小城以及城区也有不少的奶茶店多为自营&#xff0c;这就必须店长自己管理和采购原料。大型连锁的奶茶店管理系统就不适用于分散的小型奶茶店。小型奶茶店的管…

vue开发测评系统思路及踩坑

最近公司做了一个测评系统&#xff0c;因为时间很短&#xff0c;本以为会很简单&#xff0c;没有想到踩了很多坑。 先看下部分效果图吧 然后在说下需求 1&#xff1a;所有的答案都是动态的&#xff08;例如选择是出来的是第二题&#xff0c;选择否出来的是第五题&#xff09…

如何用蓝牙实现无线定位(二)--信号塔设置

1. 配置BLE4.0模块 根据三点定位原理&#xff0c;本项目需要使用3个信号塔。3个信号塔的主体均为BLE4.0模块&#xff0c;需要把BLE4.0模块的AT指令设置为“从设备”。 方法为&#xff1a; &#xff08;1&#xff09;给控制板刷一套空的程序。初始打开arduino IDE或新建&#x…

React+Electron快速创建并打包成桌面应用

一、创建react项目 首先使用creat-react-app脚手架来创建一个react项目 # 安装 create-react-app 命令,如果已将安装请忽略 npm install -g create-react-app # 创建 react项目 create-react-app react-electron # 启动项目( create-react-app 真的超级方便啊) cd react-elec…

【电力运维】浅谈电力通信与泛在电力物联网技术的应用与发展

摘要&#xff1a;随着我国社会经济的快速发展&#xff0c;我国科技实力得到了巨大的提升&#xff0c;当前互联网通信技术在社会中得到了广泛的应用。随着电力通信技术的快速发展与更新&#xff0c;泛在电力物联网建设成为电力通讯发展的重要方向。本文已泛在电力物联网系统为核…

医院用故障电弧探测器AAFD 安科瑞 时丽花

摘 要&#xff1a; 医院运行中对于用电方面的要求越来越高&#xff0c;为了更好地体现用电价值&#xff0c;首先应该确保用电的安全性&#xff0c;尤其是对 于越来越繁杂的医院用电系统。基于此&#xff0c;在未来医院用电过程中应该加大关注力度&#xff0c;切实做好相关管理工…

Mysql:sql去重的几种方式(大数据hive也可参考)

文章目录前言准备创建表测试数据目标探索distinct 去重group by 去重实现方案方案一方案二方案三前言 我们做数据分析的时候经常会遇到去重问题&#xff0c;下面总结 sql 去重的几种方式&#xff0c;后续如果还有再补充&#xff0c;大数据分析层面包括 hive、clickhouse 也可参…

Python——变量以及基础数据类型练习题

要求&#xff1a;注意变量名的命名规范问题&#xff01;&#xff01;&#xff01;不能再出现没有意义的变量名&#xff01;&#xff01;&#xff01;一行一注释&#xff0c;用下划线命名法。 请使用相对应的数据类型&#xff0c;不能全部使用字符串&#xff01;&#xff01;&a…

Codeforces Round #574 (Div. 2) C. Basketball Exercise

翻译&#xff1a; 最后&#xff0c;SIS已经开放了一个篮球场&#xff0c;所以Demid决定举办一个篮球训练课程。有2个⋅&#x1d45b;的学生参加了Demid的练习课&#xff0c;他将他们排成两排&#xff0c;大小相同(每排正好有&#x1d45b;人)。学生按从左到右的顺序&#xff0…

数字化门店| 美业/医美门店管理系统 | 医美小程序

近些年来&#xff0c;随着人们消费升级和颜值经济的不断驱动&#xff0c;美业发展非常迅速&#xff0c;而医美行业也顺势规模增长。 当今互联网时代&#xff0c;各行业都在开展门店数字化转型&#xff0c;而这也让不少医美医院愿意构建基于门店会员管理的O2O闭环&#xff0c;并…

Web进阶

目录 DOM节点操作&#xff08;上&#xff09; 一、任务目标 二、任务背景 三、任务内容 1、DOM结构及节点 DOM节点操作&#xff08;下&#xff09; 一、任务目标 二、任务背景 三、任务内容 1、DOM修改 DOM控制CSS样式 一、任务目标 二、任务背景 三、任务内容 …

element实现el-progress线形进度条渐变色

实现效果&#xff1a; 实现前&#xff1a; 网上查progress找到的方法都是环形进度条的&#xff0c;且实现得贼复杂&#xff0c;要么封装一个新组件要么修改一串svg&#xff0c;其实线形进度条改成渐变色的方法非常简单&#xff0c;直接在css上修改就行了&#xff1a; <div…

5-UI自动化-三大切换,iframe如何定位,窗口新开、alert弹窗如何进行元素定位

5-UI自动化-三大切换&#xff0c;iframe如何定位&#xff0c;窗口新开、alert弹窗如何进行元素定位新开一个窗口如何定位元素switch_to方法iframe定位元素alert弹窗如何定位元素上篇介绍4-UI自动化-selenium三大等待操作 web测试过程中有没有遇到以下问题&#xff1a; 1、测试…

使用 Hibernate Envers 进行实体审计

业务应用程序中的常见要求是在特定数据更改时存储版本控制信息;当某事发生变化时&#xff0c;谁改变了它&#xff0c;改变了什么。在这篇博文中&#xff0c;我们将介绍Hibernate Envers&#xff0c;它是Hibernate JPA库的一个组件&#xff0c;它为实体类提供了一个简单的审计/版…

期中考试【Verilog】

期中考试【Verilog】前言推荐期中考试一. 单选题&#xff08;共10题&#xff09;二. 填空题&#xff08;共5题&#xff09;三. 简答题&#xff08;共3题&#xff09;四. 其它&#xff08;共4题&#xff09;最后前言 编写于2022/11/30 13:30 以下内容源自Verilog期中试题 仅供…

GeoServer服务迁移出现 EncryptionOperationNotPossibleException 错误的解决方案

目录1.前言2.GeoServer服务迁移一般流程3.遇到问题4.原因分析5.解决办法6.根本原因分析7.总结1.前言 这几天我在迁移 GeoServer 服务的时候发现&#xff0c;报了一个错&#xff0c;EncryptionOperationNotPossibleException &#xff0c;这个错误的大概意思是加密操作不可用异常…