Filter过滤器

前言

Filter过滤器的作用及其使用。

一、Filter过滤器

1、Filter概念

1)是什么?
Filter 是Java Web三大组件Servlet、Listener、Filter之一;是一种JavaEE规范,即一个接口。
2)有什么用?
顾名思义,其作用为过滤响应,拦截请求。
3)为什么拦截请求?
权限检查、事务管理等等都需要对请求进行拦截,进一步做一些判断。

2、基本思想

在这里插入图片描述

3、未登录不能操作购物车

package com.xhu.filter;

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

public class AdminFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //添加商品到购物车时请登录
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");
        //未登录将其重定向到登录节面
        if (user == null) {
            resp.sendRedirect(req.getContextPath() + "/pages/user/login.jsp");
        } else {
            //放行
            filterChain.doFilter(req, resp);
        }
    }

}

<!-- 为/cart配置监听器-->
    <filter>
        <filter-name>AdminFilter</filter-name>
        <filter-class>com.xhu.filter.AdminFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AdminFilter</filter-name>
        <url-pattern>/cart</url-pattern>
    </filter-mapping>

4、Filter生命周期

1)构造方法
2)init方法
注:第1、2步在web工程启动时就已经执行。
3)doFilter方法
注:每次拦截到相应请求才会执行
4)destroy方法
注:停止web工程时就会执行。

5、FilterConfig类

顾名思义,其为Filter的文件配置类,一旦Filter被创建,该配置类也会被创建,包含Filter的配置信息。
作用)
1)获取Filter的别名
2)获取在Filter中配置的init-param
3)获取ServletContext对象。

 <!-- 为/cart配置监听器-->
    <filter>
        <filter-name>AdminFilter</filter-name>
        <filter-class>com.xhu.filter.AdminFilter</filter-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>root</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>AdminFilter</filter-name>
        <url-pattern>/cart</url-pattern>
    </filter-mapping>
 @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //获取配置的FilterName
        System.out.println(filterConfig.getFilterName());
        //获取该Filter中配置的参数
        System.out.println(filterConfig.getInitParameter("username"));
        //获取该Filter中配置的所有参数名
        Iterator<String> stringIterator = filterConfig.getInitParameterNames().asIterator();
        while (stringIterator.hasNext()){
            System.out.println(stringIterator.next());
        }
        //获取Context对象
        System.out.println(filterConfig.getServletContext());
    }

在这里插入图片描述

5、FilterChain过滤器链

多个Filter中的doFilter()执行顺序。
在这里插入图片描述

注:拦截相同请求的Filter执行的优先顺序是由web.xml中从上到下的配置顺序。

6、Filter的拦截路径

A.精确匹配

<url-pattern>/cart</url-pattern>

'/'在服务端被解析为:http://ip:port/工程路径/,所以/cart被解析为http://ip:port/工程路径/cart。
请求的的资源路径必须和上面的地址完全一致才能够被Filter拦截。

B.目录匹配

<url-pattern>/cart/*</url-pattern>

除了服务端对’/‘的解析为上面的结果之外,这里的’*'表示通配符,/cart则表示一个目录。所以只要请求cart目录下的所有资源都会被拦截。

C.后缀名匹配

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

综上的解释,这种匹配只拦截请求工程目录下的HTML文件时才进行拦截。

<url-pattern>*.do</url-pattern>
<url-pattern>*.action</url-pattern>
<url-pattern>*.self-definition</url-pattern>

注:该种匹配不能以’/'开头来写拦截路径。

总结

1)Filter的作用以及用法。

参考文献

[1] JavaWeb 尚硅谷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值