一 过滤器

每个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 - 服务器中的过滤器和监听器相关推荐

  1. javaweb中服务器响应,Java Web服务器响应与JSON

    我想创建一个简单的Java Web应用程序响应GET请求/用JSON字符串测试.Java Web服务器响应与JSON 我的环境是Java,Intellij和Tomcat 8.5.4. 到目前为止,我有 ...

  2. Java Web开发中,自定义过滤器被执行两次的原因分析及解决办法

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7646338,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  3. Java Web开发应用中要掌握的一些感念 疯狂JAVA

    概念一直是学习计算机软件开发中经常遇到的问题,也是软件行业最喜欢创造的东西.很多时候,学习计算机软件开发遇到困难都是因为对某些概念的不理解,而不是因为技术本身有多么复杂.Java Web作为Java ...

  4. JAVA Web项目中所出现错误及解决方式合集(不断更新中)

    JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...

  5. 一个简单的Java web服务器实现

    前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...

  6. java sessionstate_在Java Web开发中自定义Session

    Session在存储安全性要求较高的会话信息方面是必不可少的,对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的.本文就来教大家如何在Java Web开发中自定义Session ...

  7. java web服务器tomcat介绍【转载】

    机器矩阵2016-08-10 22:14 java程序员亲切地称他为tom猫,看到这只猫可以说明1 服务器部署成功了 ,2 网络是联通的. 到底这只猫是什么来头呢? tomcat是Apache基金会下 ...

  8. 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 ...

  9. JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持

    JAVA Web Servlet中的异步处理 (1) – Servlet3.0中的Async支持 每个请求来到Web容器,Web容器会为其分配一个线程来专门负责该请求,直到完成处理前,该执行线程都不会 ...

最新文章

  1. Struts2核心工作原理解析
  2. 闲谈网络运维管理的那些事儿(之三)
  3. 使用SqlCommandBuilder
  4. 别以为程序员的工作就是写代码
  5. linux 系统让服务后台运行
  6. JAVA怎么在函数内改变传入的值
  7. Linux操作系统资源 大合集【鸿蒙OS Suse 红帽 BSD CentOS Arch Ubuntu】 | 寻找C站宝藏
  8. 【教程】PDF控件Spire.PDF 教程:在C#中检测PDF文件是否为PDF/A
  9. verilog qpsk调制解调
  10. 给mBlock添加扩展模块
  11. Android图片处理之Glide使用大全
  12. 深入理解golang框架Gin(一)---->Gin简介以及安装使用
  13. 解决外网下载速度过慢问题
  14. 苹果邮箱怎么登录qq邮箱_电子邮箱 电子邮箱格式怎么写
  15. HubilderX更新记录
  16. PlayStation Now比您想象的要好
  17. 阿里在职5年,一个女测试工师的坎坷之路
  18. kail如何进入root_Kali初次使用如何获得root权限
  19. WebGL--vue+openlayers实现覆盖物+popup
  20. GlobalSign 企业型SSL 证书

热门文章

  1. ZooKeeper快速搭建
  2. C#调试中,在VS的输出窗口或即时窗口显示消息
  3. [ -~] 所有的可打印字符
  4. FishEye for Silverlight
  5. 牛X的web报表设计工具Grid++Report
  6. linux间隔时间执行,科技常识:使用linux命令crontab间隔时间执行其它命令
  7. 实现一个可管理、增发、兑换、冻结等高级功能的代币
  8. Django----中间件详解
  9. JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
  10. 游戏盾正式发布:撬动DDoS攻防的天平