JavaWeb组件 -filter过滤器,listener监听器

JavaWeb组件 -filter过滤器,listener监听器

filter过滤器

定义和概念

过滤器:过滤器是JavaWeb又一核心组件。在JavaWeb中过滤的作用可分为三类:1.在请求到达服务器资源之前对请求进行拦截过滤。2.放行服务器响应结果或者资源。3.对请求到达Servlet处理之前进行拦截预处理,对Servlet进响应到浏览器数据时进行拦截处理。简单来说过滤器就是进行请求拦截,响应放行 和前后位置的数据处理,这个处理可以是servlet中的一些重复代码,比如编码问题,这在spring mvc 中就得到很好的体现。通过过滤器的特点,我们还可以用来进行后台API接口的权限管理操作,比如spring security就是利用过滤器链的方式来实现,认证和授权的权限管理。spring Session的共享会话(session 存储到redis,实现分布式情况下的session会话)。 过滤器的功能有点类似AOP切面编程,把重复的操作提取出来做成前后通知,把我们的servlet当成一个切面,实现方法增强。

过滤器的实现

实现过滤器的方式比较简单,我们只需要实现Filter接口中的方法。

public class FirstFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //前置处理:编码问题,修改域对象中的信息,请求转发,重定向...
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        //过滤器传递(过滤器链)-责任链设计模式 或 直接进入servlet进行请求处理
        filterChain.doFilter(servletRequest, servletResponse);
        //后置处理 执行完servlet响应后的处理
    }

    @Override
    public void destroy() {

    }
}

在实现过滤器是 doFilter方法是过滤器的核心,在这个方法中我们进行过滤器核心代码的编写。doFilter有三个参数,其中有我们熟悉的 request,response还有一个较为陌生的filterchain参数,前两个参数不用说了,有了前两个参数,我们的过滤器就可以轻易的拦截过滤请求响应,修改域中数据 和修改编码等重复代码问题。filterchain 也是一个接口,具体的实现也是右具体的服务器提供者实现,然后基于接口动态代理。dilterchain中定义了dofilter 方法,它是用来放行我们拦截过滤成功的请求到下一个过滤器(过滤器链) 或直接进入servlet进行数据处理。

过滤器配置
xml
<!--过滤器配置,过滤器要配置在servlet之后,过滤器链按照filet先后顺序进行过滤-->
    <filter>
        <filter-name>BaseFilter</filter-name>
        <filter-class>com.stack.filter.FirstFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>BaseFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
注解 web3.0
@WebFilter(filterName = "/twoFilter",urlPatterns = "/*")
public class TwoFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //前置处理:编码问题,修改域对象中的信息,请求转发,重定向...
        servletRequest.setCharacterEncoding("utf-8");
        //过滤器传递(过滤器链)-责任链设计模式 或 直接进入servlet进行请求处理
        filterChain.doFilter(servletRequest, servletResponse);
        //后置处理:编码问题,修改域对象中的信息,请求转发,重定向...
        servletResponse.setContentType("text/html;charset=utf-8");
    }

    @Override
    public void destroy() {

    }

}

基于注解在实现过滤器链是无法指定先后顺序,所以在实现过滤器链是还需使用xml支持

listener 监听器

定义与概念

listener:监听器作为JavaWeb又一核心组件,它被分为三类:生命周期监听器,属性监听器和session对象监听器。它们主要用来监听ServletContext,ServletRequest(HttpServerletRequest的上层接口),HttpSession于对象。监听器的主要功能就是实现域对象创建,销毁,

属性的变化(域中数据变化),session的活化与钝化。这里解释一下session的活化与钝化:Session的钝化指的是将内存中Session信息写到服务器本地文件文中,活化是指将服务器本地文件中的Session再次读回到内存。默认Tomcat在session在指定时间内没有使用时钝化到内存来节省内存,当session被使用时加载到内存。具体的使用需要对tomcat的server.xml进行配置。监听器主要用于进行监听进行日志记录。监听器常用的是前两类,通过前两类监听器可以来实现我们web应用的日志记录。

过滤器具体分类:ServletContextListener, HttpSessionListener,ServletRequestListener(不常用)(生命周期监听)

​ ServletContextAttributeListener, HttpSessionAttributeListener,ServletRequestAttributeListener-(不常用)(属性监听)

​ HttpSessionBindingListener,HttpSessionActivationListener(session监听器)不常用

过滤器的实现
public class FirstListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("应用创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("应用销毁");
    }
}
过滤器配置
xml
<!--监听器配置-->
    <listener>
        <listener-class>com.stack.listener.FirstListener</listener-class>
    </listener>
注解 web3.0
@WebListener
public class TwoListener implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println(httpSessionBindingEvent.getName()+"属性添加");
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println(httpSessionBindingEvent.getName()+"属性移除");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println(httpSessionBindingEvent.getName()+"属性替换");
    }
}

扩展推荐

session的活化与钝化:https://blog.csdn.net/cccmercy/article/details/80457926

web3.0的变化:https://developer.ibm.com/zh/articles/j-lo-servlet30/#major3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值