零基础学JavaWeb开发(十三)之 过滤器和监听器

29 篇文章 2 订阅

十七、过滤器

1、过滤器应用场景

过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

应用场景: 判断用户是否登录、过滤器请求记录日志、身份验证、权限控制等。

什么是过滤器?拦截过滤请求

过滤器可以减少代码冗余性问题。

2、使用方式

package com.mayikt.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.LogRecord;

@WebFilter("/*")
public class MayiktFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Content-type", "text/html;utf-8");
        String userName = req.getParameter("userName");
        if (!"mayikt".equals(userName)) {
            PrintWriter writer = response.getWriter();
            writer.print("权限不足");
            writer.close();
            return;
        }
        //放行
        filterChain.doFilter(req, response);
    }
}
 

3、拦截器路径配置

1.所有资源拦截:@WebFilter("/*") //这是指访问所有资源的时候都会经过过滤器

静态资源(css/js/mp4)

2.具体资源路z径拦截:@WebFilter("/index.jsp") //这是指访问index.jsp的时候会经过过滤器

3.具体目录拦截:@WebFilter("/mayik/*") //这是指访问mayikt目录下的所有资源时会经过过滤器

127.0.0.1:8080/mayikt/A

127.0.0.1:8080/mayikt/B

4.具体后缀名拦截:@WebFilter("*.jsp") //这时指访问后缀名为.jsp的资源时会经过过滤器

4、过滤器链

我们过滤器1执行完毕之后 在执行过滤器2

注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序

5、使用过滤器验证会话信息

 需求:使用过滤器验证用户的会话信息,判断用户是否已经登录 如果 没有登录的话 则跳转到登录页面。排查“loginServlet、RegisterServlet”

package com.mayikt.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

@WebFilter("/*")// 过滤器所有的请求
public class UserSessionFilter implements Filter {
    private String[] excludeUrls = new String[]{"/login", "/register", "/VerifycodeServlet"};
    
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 从session获取到用户的会话信息 判断用户是否登录过
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
        // 定义一个数组 哪些 请求是需要排除的
        for (int i = 0; i < excludeUrls.length; i++) {
            String excludeUrl = "/mayikt_session_war_exploded" + excludeUrls[i];
            String requestURI = httpServletRequest.getRequestURI();
            if (excludeUrl.equals(requestURI)) {
                // 放行请求
                filterChain.doFilter(httpServletRequest, httpServletResponse);
                return;
            }
        }
        // 排除请求
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");
        if (user == null) {
            // 当前用户没有登录或者登录会话失效
            // 重定向到登录页面
            httpServletResponse.sendRedirect("/mayikt_session_war_exploded/login");
            return;
        }
        // 用户已经登录了 正常放行请求
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }
}

十八、获取当前上下文

request.contextPath();

十九、监听器

1. 监听器Listener就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

2. Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。

3. Listener实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等.

1.ServletContext监听

ServletContextListener:用于对Servlet整个上下文进行监听;

ServletContextAttributeListener:对Servlet上下文属性的监听。

2.Session监听

HttpSessionListener接口:对Session的整体状态的监听;

HttpSessionAttributeListener接口:对session的属性监听。

3.Request监听

ServletRequestListener:用于对Request请求进行监听;

ServletRequestAttributeListener:对Request属性的监听。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

出世&入世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值