Servlet(4)----------过滤器和监听器

过滤器

1、servlet过滤器用于拦截客户端浏览器与目标资源的请求,并对这些请求进行一定的过滤处理在发给目标资源。(用户请求和服务器响应都要经过滤器),当经过多个过滤器的时候,这时候就形成了一个过滤器链。

在实际开发中,定义过滤器对象只需要直接或者间接的实现Filter接口即可。

Filter接口有三个方法:init()、doFilter()、destroy()

主要应用:实现强制登陆,编码格式等;

实现编码过滤:

package com.ems.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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

//同配置web.xml一样(这里配置过了,web.xml不需要配置)
@WebFilter(filterName="/encodeFilter",urlPatterns={"/*"},
initParams={@WebInitParam(name="encode",value="UTF-8")})
public class EncodeFilter implements Filter{

	@Override
	public void destroy() {
        //销毁过滤器
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding(ENCODE);   //请求设为指定编码
		response.setCharacterEncoding(ENCODE);
		response.setContentType("text/html");
		chain.doFilter(request, response);		
	}
	private String ENCODE; //私有变量,定义编码格式
	@Override
	public void init(FilterConfig config) throws ServletException {
		ENCODE = config.getInitParameter("encode"); //初始化
	}
	
}

过滤器实现统计网站访问人数

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
    <h2>欢迎光临本站,访问量:<%=application.getAttribute("count") %></h2>
  </body>
</html>

CountFilter.java

package filter;

import java.io.IOException;

import javax.jws.soap.InitParam;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
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.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;

@WebFilter(filterName="filter",urlPatterns="/index.jsp",initParams={
		@WebInitParam(name="count",value="5000")
})
public class CountFilter implements Filter{
	//定义一个来访数量
	private int count;
	@Override
	public void destroy() {
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		count++;
		//将ServletRequest转成HttpServletRequest
		HttpServletRequest req = (HttpServletRequest)request;
		//获取ServletContext
		ServletContext context = req.getSession().getServletContext();
		//将访问数量值放入到servletContext中
		context.setAttribute("count", count);
		//向下传递过滤器
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		String param = config.getInitParameter("count");
		count = Integer.valueOf(param);
		
	}
	
}

监听器

监听器的作用是监听web容器中的有效事件,可以监听由于web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。

Servlet上下文监听

实现监听ServletContext对象创建、删除和修改操作,需要实现ServletContextListener接口(主要监听ServletContext的创建和删除)、ServletAttributeListener接口(主要监听ServletContext的属性的增加、删除、和修改)

HTTP会话监听

有四个接口:HttpSessionListener接口(接口实现监听HTTP会话的创建、销毁)、HttpSessionActivationListener接口(监听http会话active和passivate)、HttpBindingListener接口(实现会话中的信息绑定)、HttpSessionAttributeListener接口(实现会话中属性的设置请求)

Servlet请求监听

实现ServletRequestListener接口,监听用户的请求。

实例:监听器统计在线人数;

https://blog.csdn.net/qq_36115651/article/details/80043065



猜你喜欢

转载自blog.csdn.net/qq_36115651/article/details/80043081