当前位置:网站首页>Filter and Listener
Filter and Listener
2022-08-05 19:02:00 【night_du】
Filter过滤器
定义
sun公司制定的一种规范,用于处理拦截Servlet的请求并处理通用的逻辑
定义过滤器
- 定义java类,实现Filter接口:使用javax.servlet.*包
- 重写抽象方法:init、doFilter、destory
- 配置过滤器:最好回链,给下一个过滤器使用
流程

优先级
- 当多个filter作用在web组件上,过滤器调用的顺序与web.xml文件中的filter-mapping配置的顺序有关
- 如果是注解,优先级与类名的字符顺序有关
优点
- 灵活,可“插拔性”较好,当需要新增或者减少一个功能时,通过配置快速实现,而且不会影响之前的功能
- 当多个web组件有相同的逻辑需要实现时,可以使用filter处理共同的逻辑,便于后期扩展与维护
注解
@WebFilter("/comment/*") //过滤一种servlet
@WebFilter(urlPatterns = {
"*.admin", "*.userInfo"}) //过滤多种servlet
基本使用
package servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/filter/showServlet")
public class showServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("老污龟");
}
}
package filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/filter/*")
public class CharacterEncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器初始化创建");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//设置编码方式
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
response.setContentType("text/html");
System.out.println("执行前");
chain.doFilter(request, response);
System.out.println("执行后");
}
public void destroy() {
System.out.println("过滤器销毁");
}
}
不使用注解,web.xml配置
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/filter/*</url-pattern>
</filter-mapping>
练习
需求
写一个CommentFilter2,判断评论内容的长度是否超过20,如果超过,输出内容过长,反之,继续调用后续的组件
代码实现
package filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/comment/*")
public class LengthFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String comment = servletRequest.getParameter("comment");
if (comment.length() > 20) {
servletResponse.getWriter().write("评论内容超长");
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
监听器
定义
sun公司制定的个特殊的类,用来监听容器中产生的一些事件并做相应的处理
两类事件:
- 第一类:与生命周期相关的事件,比如容器中创建或者销毁了request,session,servletContext对象可以进行监听
- 第二类:绑定事件,比如调用了request/session/servletContext三个对象的setAttribute(),removeAttribute()方法
定义监听器
- 定义java类,实现特定的接口
- 重写方法
- 配置监听器
案例
需求
监听当前页面在线人数
代码实现
package listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineCountListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
Integer onlineCount = (Integer) context.getAttribute("onlineCount");
if (onlineCount == null) {
onlineCount = 1;
} else {
onlineCount++;
}
context.setAttribute("onlineCount", onlineCount);
}
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
//se.getSession().invalidate();//销毁
Integer onlineCount = (Integer) context.getAttribute("onlineCount");
if (onlineCount == null) {
onlineCount = 0;
} else {
onlineCount--;
}
context.setAttribute("onlineCount", onlineCount);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>当前有<span><%=this.getServletConfig().getServletContext().getAttribute("onlineCount")%></span> 人在线</h1>
</body>
</html>
边栏推荐
- From the sequence with the sequence structure binary tree traversal sequence
- “拨”取数字的典例:N位水仙花数判断及水仙花数变种
- Js基本运用
- 数据中台建设(十一):数据中台解决方案参考与未来发展方向
- ArcGIS Pro脚本工具(11)——修改图层唯一值符号的标注
- 分布事务和分布式锁
- 让live-templet活起来
- 防火墙的目标地址转换和源地址转换
- Firewall destination address translation and source address translation
- 国标视频云服务EasyGBS如何正确调阅实时录像接口?
猜你喜欢

2.报表平台相关组件预研(1)----jimuReport

LVS load balancing cluster

云渲染平台是互联网和云计算的发展产物
![[ACTF2020 Freshman Competition]Upload 1](/img/88/53fcd59b15bc0f79741534de6c37bb.png)
[ACTF2020 Freshman Competition]Upload 1

2022年下半年软件设计师知识集锦

让你的「文件传输助手」歇一歇吧,你完全有更实用的备忘录工具选择

别再用QQ的破数字邮箱了,你其实还有注册姓名全拼微软邮箱的机会

【CC3200AI 实验教程3】疯壳·AI语音人脸识别(会议记录仪/人脸打卡机)-CC3200简介

Master the technology of Dachang in one class Commission and reflection

【学术相关】最新整理!绝对不能错过的130个学术网站和26个科研工具
随机推荐
知识点滴 - ODBC和ADO的区别
智慧物流:ZETag云标签如何做到快递包裹防拆防盗?
NOKOV度量动作捕捉协助完成无人机室内定位研究
Kettle需求场景复现
Knowledge Collection of Software Designers in the Second Half of 2022
一建证书有什么用?拿到一级建造师证书能干什么?
[ACTF2020 新生赛]Upload 1
【Connection reset原因分析和解决方案】
为什么企业需要使用 Wiki 工具?
Master the technology of Dachang in one class Commission and reflection
数据泄露溯源
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
别再用QQ的破数字邮箱了,你其实还有注册姓名全拼微软邮箱的机会
mysql操作、约束、索引
文盘Rust -- 配置文件解析
数据库 GUI 工具 CH Visualize 新 UI 布局抢先看
Win11开机提示音要怎么改?
在过道里阅读
【教程1】疯壳·ARM功能手机-开发板上电教程
最出名的那些日历APP,结果一点都不够好用...