JAVAWEB技术之七过滤器

举报
tea_year 发表于 2021/12/22 23:52:54 2021/12/22
【摘要】 第七章 过滤器 JAVAWEB三大组件:Servlet、Filter、Listener 7.1 概念 7.1.1 描述 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。...

第七章 过滤器

JAVAWEB三大组件:Servlet、Filter、Listener

7.1 概念

7.1.1 描述

过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。

它可以让请求得到目标资源,也可以不让请求达到!

过滤器有拦截请求的能力!

过滤器是一个服务器端的组件,它可以拦截客户端的请求和响应信息,并对这些信息进行过滤。

Servlet API中提供了一个Filter接口,如果编写额类实现了这个接口,则称这个类为过滤器。Filter接口源码如下:

7.1.2 生命周期

7.2 应用场景

  • 自动登录
  • 统一设置编码格式
  • 访问权限控制
  • 敏感字符过滤等

7.3 快速上手

package javax.servlet;
import java.io.IOException;
public interface Filter {
    public void init(FilterConfig filterConfig) throws ServletException;
    public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
    public void destroy();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

init():初始化方法,创建之后马上执行,Filter会在服务器启动时创建!

destory():销毁方法,销毁之前执行!在服务器关闭的时候销毁!

doFilter(ServletRequest,ServletResponse,FilterChain):每次过滤的时候都会执行,重点就是执行过滤的方法。

如何上手:

1.写一个类实现Filter接口,这个和Servlet是一样的。

public class AFilter implements Filter {
    public void destroy() {
        System.out.println("销毁了");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("过滤...");
        //chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        System.out.println("初始化...");
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.在web.xml中进行配置;

<!--在web.xml配置Filter,和Servlet类似
    /:表示当前web目录,
    *:表示所有文件;
-->
<filter>
    <filter-name>AFilter</filter-name>
    <filter-class>com.tea.filter.AFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AFilter</filter-name>
    <url-pattern>/index.jsp</url-pattern>
    <!--*:过滤所有;
        /index.jsp:只过滤index.jsp页面。
		对于其他页面放行。
    -->
</filter-mapping>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

使用注解来创建Filter,这个是大家要掌握的知识点。

@WebFilter("/index.jsp")
public class TestFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

    }
    public void init(FilterConfig config) throws ServletException {

    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

常用配置项
urlPatterns
配置要拦截的资源

  1. 以指定资源匹配。例如"/index.jsp"
  2. 以目录匹配。例如"/servlet/*",这样就可以针对目录进行过滤。
  3. 以后缀名匹配,例如"*.jsp"
  4. 通配符,拦截所有web资源。"/*"

7.4 多个Filter的执行顺序

在我们的请求到达Servle之间是可以经过多个Filter的,一般来说,建议Filter之间不要有关联,各自处理各自的逻辑即可。这样,我们也无需关心执行顺序问题。
如果一定要确保执行顺序,就要对配置进行修改了,执行顺序如下

在web.xml中,filter执行顺序跟<filter-mapping>的顺序有关,先声明的先执行
使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行
如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter

  
 
  • 1
  • 2
  • 3

总结:

1.了解Filter的概念,作用

2.Servlet和Filter的区别(相同点和不同点)

3.了解如何使用web.xml来创建Filter,不用掌握

4.掌握使用WebFilter注解的方式来创建Filter

5.掌握过滤拦截资源的4种方式中:/* /*.jsp /xxx.jsp即可,使用能够创建案例即可。

7.5 案例展示

7.5.1 字符集编码过滤器

@WebFilter("/*")
public class EncodingFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

7.5.2 登录过滤器

URI和URL:

我们目前只需要根据/后的路径来判断即可,不用关注于WEB服务器的路径,所以目前只用URI即可。

package com.aaa.filter;

import com.aaa.entity.User;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;

/**
 * Created by 张晨光 on 2020/4/24 16:04
 * 过滤所有/*
 */
@WebFilter("/*")
public class LoginFilter implements Filter {
    public void destroy() {
    }

    //最简单的登录过滤的思路;
    //复习:过滤器里面参数:ServletRequest
    //HttpServletRequest:继承自ServletRequest
    //利用两个增加的方法:getRequestURI()  getRequestURL()
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.将ServletRequest转型为HttpServletRequest;
        HttpServletRequest request= (HttpServletRequest) req;
        //HttpServletResponse response= (HttpServletResponse) resp;
        //2.获取地址栏的资源路径;
        String uri = request.getRequestURI();
//        StringBuffer url = request.getRequestURL();
//
//        System.out.println(uri);
//        System.out.println("url:"+url);
        //3.判断一下资源路径是否是要登录的路径;
        //如果/后是login.jsp或者是loginServlet都可以放行;
        if(uri.contains("login.jsp")||uri.contains("loginServlet")){
            //放行,就去下一个过滤器;
            chain.doFilter(req,resp);
        }else{
            User user = (User) request.getSession().getAttribute("user");//一定要和loginServlet里面设置值的时候一致;
            //上面的代码不转换也可以Object user=...
            if(user!=null){  //就是已经登录了,继续放行;
                chain.doFilter(req,resp);
            }else{
                //1.大家如果需要用resp作一下重定向,则需要在上面加代码;
               // response.sendRedirect("login.jsp");
                //2.如果不想写1种方法的实现,则可以使用
                request.getRequestDispatcher("/login.jsp").forward(req,resp);
            }
        }

    }

    public void init(FilterConfig config) throws ServletException {

    }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/105735302

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。