过滤器与监听器

过滤器与监听器

本文是基于Windows 10系统环境,学习和使用基于java的过滤器与监听器:

  • Windows 10
  • MyEclipse 10

一、过滤器

(1) 过滤器出现的背景

  • 项目开发中,经常会涉及到重复代码的实现,如设置编码
  • 涉及到重复判断,如判断用户是否登陆

(2) 过滤器的定义

  • java过滤器能够对目标资源的请求和响应进行截取

(3) 过滤器的执行流程

  • 用户访问服务器
  • servlet的请求先进入过滤器,过滤器进行拦截和处理
  • 过滤器处理完后,再放行,此时到达servlet/jsp
  • servlet处理
  • servlet处理完,再回到过滤器,最后再由Tomcat服务器交给用户

(4) 过滤器的api

interface Filter  //过滤器核心接口
	void init(filterConfig)  //初始化方法,在服务器启动的时候执行
	void destroy()  //销毁实例之前调用
	void doFilter(request,response,filterChain)  //过滤器拦截的业务处理方法
interface FilterConfig //获取过滤器在web.xml中配置的初始化参数
interface FilterChain  //过滤器链参数,多个过滤器形成一个过滤器链
	void doFilter(request,response)  //执行下一个过滤器或者放行

(5) 对指定的请求进行过滤

  <!--
  	/* 1.表示过滤所有的请求 
   -->
  <filter-mapping>
  	<!-- filter内部名称 -->
  	<filter-name>DemoFilter</filter-name>
  	<!-- 拦截所有资源 -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>  	
  <!--
  	/* 2.表示过滤指定的index.jsp和list.jsp请求 
   -->
  <filter-mapping>
  	<!-- filter内部名称 -->
  	<filter-name>DemoFilter2</filter-name>
  	<!-- 拦截指定资源 -->
  	<url-pattern>/index.jsp</url-pattern>
  	<url-pattern>/list.jsp</url-pattern>
  </filter-mapping>  	
  <!--
  	/* 3.表示过滤指定servlet内部名称的请求 
   -->
  <filter-mapping>
  	<!-- filter内部名称 -->
  	<filter-name>DemoFilter</filter-name>
  	<!-- 拦截指定资源 -->
  	<servlet-name>IndexServlet</servlet-name>
  </filter-mapping>  
  <!--
  	/* 3.表示过滤指定类型的请求 
   -->
  <filter-mapping>
  	<!-- filter内部名称 -->
  	<filter-name>DemoFilter</filter-name>
  	<!-- 拦截指定类型的资源 -->
  	<url-pattern>/*</url-pattern>
  	<dispatcher>REQUEST</dispatcher> //过滤请求
  	<dispatcher>FORWARD</dispatcher> //过滤转发
  	<dispatcher>INCLUDE</dispatcher> //过滤包含的页面RequestDispatcher.include(/page.jsp)
  	<dispatcher>ERROR</dispatcher>   //过滤声明式异常信息
  </filter-mapping>  

(6) 自定义过滤器实例

  • 写一个java类,实现Filter接口
/**
 * DemoFilter.java
 */
package com.inspur.a_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;

/**
 * ClassName: DemoFilter
 * Function: TODO ADD FUNCTION
 * @author: xuzheng
 * date: 2019-5-9 上午9:18:46
 */
public class DemoFilter implements Filter {
	
	public DemoFilter(){
		System.out.println("创建过滤器实例");
	}
	
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("执行过滤器初始化方法");
		// 获取过滤器在web.xml中配置的参数
		String encoding = filterConfig.getInitParameter("encoding");
		System.out.println(encoding);
	}


	/*
	 * 过滤器业务处理方法,在请求到达servlet之前先进入此方法处理公用的业务逻辑操作
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("执行过滤器业务处理方法");
		
		chain.doFilter(request, response);
		System.out.println("servlet处理完成,又回到过滤器");
	}

	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("执行过滤器销毁方法");
	}
}
  • 写一个servlet类
package com.inspur.a_filter;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * ClassName: IndexServlet
 * Function: TODO ADD FUNCTION
 * @author: xuzheng
 * date: 2019-5-9 上午9:19:54
 */
public class IndexServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("处理用户请求开始。。。");
	}


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}
}
  • 配置过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <!-- 过滤器配置 -->
  <filter>
  	<!-- 初始化参数配置 -->
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  	<init-param>
  		<param-name>path</param-name>
  		<param-value>c:/..</param-value>
  	</init-param>
  	<filter-name>DemoFilter</filter-name>
  	<filter-class>com.inspur.a_filter.DemoFilter</filter-class>
  </filter>
  <filter-mapping>
  	<!-- filter内部名称 -->
  	<filter-name>DemoFilter</filter-name>
  	<!-- 拦截所有资源 -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>  	
  <!-- 第二个过滤器配置 -->
  <filter>
  	<filter-name>DemoFilter2</filter-name>
  	<filter-class>com.inspur.a_filter.DemoFilter2</filter-class>
  </filter>
  <filter-mapping>
  	<!-- filter内部名称 -->
  	<filter-name>DemoFilter2</filter-name>
  	<!-- 拦截所有资源 -->
  	<url-pattern>/*</url-pattern>

  </filter-mapping>
  <servlet>
    <servlet-name>IndexServlet</servlet-name>
    <servlet-class>com.inspur.a_filter.IndexServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>IndexServlet</servlet-name>
    <url-pattern>/IndexServlet</url-pattern>
  </servlet-mapping>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

(7) 过滤器:统一编码处理案例

(8) 过滤器:无效数据过滤案例

(9) 过滤器:登入权限判断案例

二、监听器

(1) 监听器的定义

  • 监听器主要是用来监听特定对象的创建、销毁以及属性的变化
  • 是一个实现特定接口的普通java类
  • java代码

(2) servlet中需要监听的类

  • request
  • session
  • servletContext

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值