java中什么是过滤器_JAVAweb过滤器

2022-09-23 11:21:37 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

【扩展】 过滤器:Filter

概念:对目标资源的请求和响应进行过滤截取。在请求到达servlet之前,进行逻辑判断,判断是否放行到servlet;也可以在一个响应response到达客户端之前进行过滤,判断是否允许返回客户端。 场景: (用户授权的过滤器:判断用户是否有权限请求界面) (日志信息的过滤器:过滤用户在网站的所有请求,记录轨迹 ) (负责解码的过滤器:规定请求的解码方式)

备注:过滤器依赖于servlet,一个过滤器可以加在多个servlet上,(多个过滤器也可以加在一个servlet上)

使用Filter: (1)实现Javax.serlvet.Filter接口(对应servlet-api.jar)

代码语言:javascript复制
package java.filter;


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

/**
 * @explain:定义过滤器
 * @author:jimmy
 * @date:2018/12/13
 * @create by Intellij Idea
 */
public class MyFilter implements Filter {

    /**
     * 初始化
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {


    }

    /**
     * 过滤器拦截
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    /**
     * 销毁
     */
    @Override
    public void destroy() {

    }
}

(2)配置web.xml文件(配置文件中主要有两个点:1是定义你的filter,2是定义filter拦截的地址)

代码语言:javascript复制
 <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>java.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

doFilter()为核心方法,这里定义过滤拦截规则。

【扩展】listener监听器

概念: JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。 监听ServletContext对象的创建和销毁?

实现:ServletContextListener 接口,根据要求重写创建和销毁的方法。 具体代码:

代码语言:javascript复制
package java.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * @explain:监听ServletContent对象的创建和销毁
 * @author:jimmy
 * @date:2018/12/13
 * @create by Intellij Idea
 */
public class MyServletContextListener implements ServletContextListener {
    /**
     * 对象创建
     * @param sce
     */
    public  void contextInitialized(ServletContextEvent sce) {
    }
    /**
     * 对象销毁
     * @param sce
     */
    public  void contextDestroyed(ServletContextEvent sce) {
    }

}

web.xml中的配置

代码语言:javascript复制
    <!--========BY 星  IN IntelliJ IDEA 功能是: 注册对ServletContext对象创建和销毁的监听器==========-->
    <listener>
        <listener-class>java.listener.MyServletContextListener</listener-class>
    </listener>

HttpSession对象的创建和销毁的监听: 具体代码:实现HttpSessionListener ,重写对应方法

代码语言:javascript复制
package java.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @explain:HttpSeesion对象的创建和销毁监听
 * @author:jimmy
 * @date:2018/12/13
 * @create by Intellij Idea
 */
public class MyHttpSessionListener implements HttpSessionListener {


    /**
     * 对象创建
     * @param sessionEvent
     */
    @Override
    public void  sessionCreated(HttpSessionEvent sessionEvent){

    }

    /**
     * 对象销毁
     * @param sessionEvent
     */
    @Override
    public  void sessionDestroyed(HttpSessionEvent sessionEvent){

    }
}

web.xml中的配置:

代码语言:javascript复制
 <!--========BY 星  IN IntelliJ IDEA 功能是:注册对HttpSession对象创建和销毁的监听器 ==========-->
    <listener>
        <listener-class>java.listener.MyHttpSessionListener</listener-class>
    </listener>
    <!--========BY 星  IN IntelliJ IDEA 功能是: 配置HttpSession对象的销毁时机==========-->
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>

ServletRequest对象的创建和销毁监听?

代码语言:javascript复制
package java.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

/**
 * @explain:ServletRequest对象的创建和销毁监听
 * @author:jimmy
 * @date:2018/12/13
 * @create by Intellij Idea
 */
public class MyServletRequestListener implements ServletRequestListener {

    public void requestDestroyed(ServletRequestEvent sre) {
    }

    public void requestInitialized(ServletRequestEvent sre) {
    }
}

web.xml配置:

代码语言:javascript复制
    <!--========BY 星  IN IntelliJ IDEA 功能是: 注册对ServletRequest对象创建和销毁的监听器==========-->
    <listener>
        <listener-class>java.listener.MyServletRequestListener</listener-class>
    </listener>
【扩展】interceptor拦截器

概念: java中的拦截器是动态拦截action调用的对象。依赖于web框架,在springmvc中依赖于SpringMVC框架,在实现上基于Java的反射机制,属于AOP的一种应用,作用类似于过滤器,但是拦截器只能对Controller请求进行拦截,对其他的直接访问静态资源的请求无法拦截处理。

拦截器的使用 具体实现:实现HandlerInterceptor接口

代码语言:javascript复制
package java.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

/**
 * @explain:定义拦截器
 * @author:jimmy
 * @date:2018/12/13
 * @create by Intellij Idea
 */
public class MyInterceptor implements HandlerInterceptor {

//实现HandlerInterceptor中的默认方法
}

【HandlerInterceptor接口】

代码语言:javascript复制
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
    }
}

Spring 相关配置文件中配置拦截器: mvc:interceptors mvc:interceptor <mvc:mapping path=”/test.html”/> </mvc:interceptor> </mvc:interceptors>

如下图,容器是Tomcat,拦截器,过滤器,他们的关系结构

Java web项目的加载顺序。 web项目部署在服务器上,由客户端发起请求到部署服务器的监听端口,通过监听端口进入服务器,然后再有服务器将请求信息发送给web项目,加载web项目首先要读取web.xml文件,【web.xml中标签的读取顺序是: ““☞”“☞”“☞””,这里注意,跟这几个标签写的前后顺序没有太大的关系】,首先读取到的是和两个节点。

过滤器和拦截器的区别?

①:拦截器是基于java的反射机制,而过滤器基于函数回调。 ②:过滤器依赖于servlet容器,拦截器不依赖于servlet容器。 ③:拦截器只能对action请求起作用,而过滤器几乎对所有的请求都起作用。 ④:拦截器可以访问action上下文,值栈里的对象,而过滤器不能。 ⑤:在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。 ⑥:拦截器可以获取IOC容器中的各个bean,而过滤器就不行,(在拦截器里注入一个service,可以调用业务逻辑)。 ⑦:过滤器是在请求进入容器后,但进入servlert前进行预处理的。响应请求也是,在servlet处理结束后,返回给客户端前触发。而拦截器提供了三个方法支持(1)preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现); 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。 afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

书中的关于过滤器和拦截器的区别? (1)使用范围不同:Filter是Servlet规范规定的,只能用于web程序中。而拦截器既可以用于web程序,也可以用于Application、swing程序中。 (2)规范不同:Filter是在servlet规范中定义的,是Servlet容器支持的,而拦截器是在spring容器内的,是spring框架支持的。 (3)使用的资源不同:同其他的代码块一样,拦截器也是一个spring的组件,归spring管理,配置在spring文件中,因此能使用spring里的任何资源,独享。例如service对象、数据源、事务管理等,通过IOC注入到拦截器即可;而Filter不能。 (4)深度不同:Filter只在Servlet前后起作用。而拦截器能深入到方法前后、异常抛出前后等。因此拦截器的使用灵活性更大。所以在Spring为基础的构架的程序中,优先使用拦截器。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172400.html原文链接:https://javaforall.cn

0 人点赞