过滤器&监听器

1.过滤器(Filter)

过滤器(拦截器)是拦截请求(Request)的对象,可动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息;一个过滤器可以过滤N个请求

作用:

  • 在客户端的请求访问后端资源之前,拦截这些请求
  • 在服务器的响应发送回客户端之前,处理这些响应

1.1:Servlet 过滤器方法

过滤器实现了 javax.servlet.Filter 接口,javax.servlet.Filter 接口定义了三个方法:

序号方法 & 描述
1public void doFilter (ServletRequest, ServletResponse, FilterChain)
请求被过滤器拦截,当客户端的请求与过滤器设置的 URL 匹配时,Servlet 容器将先调用过滤器的 doFilter 方法。FilterChain 用于访问后续过滤器。
2public void init(FilterConfig filterConfig)
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
3public void destroy()
Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。

1.2: web.xml 文件配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>jsp_filter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <!-- 配置过滤器 -->
   <filter>
   	<filter-name>myFilter</filter-name>
   	<filter-class>com.zking.filer.MyFilter</filter-class>
   	<!-- 配置过滤器的初始化参数 -->
   	<!-- 参数一 -->
   	<init-param>
   		<!-- 参数名 -->
   		<param-name>name</param-name>
   		<!-- 参数值 -->
   		<param-value>张三</param-value>
   	</init-param>
   	
<!--参数二 -->
   	<init-param>
   		 <!-- 参数名 -->
   		<param-name>sex</param-name>
   		<!-- 参数值 -->
   		<param-value>男</param-value>
   	</init-param>
   </filter>
   <filter-mapping>
   	<filter-name>myFilter</filter-name>
	<!-- 设置过滤器要被过滤的请求 -->
   	<!-- 过滤单个请求:过滤访问index1.jsp的请求 -->
   	<url-pattern>/index1.jsp</url-pattern>
   	<url-pattern>/index2.jsp</url-pattern>
   	
  	<!-- 过滤指定后缀名的请求 -->
   	<!-- 所有请求 只要是以.jsp结尾的都会被 过滤 -->
   	<url-pattern>*.jsp</url-pattern>
<!--过滤所有以.do结尾的;该处后缀名可随便写,可过滤整个项目里后缀名为.do的请求 -->
   	<url-pattern>*.do</url-pattern>
<!--    过滤指定目录的请求 -->
   <url-pattern>/home/index.jsp</url-pattern>
<!--   过滤项目里的所有请求/包括所有后缀 -->
  <url-pattern>/*</url-pattern>
   </filter-mapping> 
</web-app>

1.3:编码设置&登录验证

package com.zking.filer;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//配置过滤单个请求
/*@WebFilter("/index.jsp")*/
//配置过滤多个请求
//@WebFilter("/index.jsp")
//配置多个请求
@WebFilter(
		filterName="myFilter",//配置过滤器的名字,等同于:<filter-name>myFilter</filter-name>
		//urlPatterns= {"index.jsp","index2.jsp"},//配置过滤多个页面
		urlPatterns= {"/*"},//过滤所有页面
		//配置初始化参数
		initParams= {
				@WebInitParam(name="name",value="张三"),
				@WebInitParam(name="sex",value="男")
		}
	)
public class MyFilter implements Filter{
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		//System.out.println("过滤器被销毁");
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		//System.out.println("请求被过滤器拦截");
		//转换参数类型:arg0和arg1
		 HttpServletRequest req=(HttpServletRequest)arg0;
		 HttpServletResponse resp=(HttpServletResponse)arg1;
		
		 //设置编码
		 resp.setContentType("text/html;charset=utf-8");
		 req.setCharacterEncoding("utf-8");
		 
		//获取out内置对象
			PrintWriter out=resp.getWriter();
		 //访问登录页面的请求不被过滤
		//获取过滤器所连接的请求到底是什么请求?
			String uriPath=req.getRequestURI();
			//System.out.println("请求地址:"+uriPath);
			//indexOf("要查找的字符串")如果找不到返回-1
		if(uriPath.indexOf("login.jsp")!=-1) {//>-1或!=-1都可,找到了,则意味着该请求是访问login.jsp
			//继续前进
			arg2.doFilter(arg0, arg1);
			return;
		}  
		
		if(uriPath.indexOf("register.jsp")>-1) {//>-1或!=-1都可,找到了,则意味着该请求是访问register.jsp
			//继续前进
			arg2.doFilter(arg0, arg1);
			return;
		}  
			
		//登录验证 
		 //获取session
		 HttpSession session=req.getSession();
		 //获取session里面保存的name
		Object name= session.getAttribute("name");
		if(null!=name) {//已经登录
			//继续前进
			arg2.doFilter(arg0, arg1);
		}else {//没登录
			 out.print("<script>alert('请先登录!');location.href='login.jsp'</script>");
		}
		
		//放行/继续前进*****
		arg2.doFilter(arg0, arg1);
		    
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		//启动Tomcat服务
	//	System.out.println("过滤器初始化/过滤器被创建!");
		
		//获取配置的初始化参数
//		 String name=arg0.getInitParameter("name");
//		 String sex=arg0.getInitParameter("sex");
//		 System.out.println(name);
//		 System.out.println(sex);
	
	}
}

2.监听器(listener

监听器(不需要配置,但是监听器仍需要进行注册)就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

2.1:Servlet监听器分为三大类

  • 数据域对象创建和销毁监听器
  • 数据域对象和属性变更监听器
  • 绑定到 HttpSession 域中的某个对象的状态的事件监听器

2.2:配置监听器

//方法一
  <listenner>
      <listenner-class>地址 </listenner-class>
  </listenner>

//方法二
@WebSevlet("")

2.3:方法

public class MyListener implements HttpSessionListener{

	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		System.out.println("应用程序初始化");
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		System.out.println("应用程序被销毁");
		
	}

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值