过滤器
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