web核心 8-filter过滤器 listener监听器 相对路径 绝对路径 项目名路径

内容介绍

1.Filter过滤器
2.listener监听器  

Filter过滤器

在这里插入图片描述

概述

web服务器端有三大技术:Servlet Filter Listener

Servlet:本质上是一个类,这个类需要实现Servlet接口规范
作用:可以做浏览器和服务器之间的交互请求和响应
Filter:本质上是一个类,这个类需要实现Filter接口规范
作用:对浏览器访问服务器资源时的一种拦截,符合条件才放行  不符合条件不放行访问资源
资源:项目里面的资源 比如:Servlet html jsp  js jpg...

作用

主要作用:拦截浏览器访问服务器的请求的

ps:也会拦响应,但是企业主要用于拦请求

filter的使用

1 xml配置文件方式(掌握)

创建一个java类,实现filter的接口
在web.xml中配置filter要拦截的资源

在这里插入图片描述
在这里插入图片描述

2 注解配置方式(了解)

在自定义的filter类上添加注解:
@WebFilter(urlPatterns = "/sd1")

在这里插入图片描述

filter的细节

1.filter不是对所有资源都拦截,需要拦截哪些资源都需要配置filter
2.如果多个filter都对同一个资源拦截,那多个filter都会执行
		配置文件中:多个filter的执行顺序是web.xml的上下配置顺序
  		注解中:    执行的顺序是按照filter文件名的自然排序顺序  
3.如果filter放行,找的是看看有没有下一个过滤器执行,如果没有下一个过滤器才会执行服务器的资源  		

在这里插入图片描述
Filter的执行流程:(了解)

在这里插入图片描述

filter的生命周期(了解)

从filter的出生到filter的死亡 有3个方法伴随:init() destory() dofilter()
服务器启动创建filter对象执行init方法
浏览器访问到了匹配到的资源 执行dofilter方法 访问一次执行一次
当服务器关闭的时候 执行destory方法 销毁当前filter
关注点:doFilter核心过滤方法

在这里插入图片描述

filter生命周期方法中参数(了解)

在这里插入图片描述

方法:init(FilterConfig config)
参数:filterConfig 当前filter的配置对象
作用

1 可以获取到当前filter的名称   getFilterName()
2 可以获取到ServletContext对象 getServletContext()

方法:doFilter(ServletRequest req, ServletResponse resp, FilterChain filterchain)
参数:request response filterchain
作用
1.request response之前怎么用 在filter中还怎么用
2.FilterChain:过滤器链对象 作用:维护过滤器的执行顺序的 核心放行方法: chain.dofilter(req,res)

Filter的配置

1.filter的资源路径配置(面试题)
有3种方式来配置filter的拦截路径

1.完全路径匹配: 以/开始  例如:/sd1  /a/b/c/sd1   匹配单一资源的匹配 
	     注意:<url-pattern>标签可以出现多个
2.目录匹配:以/开始 以*结尾  例如:/*   /a/b/*     匹配目录下的所有资源 
3.扩展名匹配:不以/开始 以.结尾  例如:*.jsp  *.jpg  *.html  匹配一类资源的

在这里插入图片描述

2.filter的拦截方式配置
默认:filter只拦截浏览器过来的请求 不拦截服务器内部的请求(请求转发)
配置filter拦截服务器内部的请求
在这里插入图片描述
在这里插入图片描述

 // 请求转发request.getRequestDispatcher("/sd4").forward(request,response);
 // 重定向response.sendRedirect(request.getContextPath()+"/sd4");

在这里插入图片描述

xml方式配置
在<filter-mapping>的标签中添加标签<dispatcher>FORWARD</dispatcher>
但是这种配置将filter默认的拦截方式给覆盖了 只会拦截服务器内部的请求 不会再拦截默认的浏览器请求了
想让filter拦截服务器内部的请求又拦截浏览器过来的请求:
<filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
</filter-mapping>

在这里插入图片描述

注解方式配置
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
该注解配置filter既会拦截浏览器过来的请求 又会拦截服务器内部的请求
//为servlt统一处理请求和响应的中文乱码
public class EncodeFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}
// xml方式(掌握)   注解方式(了解)
/*
* xml方式:
*       1 创建1个类实现filter接口(javax包下的)
*       2 在web.xml中配置该filter要拦截的资源是谁
*
* */

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

//@WebFilter(urlPatterns = "/sd1")
public class MyFilter1 implements Filter{


    /*
    * 执行时机:服务器启动创建该Filter执行init方法
    * 执行次数:1次
    * 执行者:tomcat
    *
    * */
    @Override  //filter的初始化方法
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("我出生了...555");
        //filterConfig:是当前filter的配置对象
                //1 可以获取当前filter的名字
        System.out.println(filterConfig.getFilterName());
        //2 获取域对象(ServletContext对象)
        System.out.println(filterConfig.getServletContext());
    }

    /*
     * 执行时机:拦截住了匹配的资源就执行
     * 执行次数:访问一次 执行一次
     * 执行者:tomcat
     *
     * */
    @Override //核心拦截方法
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter1拦截了...");
        // filter默认都是拦截的 如果想不拦截资源了,要手动放行
        // 核心放行方法
       filterChain.doFilter(servletRequest,servletResponse);
    }

    /*
     * 执行时机:服务器关闭执行
     * 执行次数:1次
     * 执行者:tomcat
     *
     * */
    @Override // filter的销毁方法
    public void destroy() {
        System.out.println("我凉凉了...666666666");
    }
}
//过滤器:
public class FeifaFilter implements Filter{

    private List<String> list=new ArrayList();

    @Override // 服务器启动就执行一次
    public void init(FilterConfig filterConfig) throws ServletException {

        try {
            // 2 当要判断的时候,需要加载该文档,读取内容
            String realPath = filterConfig.getServletContext().getRealPath("feifa.txt");
            File file = new File(realPath);
            InputStreamReader is = new InputStreamReader(new FileInputStream(file),"utf-8");
            BufferedReader br=new BufferedReader(is);
            // 3 将读取的非法字符放入一个容器中(list)
            String line=null;
            while ((line=br.readLine())!=null){
                // 放入集合中
                list.add(line);
            }

            System.out.println(list);

        }catch (Exception e){
            e.printStackTrace();
        }

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 1 获取用户发表的言论
        String info = servletRequest.getParameter("info");
        // 2 判断该言论是否合法
                        //1 数据库中哟一个非法字符表
                        // 2 非法字符的收集文档.txt
                                  // 1 创建一个非法字符的文档,收集非法字符
                                  // 4 将用户的输入内容和容器中的内容做对比 如果非法:写响应  不非法:放行
        if(info!=null&&list.contains(info)){
            // 3 不合法--写响应信息
            servletResponse.getWriter().print("你发表的言论不和谐,请重新输入...");
            return;
        }
        // 4 合法--放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

总结filter

filter概述:本质上是一个类,实现了filter接口规范
fitler作用:可以对浏览器访问服务器的请求进行拦截
filter的快速入门:xml方式 注解方式
xml方式:1 创建1个类型实现filter接口 2 在web.xml中进行拦截资源的配置
注解方式:直接在当前的filter类上添加注解 @webFilter(url-pattern="路径")
filter细节
1 filter不是对所有资源都拦截,需要拦截哪个要创建且配置
2 多个filter拦截了同一个资源,多个filter都执行
3 filter放行之后,会找下一个filter执行,直到没有filter了才会去找资源
filter的生命周期
服务器一启动就会创建当前的filter对象执行init方法
当访问到要匹配的资源时,filter的dofilter核心拦截方法执行 访问一次执行那一次
当服务器关闭的时候,filter的destory销毁方法执行
filter拦截方式
filter默认只对浏览器的请求进行拦截 不对服务器的内部跳转请求进行拦截
如果想配置可以在web.xml中进行配置
<filter-mapping>
        <filter-name>MyFilter2</filter-name>
        <url-pattern>/*</url-pattern>
        <!--让当前filter拦截内部的请求转发-->
        <dispatcher>FORWARD</dispatcher>
        <!--让当前filter拦截浏览器过来的请求-->
        <dispatcher>REQUEST</dispatcher>
</filter-mapping>
filter路径配置方式:三种(面试题)
1 完全路径匹配 例如:/sd1 /sd2  针对单一资源的 但是<url-pattern>可以写多分
2 目录匹配 例如: /*   /a/b/*  针对指定目录下的所有资源的
3 扩展名匹配  例如: *.jsp  *.html  针对一种类型的所有资源的

案例一:统一解决所有servlet的乱码问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

案例二:非法字符的过滤
页面
在这里插入图片描述
拦截器拦截

在这里插入图片描述

package cn.itcast.filter;

import javax.servlet.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

//过滤器:
public class FeifaFilter implements Filter{

    private List<String> list=new ArrayList();

    @Override // 服务器启动就执行一次
    public void init(FilterConfig filterConfig) throws ServletException {

        try {
            // 2 当要判断的时候,需要加载该文档,读取内容
            String realPath = filterConfig.getServletContext().getRealPath("feifa.txt");
            File file = new File(realPath);
            InputStreamReader is = new InputStreamReader(new FileInputStream(file),"utf-8");
            BufferedReader br=new BufferedReader(is);
            // 3 将读取的非法字符放入一个容器中(list)
            String line=null;k

            while ((line=br.readLine())!=null){
                // 放入集合中
                list.add(line);
            }

            System.out.println(list);

        }catch (Exception e){
            e.printStackTrace();
        }

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 1 获取用户发表的言论
        String info = servletRequest.getParameter("info");
        // 2 判断该言论是否合法
                        //1 数据库中哟一个非法字符表
                        // 2 非法字符的收集文档.txt
                                  // 1 创建一个非法字符的文档,收集非法字符
                                  // 4 将用户的输入内容和容器中的内容做对比 如果非法:写响应  不非法:放行
        if(info!=null&&list.contains(info)){
            // 3 不合法--写响应信息
            servletResponse.getWriter().print("你发表的言论不和谐,请重新输入...");
            return;
        }
        // 4 合法--放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

listener–监听器

概述

listener:本质上是一个类,需要实现监听器的接口

作用

监听器可以去监听到域对象的状态变化(ServletContext request session)

状态变化:创建和销毁

提供的监听器:

ServletContextListener: 监听ServletContext创建和销毁(掌握)

ServletRequestListener: 监听request 创建和销毁

HttpSessionListener: 监听session创建和销毁

listener的使用

java提供了各种各样的监听器,每个监听器都有自己的作用

1.ServletContextListener监听器:监听ServletContext对象的创建和销毁的(掌握)

listener监听器的创建

xml方式:(掌握)
1 创建一个java类,实现java提供的指定监听器的接口
2 在web.xml中进行配置

注解方式: 
在编写的listener类上加上注解  @WebListener
// 成为一个能监听到ServletContext对象的创建和销毁的监听器
//@WebListener
public class Mylistener1 implements ServletContextListener{

    @Override  //监听创建   ServletContext对象已创建此方法触发
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //System.out.println("ServletContext对象创建了...");
        System.out.println("服务器一启动就去加载框架的一些配置信息..");
    }

    @Override   // 监听销毁  ServletContext对象已销毁此方法触发
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象销毁了...");
    }
}

在这里插入图片描述
xml方式:
在这里插入图片描述
注解方式:
在这里插入图片描述

扩展一: 用监听器监听request的创建和销毁:

在这里插入图片描述
在这里插入图片描述
因此,请求一次,创建一个request对象,响应回去,request对象销毁。

用监听器监听request的创建和销毁:
在这里插入图片描述

在一个新的会话中,第一次访问到request.getSession()中,创建session对象,几个servlet共用的是一个session对象,会话关闭,重新访问,又是新的session对象。

扩展二: 服务器端servlet的路径问题:

相对路径(不建议用),绝对路径

在这里插入图片描述

<%--
  Created by IntelliJ IDEA.
  User: muzimoo
  Date: 2019-5-9
  Time: 18:19
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>访问servlet</title>
</head>
<body>
        <a href="/day07/sd1">访问sd1</a><br/>

        <a href="../../../sd1">访问sd1</a><br/>

        <%--
        服务器端Servlet的路径问题:绝对路径  相对路径
        绝对路径:当前浏览器访问servlet的路径   http://localhost:8080/day07/sd1
        简写: 以/项目名开始的   /day07/sd1

        相对路径:以./开始   ./sd1==sd1
            相对比较的是地址栏路径
            demo.jsp:  http://localhost:8080/day07/demo.jsp
            sd1:       http://localhost:8080/day07/sd1

            demo.jsp:  http://localhost:8080/day07/html/demo.jsp
            sd1:       http://localhost:8080/day07/sd1
            ../:代表到上一层路径

            demo.jsp: http://localhost:8080/day07/html/1/2/demojsp
             sd1:     http://localhost:8080/day07/sd1

             ../../../sd1
        --%>


</body>
</html>

扩展三: 将servlet的创建时机提前到服务器开启

servlet的生命周期 默认情况下是,当浏览器访问servlet时,创建该servlet对象,执行init方法,且执行一次。
也可以在服务器启动时,创建servlet对象。
在这里插入图片描述

在这里插入图片描述

扩展四:获取当前项目名路径

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 IntelliJ IDEA 创建动态 Web 项目并添加过滤器监听器进行用户权限验证的步骤: 1. 打开 IntelliJ IDEA,选择 “Create New Project”。 2. 在左侧菜单栏中选择 “Java Enterprise”。 3. 在右侧窗口中选择 “Web Application”。 4. 输入项目称,选择项目路径,然后点击下一步。 5. 在 “Web Application” 设置中,选择 “Server” 和 “Version”,然后点击下一步。 6. 在 “Java EE” 设置中,选择 “Java EE 7” 或更高版本,然后点击下一步。 7. 在 “Project Structure” 设置中,选择 “Web” 模块,然后点击下一步。 8. 在 “Framework” 设置中,选择 “Spring MVC” 或其他适合你的框架,并点击完成。 现在你已经创建了一个动态 Web 项目。下面是如何添加过滤器监听器进行用户权限验证的步骤: 1. 在项目中创建一个为 “AuthFilter” 的 Java 类,继承自 javax.servlet.Filter 接口。该类的作用是验证用户是否有权限访问某个页面或资源。在 doFilter() 方法中实现验证逻辑。如果用户有权限访问,就继续执行过滤器链;否则,返回错误页面或跳转到登录页面。 ``` public class AuthFilter 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() { // 销毁过滤器 } } ``` 2. 在项目中创建一个为 “AuthListener” 的 Java 类,实现 javax.servlet.ServletContextListener 接口。该类的作用是在项目启动时加载用户权限数据并保存到 ServletContext 中。在 contextInitialized() 方法中实现加载逻辑。加载完成后,将用户权限数据保存到 ServletContext 中。 ``` public class AuthListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { // 加载用户权限数据并保存到 ServletContext 中 } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { // 在项目关闭时清理资源 } } ``` 3. 在 web.xml 文件中添加过滤器监听器的配置。在 <web-app> 标签下添加以下代码: ``` <filter> <filter-name>AuthFilter</filter-name> <filter-class>com.example.AuthFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>com.example.AuthListener</listener-class> </listener> ``` 现在你已经完成了用户权限验证功能的添加。在 AuthFilter 类中,你可以实现具体的用户权限验证逻辑。在 AuthListener 类中,你可以加载用户权限数据并保存到 ServletContext 中。这样,你就可以在整个项目中方便地获取用户权限数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值