MVC和Filter

目录

MVC和三层架构模型的联系

Filter

概念

作用

应用场景

步骤

简单入门

注解开发

Filter过滤器的生命周期

Filter的拦截路径

过滤链


MVC和三层架构模型的联系

m-->model即模型是三层架构模型的业务层(service)和持久层(dao)

v-->views即视图是三层架构模型的表现层(web)

c-->controller即控制器也是三层架构模型的表现层(web)

Filter

概念

Filter表示过滤器属于java.servlet.Filter接口类型,过滤器可以对访问的静态和动态资源进行过滤,既可以过滤请求,也可以过滤响应 

作用

1.拦截客户端对web资源的请求

        web资源

                静态:html,css,js,img

                动态:jsp,servlet

2.拦截web资源对客户端的响应 

应用场景

1.解决post请求中文乱码(全栈)

2.敏感字符过滤

3.登录权限进行校验 

步骤

1.自定义类实现Filter接口

2.在实现类实现接口的所有代码

3.在doFilter方法中书写过滤资源的代码

4.在web.xml中配置过滤器

5.访问被过滤的资源

简单入门

//自定义类实现Filter接口
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //不要调用父类的方法,否则会报错
        //Filter.super.init(filterConfig);
    }
    //在doFilter中书写拦截资源的代码
    //每次访问被过滤的资源都要执行该方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter...");
    }

    @Override
    public void destroy() {

    }
}

 在web.xml配置Filter

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

<!--    配置Filter-->
    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.hhh.filter.MyFilter</filter-class>
    </filter>
<!--    配置的是当前过滤器过滤的资源路径,表示Myfilter过滤器过滤demo1.html的请求和响应-->
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/demo1.html</url-pattern>
    </filter-mapping>
</web-app>

tomcat底层解析xml获取过滤类的全路径,使用反射技术调用Myfilter类中的无参构造方法创建对象,使用对象调用MyFilter类的doFilter方法

Class c=Class.forName("过滤类的全路径");

MyFilter f=c.newInstance();

f.doFilter(request,response); 

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>我是被过滤的</h1>
</body>
</html>

浏览器:

可以发现不显示前端的内容,因为已经被过滤

但是在控制台有结果

该怎么查看被过滤的资源呢

在doFilter中书写放行代码


import javax.servlet.*;
import java.io.IOException;
//自定义类实现Filter接口
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //不要调用父类的方法,否则会报错
        //Filter.super.init(filterConfig);
    }
    //在doFilter中书写拦截资源的代码
    //每次访问被过滤的资源都要执行该方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter...");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }

结果

注解开发

@WebFilter("/demo2.html")
public class myFilter1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    @Override
    public void destroy() {

    }
}

Filter过滤器的生命周期

1.当启动tomcat服务器的时候tomcat会调用过滤器类的无参构造方法创建过滤器类的对象

(Servlet是第一次访问servler类才创建对象)

2.然后使用过滤器类的对象调用Init方法进行初始化

3.每次访问被过滤的资源都会调用doFiter方法   实际开发中我们在此方法处理被过滤的资源逻辑

4.关闭tomcat服务器之后,使用过滤器对象调用destroy方法 

Filter的拦截路径

1.精准匹配

        用户访问指定的目标资源(demo1.html)时,过滤器进行拦截

2.目录匹配

        用户访问指定的目录时(/user/*)所有资源时 ,过滤器进行拦截

        只要浏览器访问路径以user开头的资源就会执行当前过滤器

3.后缀匹配

        用户访问指定的后缀名(*.html)所有资源时 ,过滤器进行拦截

        只要浏览器访问路径以html结尾的资源就会执行当前过滤器

        注意:这里不能加/

4.匹配所有

        用户访问该网站的所有资源(/*),过滤器进行拦截

        只要浏览器访问当前项目就会执行当前过滤器

在过滤器中,如果多个过滤器过滤同一个资源,那么就会执行所有过滤器

过滤链

就是多个过滤器过滤同一个资源时形成的一条链子

测试

 servlet资源

@WebServlet("/servlet1")
public class servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("servlet");
    }

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

过滤器

@WebFilter("/servlet1")
public class Afilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //your code..
        System.out.println("Afilter过滤器前");
        //放行
        filterChain.doFilter(request,response);

        System.out.println("Afilter过滤器后");

    }

    @Override
    public void destroy() {

    }
}
@WebFilter("/servlet1")
public class Bfilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //your code..
        System.out.println("Bfilter过滤器前");
        //放行
        filterChain.doFilter(request,response);

        System.out.println("Bfilter过滤器后");

    }

    @Override
    public void destroy() {

    }
}

在浏览器访问servlet1时

结果

Afilter过滤器前
Bfilter过滤器前
servlet
Bfilter过滤器后
Afilter过滤器后

可以看出,当A过滤器执行filterChain.doFilter(request,response);放行代码后 才能到过滤器B,

B过滤器执行filterChain.doFilter(request,response);请求的数据才会到servlet1,然后servlet响应数据会浏览器时,也要经过两次过滤器

总结

1.前提条件:当多个多滤器同一个包下过滤同一资源有以下规律(注解开发)

执行过滤器的顺序是过滤器类的字符升序

2.如果是xml配置方式,多个过滤器过滤同一个资源有以下规律

执行过滤器的顺序是在xml文件中出现的顺序

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落落落sss

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

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

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

打赏作者

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

抵扣说明:

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

余额充值