Java学习--过滤器与监听器

一:过滤器(Filter)

       当需要限制用户访问某些资源或者在处理请求时提前处理某些资源的时候,就可以使用过滤器Filter完成。
       过滤器是以一种组件的形式绑定到WEB应用程序当中的,与其他的WEB应用程序组件不同的是,过滤器是采用了“链”的方式进行处理的。

1.  实现过滤器

在Servlet中,如果要定义一个过滤器,则直接让一个类实现javax.servlet.Filter接口即可,此接口定义了三个操作方法:

public   void   init(FilterConfig filterConfig) throws ServletException

public   void   doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws                                   IOException,ServletException

public void destroy()

注意:过滤器是在容器启动时自动加载的

*******

FilterChain接口的主要作用是将用户的请求向下传递:

public void doFilter(ServletRequest request, ServletResponse response) throws IOException,ServletException

*******

eg:

package org.afanti.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter{
    private String encode;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("EncodingFilter初始化了...");
        this.encode=filterConfig.getInitParameter("encode");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("进入EncodingFilter的doFilter...");
        request.setCharacterEncoding(encode);   // 设置请求编码
        chain.doFilter(request, response);// “放行”
        System.out.println("将要离开EncodingFilter的doFilter...");
    }
    @Override
    public void destroy() {
        System.out.println("EncodingFilter销毁了...");
    }
}

2.  Filter的配置方式

方式一:
    注解配置
    @WebFilter(filterName="",urlPatterns={"/images/*"},
     initParams={
     @WebInitParam(name="fruit",value="grape")
     })
方式二:   web.xml中配置

3.  过滤器的过滤路径配置类型

路径类型一:以目录的方式配置过滤路径:  eg: /images/*

路径类型二:以资源类型的方式配置过滤路径:    eg:  *.jpg

注意:   不能将两种路径类型的配置结合起来,否则Web容器启动时发生错误。

4.  过滤器的应用
(1)编码过滤  :    在过滤器中设置编码
(2)登录验证  :    在过滤器中判断session属性是否为空,从而进行登录验证

二:监听器(Listener)

在WEB中可以对application、session、request三种操作进行监听。
Servlet监听器分为三种:
    ServletContext监听器(容器监听器)
    HttpSession监听器(会话监听器)
    ServletRequest监听器(请求监听器)

*****Servlet监听器的配置方式

 方式一: 注解配置: @WebListener

 方式二: web.xml中配置:
   <listener>
      <listener-class>监听器路径</listener-class>

   </listener>*****

1.  ServletContext监听器

(1).对Web容器状态(生命周期)的监听
    实现ServletContextListener接口,覆写相关方法
补充:ServletContextEvent代表容器状态的事件类,里面有个getServletContext()方法
(2).对ServletContext属性范围的监听
       实现ServletContextAttributeListener接口,覆写相关方法

2.  HttpSession监听器(对会话进行监听)

(1).对会话状态(生命周期)进行监听
      实现HttpSessionListener接口,覆写相关方法
(2).对会话(HttpSession)属性范围进行监听
      实现HttpSessionAttributeListener接口,覆写相关方法
(3).对会话(HttpSession)属性范围进行监听———使用HttpSessionBindingListener接口
     实现HttpSessionBindingListener接口,覆写相关方法
    实现了HttpSessionBindingListener接口的类,将该类的对象在会话属性范围绑定和解绑属性时,会自动调用        valueBound(xxx)方法和valueUnbound(xxx)方法。
特别注意:使用HttpSessionBindingListener接口实现会话属性监听时,不用注册!

eg:

add.jsp

<%@ page import="session.SessionBindingListener"%>
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>session属性设置值</title>
</head>
<body>
   <%
       session.setAttribute("sessionInfo","会话范围的属性值");
       SessionBindingListener sb=new SessionBindingListener();
       session.setAttribute("bindingInfo",sb);
   %>
</body>
</html>

package session;
import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionBindingListener;

// 实现了HttpSessionBindingListener接口的监听器,用来监听session范围的属性,该监听器不用注册!
public class SessionBindingListener implements HttpSessionBindingListener{
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        String name=event.getName();   // 获取属性名
        Object value=event.getValue();   // 获取属性值
        System.out.println("绑定(bound)session属性了,属性名是:"+name+";属性值是:"+value);  
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        String name=event.getName();   // 获取属性名
        Object value=event.getValue();   // 获取属性值
        System.out.println("解绑(unbound)session(remove)属性了,属性名是:"+name+";属性值是:"+value);
    }

}


3.ServletRequest监听器(请求监听器)

   (1).对请求状态(生命周期)进行监听
          实现ServletRequestListener接口,覆写相关方法
   (2).对请求范围的属性进行监听
         实现ServletRequestAttributeListener接口,覆写相关方法
















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值