栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

过滤器&监听器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

过滤器&监听器

过滤器 java web的三种组件

过滤器的基本概念 过滤器介绍


过滤器检查是否带红包,带红包方可进场参加婚礼,否则禁止入内

过滤器使用场景

编写第一个过滤器


Demo1Filter

package com.itheima.filter;

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


@WebFilter("/demo1")    //demo1不是访问地址而是拦截地址,如果访问的资源经过demo1,那么就进行过滤
public class Demo1Filter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        System.out.println("过滤器请求时候执行");
        chain.doFilter(req,resp);
        System.out.println("过滤器响应时候执行");
    }

    @Override
    public void destroy() {

    }
}

Demo1Servlet

package com.itheima.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;
import java.io.PrintWriter;

@WebServlet("/demo1")
public class Demo1Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();
        //在浏览器输出
        out.println("到达web资源,访问servlet");

        //同时也在服务器的控制台输出
        System.out.println("到达web资源,访问servlet");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

服务器端&浏览器端输出结果

过滤器的执行流程

过滤器的生命周期


Servlet是在用户第一次访问的时候创建
过滤器实在服务器启动时候创建
例如:上学路口拦妹子

FilterConfig接口

案例练习

package com.itheima.filter;

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


public class Demo2ConfigFilter implements Filter {
    
    public void init(FilterConfig config) throws ServletException {
        //读取init-param的参数名和参数值
        //通过名字获取一个值
        String encoding = config.getInitParameter("encoding");
        System.out.println("编码是:"+encoding);
        //获取所有参数的名字
        Enumeration parameterNames = config.getInitParameterNames();
        //遍历所有的参数名字
        while (parameterNames.hasMoreElements()){
            //获取参数名
            String name = parameterNames.nextElement();
            //获取值
            String value = config.getInitParameter(name);
            //打印
            System.out.println("参数名:"+name+",值是:"+value);
        }
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        System.out.println("过滤器请求时候执行");
        chain.doFilter(request, response);
        System.out.println("过滤器响应时候执行");
    }

    public void destroy() {

    }
}

web.xml



    
    
        
        demo2
        
        com.itheima.filter.Demo2ConfigFilter

        
            encoding
            GBK
        
        
            country
            China
        
    



    
    
        
        demo2
        
        /demo1
    

映射的访问路径

 
三种拦截方式 
过滤器的拦截行为 

过滤多个地址

匹配多个路径:路径是一个字符串的数组,所以可以同时指定多个路径
  • 注解的属性:
  •  value:可以省略:    @WebFilter(value={"/demo1","/demo2"})
    
  •  urlPatterns:与value的功能是一样的:URLPatterns={"/demo1","/demo2"}
    
  •  filterName:过滤器的名字,不能出现相同的名字
    
  •      1.DispatcherType.FORWARD 拦截服务器的转发
    
  •          dispatcherTypes = DispatcherType.FORWARD
    
  •      2.DispatcherType.REQUEST 拦截浏览器的请求和服务器的转发
    
  •          dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST}
    
  •      3.DispatcherType.INCLUDE 拦截服务器的包含
    
注解的方式拦截
  • filterName:过滤器的名字,不能出现相同的名字
  •      1.DispatcherType.FORWARD 拦截服务器的转发
    
  •          dispatcherTypes = DispatcherType.FORWARD
    
  •      2.DispatcherType.REQUEST 拦截浏览器的请求和服务器的转发
    
  •          dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST}
    
  •      3.DispatcherType.INCLUDE 拦截服务器的包含
    
配置方式拦截


    
    demo2
    
    /demo1
    
    INCLUDE
    FORWARD
    REQUEST

过滤器案例 使用过滤器过滤全局汉字乱码的问题


login.html




    
    登录 


登录名:

register.html




    
    用户注册


用户注册

注册名:

CharacterEncodingFilter

package com.itheima.servlet;

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

@WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = "/*")
public class CharacterEncodingFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        //指定编码utf-8
        request.setCharacterEncoding("utf-8");
        //必须放行
        chain.doFilter(request, response);
    }

    public void destroy() {
    }
}

LoginServlet

package com.itheima.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;
import java.io.PrintWriter;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户提交的参数
        String user =request.getParameter("user");
        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();
        out.println("登录成功,用户名是:"+user);

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

RegisterServlet

package com.itheima.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;
import java.io.PrintWriter;

@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户提交的参数
        String name =request.getParameter("name");
        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();
        out.println("注册成功:"+name);

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

用户权限的过滤

分析


项目布局

login.jsp(登录页面)

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022-05-10
  Time: 0:06
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    用户登录


用户名:
密码:
${msg}

LoginServlet

package com.itheima.controller;

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

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户输入的账户和密码
        String user = request.getParameter("user");
        String pass = request.getParameter("pass");
        //判断账户密码是否正确
        if("NewBoy".equals(user)&&"1234".equals(pass)){
            //密码正确,创建会话域
            HttpSession session = request.getSession();
            //创建会话域对象
            session.setAttribute("user",user);
            //重定向到添加页面
            response.sendRedirect(request.getContextPath()+"/admin/add.jsp");

        }else {
            //密码不正确,向请求域中存信息
            request.setAttribute("msg","账户或者密码错误");
            //转发到登录页面
            request.getRequestDispatcher(request.getContextPath()+"login.jsp").forward(request,response);
        }

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

list.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022-05-10
  Time: 0:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    显示用户列表


显示用户列表

登录或者未登录都可以访问

add.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022-05-10
  Time: 0:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    添加


添加用户

必须登录后才可以访问 退出

update.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022-05-10
  Time: 0:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    修改


修改用户

必须登录后才可以访问

https://blog.csdn.net/anyi2351033836/article/details/logout.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022-05-10
  Time: 0:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    退出


<%
    //销毁会话
    session.invalidate();
%>

您已成功退出

重新登陆
案例:过滤敏感词汇


过滤链FilterChain的使用 FilterChain介绍

案例:过滤器链


注解的方式:

多个过滤器过滤同一个访问地址

如果使用注解的方式配置过滤器,按类名的字母的顺序来确定先后顺序	
配置的方式

多个过滤器过滤同一个访问地址

按照配置文件的先后顺序来
小结


监听器 监听器的概述

ServletContextListener监听器

注解的方式创建上下文域监听器

配置的方式监听上下文域


只需要写类名即可

区分使用

总结写的类使用注解,引用第三方工具类的使用配置.

ServletContextAttributeListener监听器


写的是修改前的数据

小结

案例:统计网站当前在线人数

案例分析


CounterListener


count.jsp

https://blog.csdn.net/anyi2351033836/article/details/logout.jsp

总结 能够说出过滤器的作用

能够编写过滤器

能够说出过滤器生命周期的相关方法

能够通过路径判断指定的过滤器是否起作用

常用的拦截方式

能够说出什么过滤器链

监听器

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874722.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号