JavaEE基础(05):过滤器、监听器、拦截器,应用详解
本文源码:GitHub·点这里 || GitEE·点这里
一、Listener监听器
1、概念简介
JavaWeb三大组件:Servlet,Listener,Filter。监听器就是指在应用程序中监听相关对象状态变化的组件。
2、事件源对象
指被监听对象。
- ServletContext
ServletContextListener
生命周期监听,它有两个方法,出生时调用contextInitialized()
,销毁时调用contextDestroyed()
;
ServletContextAttributeListener
属性监听,它有三个方法,添加属性attributeAdded()
,替换属性attributeReplaced()
,移除属性时attributeRemoved()
。
- HttpSession
HttpSessionListener
生命周期监听:它有两个方法,出生时调用sessionCreated()
,销毁时调用sessionDestroyed()
;
HttpSessioniAttributeListener
属性监听:它有三个方法,添加属性attributeAdded()
,替换属性attributeReplaced()
,移除属性attributeRemoved()
。
- ServletRequest
ServletRequestListener
生命周期监听:它有两个方法,出生时调用requestInitialized()
,销毁时调用requestDestroyed()
;
ServletRequestAttributeListener
属性监听:它有三个方法,添加属性attributeAdded()
,替换属性attributeReplaced()
,移除属性attributeRemoved()
。
3、编码案例
- 相关监听器
TheContextListener
public class TheContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("初始化:TheContextListener");
ServletContext servletContext = servletContextEvent.getServletContext() ;
servletContext.setAttribute("author","cicada");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("销毁:TheContextListener");
}
}
TheRequestListener
public class TheRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("初始化:TheRequestListener");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("销毁:TheRequestListener");
}
}
TheSessionListener
public class TheSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("初始化:TheSessionListener");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("销毁:TheSessionListener");
}
}
RequestAttributeListener
public class RequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent evt) {
System.out.println("Request添加属性:"+evt.getName()+";"+evt.getValue());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent evt) {
System.out.println("Request移除属性:"+evt.getName()+";"+evt.getValue());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent evt) {
System.out.println("Request替换属性:"+evt.getName()+";"+evt.getValue());
}
}
- web.xml配置文件
<!-- 监听器相关配置 -->
<listener>
<listener-class>com.node05.servlet.listener.TheContextListener</listener-class>
</listener>
<listener>
<listener-class>com.node05.servlet.listener.TheSessionListener</listener-class>
</listener>
<listener>
<listener-class>com.node05.servlet.listener.TheRequestListener</listener-class>
</listener>
<listener>
<listener-class>com.node05.servlet.listener.RequestAttributeListener</listener-class>
</listener>
<session-config>
<!-- 设置session失效时间为1分钟 -->
<session-timeout>1</session-timeout>
</session-config>
- 测试接口
public class ListenerServletImpl extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 1、获取TheContextListener初始化数据
ServletContext servletContext = this.getServletContext() ;
String author = String.valueOf(servletContext.getAttribute("author")) ;
System.out.println("TheContextListener Author:"+author);
// 2、Request属性设置
request.setAttribute("mood","smile");
request.setAttribute("mood","agitated");
// 3、Session创建,1分钟失效,调用销毁
HttpSession session = request.getSession(true) ;
session.setAttribute("casually","casually");
response.getWriter().print("Hello:Listener");
}
}
二、Filter过滤器
1、过滤器简介
客户端请求Servlet时,先执行相关Filter,如果Filter通过,则继承执行请求的Servlet;如果Filter不通过,则不会执行用户请求的Servlet。过滤器可以动态地拦截请求和响应。
2、Filter接口
Filter接口定义了三个核心方法。
- init()
应用程序启动时,服务器实例化Filter对象,并调用其init方法,读取web.xml配置,完成对象的初始化加载。
- doFilter()
实际的过滤操作,请求达到服务器时,Servlet容器将先调用过滤器的doFilter方法。
- destroy()
容器在销毁过滤器前调用该方法,释放过滤器占用的资源。
3、编码案例
- 编写过滤器
public class ThePrintLogFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String myName = filterConfig.getInitParameter("myName") ;
System.out.println("myName:"+myName);
}
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest ;
HttpServletResponse response = (HttpServletResponse)servletResponse ;
String name = request.getParameter("name") ;
if (!name.equals("cicada")){
response.getWriter().print("User Error !");
return ;
}
chain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("ThePrintLogFilter destroy()");
}
}
- web.xml配置文件
<!-- 过滤器相关配置 -->
<filter>
<filter-name>thePrintLogFilter</filter-name>
<filter-class>com.node05.servlet.filter.ThePrintLogFilter</filter-class>
<init-param>
<param-name>myName</param-name>
<param-value>cicada</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>thePrintLogFilter</filter-name>
<url-pattern>/filterServletImpl</url-pattern>
</filter-mapping>
- 测试接口
public class FilterServletImpl extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("Hello:Filter");
}
}
三、Interceptor拦截器
Spring框架中的拦截器Interceptor类似于Servlet中的过滤器Filter,主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。请求转发不执行拦截、过滤;重定向执行拦截和过滤。
---END---

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
getty 又双叒叕更新啦,一个长得有点像netty的网络框架
getty 又双叒叕更新啦!!! 本次更新主要是添加了UDP的支持。。。 getty是基于java nio(俗称nio1)封装了UDP,借助getty本身的架构设计,getty udp的性能表现也非常不错 基于getty良好的设计模式,getty udp的使用方式与tcp差别不大。 唯一的区别就是需要指定socketChannel为UDP。默认不指定是TCP 需要指定UDP的消息编解码器 //对于UDP而言,只有DatagramPacketEncoder、DatagramPacketDecoder两个处理器是有效的 //原因在于UDP本身不存在连接,因而其他处理器即使配置了也是没有效果的 defaultChannelPipeline.addLast(new DatagramPacketEncoder()); defaultChannelPipeline.addLast(new DatagramPacketDecoder()); //服务器端 AioServerStarter server = new AioServerStarter(8888); //唯一的区...
-
下一篇
C语言编程风格!风格决定Bug
关于C语言的编程风格,不同的书上有不同的推荐,不同的公司有不同的要求。做了一下基本规范说明。 1、变量定义 在定义变量时,前缀使用变量的类型,之后使用表现变量用途的英文单词或单词缩写,且每个单词或缩写的首字母大写,各种前缀缩写如下: ◑无符号变量使用 u8,u16,u32;例:unsigned char u8Temp; ◑有符号变量使用 s8,s16,s32;例:char s8Temp; ◑浮点数变量使用 f32,d64;例:float f32Temp; ◑结构体变量使用 st;例:struct Temp stTemp; ◑字符串变量使用 s;例:char sTemp; ◑数组变量使用 a;例:unsigned char aTemp[10]; ◑指针变量使用 p;例:unsigned char *pTemp; ◑枚举变量使用 e;例:enum Temp eTemp; 2、宏定义 对于宏定义使用大写+下划线的方式。 define ERROR_POWEROFF -1 想要成为一个优秀的、有能力程序员,做软件开发的话,就来学习C/C++吧,而且学习编程的话有一个学习的氛围跟交流圈子特别重要!...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,8上快速安装Gitea,搭建Git服务器