过滤器(Filter)

过滤器是在客户端和请求资源之间,起一个过滤的作用,举个例子,比如我们要请求admin文件夹下的index.jsp这个页面,那么我们可以用一个过滤器,判断登录用户是不是管理员

-请求资源可以是servlet,jsp页面,html页面等

-在请求资源的前后执行

-请求和响应可以通过filter修改

过滤器常用在这几个方面:Session管理权限验证日志记录字符编码转换

  1. package servletdemo;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.FilterConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11.  
  12. public class MyFilter implements Filter {
  13.  
  14. @Override
  15. public void destroy() {
  16. // TODO 自动生成的方法存根
  17.  
  18. }
  19.  
  20. @Override
  21. public void doFilter(ServletRequest request, ServletResponse response,
  22. FilterChain chain) throws IOException, ServletException {
  23. System.out.println("filter...");
  24. chain.doFilter(request, response);
  25. // TODO 自动生成的方法存根
  26.  
  27. }
  28.  
  29. @Override
  30. public void init(FilterConfig arg0) throws ServletException {
  31. // TODO 自动生成的方法存根
  32.  
  33. }
  34.  
  35. }

创建一个Filter

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  3. <display-name>javaeedemo2</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.html</welcome-file>
  6. <welcome-file>index.htm</welcome-file>
  7. <welcome-file>index.jsp</welcome-file>
  8. <welcome-file>default.html</welcome-file>
  9. <welcome-file>default.htm</welcome-file>
  10. <welcome-file>default.jsp</welcome-file>
  11. </welcome-file-list>
  12. <filter>
  13. <filter-name>MyFilter</filter-name>
  14. <filter-class>servletdemo.MyFilter</filter-class>
  15. </filter>
  16. <filter-mapping>
  17. <filter-name>MyFilter</filter-name>
  18. <url-pattern>/*</url-pattern>
  19. </filter-mapping>
  20. </web-app>

配置文件

注意:这里ulr-parten是起一个过滤的作用,如果是/*,那么所有的资源请求都要经过这个过滤器,再假如要对admin文件夹下的文件过滤,就可以写成/admin/*

我们新建一个index.jsp页面进行访问,每次刷新页面,过滤器都会起作用

再看一个例子,使用Filter进行登录权限验证(访问admin下面的内容需要登录)

  1. package servletdemo;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.FilterConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpSession;
  14.  
  15. import sun.misc.Regexp;
  16.  
  17. public class MyFilter implements Filter {
  18.  
  19. @Override
  20. public void destroy() {
  21. // TODO 自动生成的方法存根
  22.  
  23. }
  24.  
  25. @Override
  26. public void doFilter(ServletRequest request, ServletResponse response,
  27. FilterChain chain) throws IOException, ServletException {
  28. HttpServletRequest req=(HttpServletRequest)request;
  29. HttpServletResponse res=(HttpServletResponse)response;
  30.  
  31. HttpSession session=req.getSession();
  32. if(session.getAttribute("userlogin")==null)
  33. {
  34. System.out.println("please login...");
  35. }
  36. else {
  37. req.getRequestDispatcher("../login.html").forward(request, response);
  38. }
  39. chain.doFilter(request, response);
  40. // TODO 自动生成的方法存根
  41.  
  42. }
  43.  
  44. @Override
  45. public void init(FilterConfig arg0) throws ServletException {
  46. // TODO 自动生成的方法存根
  47.  
  48. }
  49.  
  50. }

代码

监听器(Listener)

监听器用于监听JAVA WEB程序中的事件,例如创建,修改,删除Session,request,context等,并触发相应的事件

下面我们就针对刚才提到的三个共享变量来学习监听器

1、ServletContextListener

  1. package servletdemo;
  2.  
  3. import javax.servlet.ServletContextEvent;
  4. import javax.servlet.ServletContextListener;
  5.  
  6. public class MyListener implements ServletContextListener {
  7.  
  8. @Override
  9. public void contextDestroyed(ServletContextEvent arg0) {
  10. // TODO 自动生成的方法存根
  11. System.out.println("contextDestroyed......");
  12.  
  13. }
  14.  
  15. @Override
  16. public void contextInitialized(ServletContextEvent arg0) {
  17. // TODO 自动生成的方法存根
  18. System.out.println("contextInitialized......");
  19. }
  20.  
  21. }

代码

运行WEB工程,无论是哪个页面首先启动,该监听器都会执行,所以一切全局的操作就可以写在这里

2、ServletContextAttributeListener

  1. package servletdemo;
  2.  
  3. import javax.servlet.ServletContextAttributeEvent;
  4. import javax.servlet.ServletContextAttributeListener;
  5. import javax.servlet.ServletContextEvent;
  6. import javax.servlet.ServletContextListener;
  7.  
  8. public class MyListener implements ServletContextAttributeListener {
  9.  
  10. @Override
  11. public void attributeAdded(ServletContextAttributeEvent arg0) {
  12. // TODO 自动生成的方法存根
  13. System.out.println("attributeAdded......");
  14. }
  15.  
  16. @Override
  17. public void attributeRemoved(ServletContextAttributeEvent arg0) {
  18. // TODO 自动生成的方法存根
  19. System.out.println("attributeRemoved......");
  20. }
  21.  
  22. @Override
  23. public void attributeReplaced(ServletContextAttributeEvent arg0) {
  24. // TODO 自动生成的方法存根
  25. System.out.println("attributeReplaced......");
  26. }
  27.  
  28. }

创建监听器

  1. package servletdemo;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. /**
  13. * Servlet implementation class TestListenerServlet
  14. */
  15. @WebServlet("/TestListenerServlet")
  16. public class TestListenerServlet extends HttpServlet {
  17. private static final long serialVersionUID = 1L;
  18.  
  19. /**
  20. * @see HttpServlet#HttpServlet()
  21. */
  22. public TestListenerServlet() {
  23. super();
  24. // TODO Auto-generated constructor stub
  25. }
  26.  
  27. /**
  28. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  29. */
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. // TODO Auto-generated method stub
  32. ServletContext ctx=this.getServletContext();
  33. ctx.setAttribute("ctx_name", "ctx_value");
  34. //替换
  35. ctx.setAttribute("ctx_name", "ctx_value2");
  36. //删除
  37. ctx.removeAttribute("ctx_name");
  38. }
  39.  
  40. /**
  41. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  42. */
  43. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  44. // TODO Auto-generated method stub
  45. doGet(request, response);
  46. }
  47.  
  48. }

创建Servlet

运行servlet,该监听器的事件会执行,效果如下

3、HttpSessionListener

  1. package servletdemo;
  2.  
  3. import javax.servlet.http.HttpSessionEvent;
  4. import javax.servlet.http.HttpSessionListener;
  5.  
  6. public class MyListener implements HttpSessionListener {
  7.  
  8. @Override
  9. public void sessionCreated(HttpSessionEvent arg0) {
  10. // TODO 自动生成的方法存根
  11. System.out.println("sessionCreated......");
  12. }
  13.  
  14. @Override
  15. public void sessionDestroyed(HttpSessionEvent arg0) {
  16. // TODO 自动生成的方法存根
  17. System.out.println("sessionDestroyed......");
  18. }
  19.  
  20. }

创建监听器

  1. package servletdemo;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.servlet.http.HttpSession;
  12.  
  13. /**
  14. * Servlet implementation class TestListenerServlet
  15. */
  16. @WebServlet("/TestListenerServlet")
  17. public class TestListenerServlet extends HttpServlet {
  18. private static final long serialVersionUID = 1L;
  19.  
  20. /**
  21. * @see HttpServlet#HttpServlet()
  22. */
  23. public TestListenerServlet() {
  24. super();
  25. // TODO Auto-generated constructor stub
  26. }
  27.  
  28. /**
  29. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  30. */
  31. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  32. // TODO Auto-generated method stub
  33. HttpSession session=request.getSession();
  34. session.setAttribute("session_name", "session_value");
  35. //销毁
  36. session.invalidate();
  37. }
  38.  
  39. /**
  40. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  41. */
  42. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  43. // TODO Auto-generated method stub
  44. doGet(request, response);
  45. }
  46.  
  47. }

创建servlet

运行servlet,该监听器的事件会执行,效果如下

4、HttpSessionAttributeListener

  1. package servletdemo;
  2.  
  3. import javax.servlet.http.HttpSessionAttributeListener;
  4. import javax.servlet.http.HttpSessionBindingEvent;
  5.  
  6. public class MyListener implements HttpSessionAttributeListener {
  7.  
  8. @Override
  9. public void attributeAdded(HttpSessionBindingEvent arg0) {
  10. // TODO 自动生成的方法存根
  11. System.out.println("attributeAdded......");
  12. }
  13.  
  14. @Override
  15. public void attributeRemoved(HttpSessionBindingEvent arg0) {
  16. // TODO 自动生成的方法存根
  17. System.out.println("attributeRemoved......");
  18. }
  19.  
  20. @Override
  21. public void attributeReplaced(HttpSessionBindingEvent arg0) {
  22. // TODO 自动生成的方法存根
  23. System.out.println("attributeReplaced......");
  24. }
  25.  
  26. }

创建监听器

  1. package servletdemo;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;
  11.  
  12. /**
  13. * Servlet implementation class TestListenerServlet
  14. */
  15. @WebServlet("/TestListenerServlet")
  16. public class TestListenerServlet extends HttpServlet {
  17. private static final long serialVersionUID = 1L;
  18.  
  19. /**
  20. * @see HttpServlet#HttpServlet()
  21. */
  22. public TestListenerServlet() {
  23. super();
  24. // TODO Auto-generated constructor stub
  25. }
  26.  
  27. /**
  28. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  29. */
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. HttpSession session=request.getSession();
  32. session.setAttribute("session_name", "session_value");
  33. //替换
  34. session.setAttribute("session_name", "session_value2");
  35. //删除
  36. session.invalidate();
  37. }
  38.  
  39. /**
  40. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  41. */
  42. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  43. // TODO Auto-generated method stub
  44. doGet(request, response);
  45. }
  46.  
  47. }

创建servlet

运行servlet,该监听器的事件会执行,效果如下

还有一个HttpRequestListener和HttpRequestAttributeListener,一运行servlet就会创建一个request,所以对应的监听器的add事件就会执行

还有监听器的配置文件代码:

<listener>
<listener-class>servletdemo.MyListener</listener-class>
</listener>

动手学servlet(六) 过滤器和监听器的更多相关文章

  1. 面试之servlet、过滤器、监听器

    servlet.过滤器.监听器servlet是Java中WEB请求和响应的容器servlet的运行需要在类似tomcat容器中,一个 Web 应用对应一个 Context 容器,也就是 Servlet ...

  2. Servlet,过滤器和监听器的配置和使用

    一.什么是Servlet Servlet使用Java语言实现的程序,运行于支持Java语言的Web服务器或者应用服务器中.Servlet先于JSP出现,提供和客户端动态交互的功能.Servlet可以处 ...

  3. servlet,过滤器,监听器,拦截器的区别

    一.目录 1.概念 2.生命周期 3.职责 4.执行过程 二.内容 概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性, 可以动态生成web页面它 ...

  4. SpringBoot09 自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题

    1 servlet简介 servlet是一种用于开发动态web资源的技术 参考博客:servlet基础知识     httpservlet详解 2 在springboot应用中添加servlet sp ...

  5. SpringBoot自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题

    [转]https://www.cnblogs.com/NeverCtrl-C/p/8191920.html 1 servlet简介 servlet是一种用于开发动态web资源的技术 参考博客:serv ...

  6. servlet、过滤器、监听器、拦截器之间的关系和区别

    一.概念 1.什么是servlet servlet是一个接口.定义了一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destr ...

  7. 动手学servlet(五) 共享变量

    1. 无论对象的作用域如何,设置和读取共享变量的方法是一致的 -setAttribute("varName",obj); -getAttribute("varName&q ...

  8. 动手学servlet(四) cookie和session

    Cookie   cookie是保存在客户端的一个“键值对”,用来存储用户的一些信息 cookie的应用: -在电子商务会话中标识用户 -对网站进行定制,比如你经常浏览哪些内容,就展示哪些页面给你 - ...

  9. 动手学servlet(三) 请求头和响应头信息

    获取请求头信息 package servletdemo; import java.io.IOException; import java.util.Enumeration; import javax. ...

随机推荐

  1. Nothing about semantics

    Motivation fork a project in github, seriously. Candidates PasaLab / cichlid 80% Distributed RDFS &a ...

  2. HDFS的运行原理

    简介 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据google发表的论文翻版的.论文为GFS(Google File System)Go ...

  3. WINDOW.PARENT.CKEDITOR.TOOLS.CALLFUNCTION 图片上传

    CKEDITOR  编辑器   图片上传 WINDOW.PARENT.CKEDITOR.TOOLS.CALLFUNCTION (CKEditorFuncNum,图片路径,返回信息); CKEditor ...

  4. Linux下搭建FTP服务器

    实习的公司有一台老服务器转作为FTP服务器,老大把这个任务交给了我.这两天边学边卖的捣腾起来,总算搞成.现在记录下来,加深映像,也以便以后查看复习. 服务器安装的是:Red Hat Enterpris ...

  5. PS中的图像知识

    图像处理对于前端工作来说是一个不能回避的问题,ps技术也是我们必备的技能.用法可以在使用中不断的熟练,但针对前端技术本身的一些知识点,需要我们平时不断的积累才能够在使用中不出现问题. 如今的办公,已经 ...

  6. 《C与指针》第十二章练习

    本章例程 //12.3 #include <stdio.h> #include <stdlib.h> typedef struct NODE{ struct NODE *lin ...

  7. [WARNING]考前必读?!

    考试策略很重要. 1)             认真读懂每道题,把题意搞明白,把样例算出来,把题目要求的细节标出. 2)             推出每道题的模型,确定每道题的策略,是部分分还是要全部 ...

  8. SQL Server 中存储过程的练习

    建库建表建约束 插入数据 --建库建表建约束和插入测试数据 use bankDB go --1.完成存款,取款业务--存款 create proc usp_takeMoney ),),)=null,@ ...

  9. 用C#,SQL Server编写的音乐播放软件

    主界面代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  10. Android Saving Data(一)

    Saving Key-value Sets  保存键值对 SharedPreferences只能用来保存一些简单的数据,并且这些数据可以是共享的,也可以是私有的. SharedPreferences没 ...