Java Web - 服务器中的过滤器和监听器
一 过滤器
每个servlet都有自己需要处理的资源,这么多的资源我们有时候我们希望统一的进行管理,比如对响应的图片进行加水印处理,对提交和响应的数据的编码进行统一,或者是对提交的数据进行过滤。
解决的办法就是使用过滤器,他的目的是对服务器和浏览器之间交互的资源进行管理和保护servlet安全(一定程度上)。他的角色就像是服务器与浏览器之间的桥梁。它是由服务器调用执行的。
1.1 使用过滤器
1. 实现Filter接口
2. 覆写接口方法
public class MyFilter implements Filter {//启动即执行,进行资源初始化@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("MyFilterinit!!");}//请求发送执行,进行资源管理@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilteredoFilterExit!!");//放行,这里如果不放行,请求就不会被servlet处理filterChain.doFilter(servletRequest, servletResponse);System.out.println("MyFilterdoFilterReturn!!");}//服务器关闭执行,对资源进行关闭@Overridepublic void destroy() {System.out.println("MyFilterdestroy!!");}
}
3. 在web.xml中配置过滤器
<filter><filter-name>myFilter</filter-name><filter-class>com.chester.web.servlet.MyFilter</filter-class>
</filter>
<filter-mapping><filter-name>myFilter</filter-name><!--/*代表对所有项目根目录的请求都过滤--><url-pattern>/*</url-pattern>
</filter-mapping>
这里的 <url-pattern>
有很灵活的写法,根据项目需求来写即可,这里再给出几个例子
<!--拦截所有以.do结尾的请求,一般进行的是模块拦截-->
<url-pattern>*.do</url-pattern>
<!--拦截指定url请求,针对某个servlet的请求进行拦截,保护servlet-->
<url-pattern>/ts</url-pattern>
在执行一个过滤器之后,如果还有符合要求的过滤器,则再执行符合要求的过滤器,执行完doFilter方法中filterChain.doFilter()方法后,继续执行doFilter中接下来的代码。
1.2 案例
下面我们来看看几个具体的使用场景,我们只关注关键代码部分。代码设置了接收和发送的编码格式,以及实现对session的管理,如果session失效,则要求用户重新登陆。
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//编码格式设置servletRequest.setCharacterEncoding("utf-8");servletResponse.setContentType("text/html;charset=utf-8");//session管理,HttpSession hs = ((HttpServletRequest)servletRequest).getSession();if(hs.getAttribute("user") == null){((HttpServletResponse)servletResponse).sendRedirect("/JavaWebTest/login.jsp");}else{//放行filterChain.doFilter(servletRequest, servletResponse);}
}
二 监听器
上面我们使用了过滤器对资源进行统一的管理,但是有的时候,我们需要知道数据流转的具体过程,比如作用域对象是什么时候创建和销毁的,作用域对象中的数据是什么时候存取,改变和删除的。以此来进行一些处理,比如如果统计网站的在线人数,我们就需要知道session是什么时候销毁和创建的。创建在线人数+1,销毁则-1。通过监听器就可以完成这样的功能。
2.1 使用监听器
监听器可以监听request、session、application的创建销毁和内容的改变,下面
2.1.1 监听request对象
创建ServletRequestListener的实现类
public class MyListener implements ServletRequestListener, ServletRequestAttributeListener{//监听作用域创建于销毁 继承 ServletRequestListener//作用域销毁时调用public void requestDestroyed(ServletRequestEvent sre) {sre.getServletRequest();System.out.println("MyListenerDestroyed");}//作用域创建时调用public void requestInitialized(ServletRequestEvent sre) {System.out.println("MyListenerInitialized");}//监听作用域数据修改 继承 ServletRequestAttributeListener//数据增加时调用public void attributeAdded(ServletRequestAttributeEvent srae) {System.out.println("request 中增加了-" + srae.getName() + ":" +srae.getValue());}//数据删除时调用public void attributeRemoved(ServletRequestAttributeEvent srae) {System.out.println("request 中删除了-" + srae.getName() + ":" +srae.getValue());}//数据修改时调用public void attributeReplaced(ServletRequestAttributeEvent srae) {System.out.println("request 中改变了-" + srae.getName() + ":" +srae.getValue());}
}
在web.xml中配置监听器
<!--配置监听器-->
<listener><listener-class>com.chester.web.servlet.MyListener</listener-class>
</listener>
2.1.2 监听session对象
和request一样,继承HttpSessionListener,HttpSessionAttributeListener
2.1.3 监听application对象
一样,继承ServletContextListener, ServletContextAttributeListener
2.2 监听器使用案例
该案例在application对象中使用count这个键维护网站的登陆人数,你可以在适当的地方进行取用。
public class MyListener implements HttpSessionListener, ServletContextListener{//当一个session建立的时候,说明有用户进行了登陆count++public void sessionCreated(HttpSessionEvent se) {ServletContext sc = se.getSession().getServletContext();int count = (int)sc.getAttribute("count");sc.setAttribute("count", ++count);}//当一个session销毁的时候,说明有用户进行了退出count--public void sessionDestroyed(HttpSessionEvent se) {ServletContext sc = se.getSession().getServletContext();int count = (int)sc.getAttribute("count");sc.setAttribute("count", --count);}//application对象建立时,初始化count为0public void contextInitialized(ServletContextEvent sce) {//获取applicationServletContext sc = sce.getServletContext();sc.setAttribute("count", 0);}
}
Java Web - 服务器中的过滤器和监听器相关推荐
- javaweb中服务器响应,Java Web服务器响应与JSON
我想创建一个简单的Java Web应用程序响应GET请求/用JSON字符串测试.Java Web服务器响应与JSON 我的环境是Java,Intellij和Tomcat 8.5.4. 到目前为止,我有 ...
- Java Web开发中,自定义过滤器被执行两次的原因分析及解决办法
本文出处:http://blog.csdn.net/chaijunkun/article/details/7646338,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...
- Java Web开发应用中要掌握的一些感念 疯狂JAVA
概念一直是学习计算机软件开发中经常遇到的问题,也是软件行业最喜欢创造的东西.很多时候,学习计算机软件开发遇到困难都是因为对某些概念的不理解,而不是因为技术本身有多么复杂.Java Web作为Java ...
- JAVA Web项目中所出现错误及解决方式合集(不断更新中)
JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...
- 一个简单的Java web服务器实现
前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...
- java sessionstate_在Java Web开发中自定义Session
Session在存储安全性要求较高的会话信息方面是必不可少的,对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的.本文就来教大家如何在Java Web开发中自定义Session ...
- java web服务器tomcat介绍【转载】
机器矩阵2016-08-10 22:14 java程序员亲切地称他为tom猫,看到这只猫可以说明1 服务器部署成功了 ,2 网络是联通的. 到底这只猫是什么来头呢? tomcat是Apache基金会下 ...
- JAVA Web Servlet中的异步处理 (2) -- Servlet3.1中的Non-blocking IO支持
JAVA Web Servlet中的异步处理 (2) – Servlet3.1中的Non-blocking IO支持 在servlet 3.1中,新增了non-blocking IO支持. 在serv ...
- JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持
JAVA Web Servlet中的异步处理 (1) – Servlet3.0中的Async支持 每个请求来到Web容器,Web容器会为其分配一个线程来专门负责该请求,直到完成处理前,该执行线程都不会 ...
最新文章
- Struts2核心工作原理解析
- 闲谈网络运维管理的那些事儿(之三)
- 使用SqlCommandBuilder
- 别以为程序员的工作就是写代码
- linux 系统让服务后台运行
- JAVA怎么在函数内改变传入的值
- Linux操作系统资源 大合集【鸿蒙OS Suse 红帽 BSD CentOS Arch Ubuntu】 | 寻找C站宝藏
- 【教程】PDF控件Spire.PDF 教程:在C#中检测PDF文件是否为PDF/A
- verilog qpsk调制解调
- 给mBlock添加扩展模块
- Android图片处理之Glide使用大全
- 深入理解golang框架Gin(一)---->Gin简介以及安装使用
- 解决外网下载速度过慢问题
- 苹果邮箱怎么登录qq邮箱_电子邮箱 电子邮箱格式怎么写
- HubilderX更新记录
- PlayStation Now比您想象的要好
- 阿里在职5年,一个女测试工师的坎坷之路
- kail如何进入root_Kali初次使用如何获得root权限
- WebGL--vue+openlayers实现覆盖物+popup
- GlobalSign 企业型SSL 证书