动手学servlet(六) 过滤器和监听器
过滤器(Filter)
过滤器是在客户端和请求资源之间,起一个过滤的作用,举个例子,比如我们要请求admin文件夹下的index.jsp这个页面,那么我们可以用一个过滤器,判断登录用户是不是管理员
-请求资源可以是servlet,jsp页面,html页面等
-在请求资源的前后执行
-请求和响应可以通过filter修改
过滤器常用在这几个方面:Session管理,权限验证,日志记录,字符编码转换
package servletdemo; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class MyFilter implements Filter { @Override
public void destroy() {
// TODO 自动生成的方法存根 } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("filter...");
chain.doFilter(request, response);
// TODO 自动生成的方法存根 } @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO 自动生成的方法存根 } }
创建一个Filter
<?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name>javaeedemo2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>servletdemo.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
配置文件
注意:这里ulr-parten是起一个过滤的作用,如果是/*,那么所有的资源请求都要经过这个过滤器,再假如要对admin文件夹下的文件过滤,就可以写成/admin/*
我们新建一个index.jsp页面进行访问,每次刷新页面,过滤器都会起作用

再看一个例子,使用Filter进行登录权限验证(访问admin下面的内容需要登录)
package servletdemo; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import sun.misc.Regexp; public class MyFilter implements Filter { @Override
public void destroy() {
// TODO 自动生成的方法存根 } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response; HttpSession session=req.getSession();
if(session.getAttribute("userlogin")==null)
{
System.out.println("please login...");
}
else {
req.getRequestDispatcher("../login.html").forward(request, response);
}
chain.doFilter(request, response);
// TODO 自动生成的方法存根 } @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO 自动生成的方法存根 } }
代码
监听器(Listener)
监听器用于监听JAVA WEB程序中的事件,例如创建,修改,删除Session,request,context等,并触发相应的事件
下面我们就针对刚才提到的三个共享变量来学习监听器
1、ServletContextListener
package servletdemo; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class MyListener implements ServletContextListener { @Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("contextDestroyed......"); } @Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("contextInitialized......");
} }
代码
运行WEB工程,无论是哪个页面首先启动,该监听器都会执行,所以一切全局的操作就可以写在这里

2、ServletContextAttributeListener
package servletdemo; import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class MyListener implements ServletContextAttributeListener { @Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("attributeAdded......");
} @Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("attributeRemoved......");
} @Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("attributeReplaced......");
} }
创建监听器
package servletdemo; import java.io.IOException; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class TestListenerServlet
*/
@WebServlet("/TestListenerServlet")
public class TestListenerServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public TestListenerServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
ServletContext ctx=this.getServletContext();
ctx.setAttribute("ctx_name", "ctx_value");
//替换
ctx.setAttribute("ctx_name", "ctx_value2");
//删除
ctx.removeAttribute("ctx_name");
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
} }
创建Servlet
运行servlet,该监听器的事件会执行,效果如下

3、HttpSessionListener
package servletdemo; import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class MyListener implements HttpSessionListener { @Override
public void sessionCreated(HttpSessionEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("sessionCreated......");
} @Override
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("sessionDestroyed......");
} }
创建监听器
package servletdemo; import java.io.IOException; import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession; /**
* Servlet implementation class TestListenerServlet
*/
@WebServlet("/TestListenerServlet")
public class TestListenerServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public TestListenerServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession session=request.getSession();
session.setAttribute("session_name", "session_value");
//销毁
session.invalidate();
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
} }
创建servlet
运行servlet,该监听器的事件会执行,效果如下

4、HttpSessionAttributeListener
package servletdemo; import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent; public class MyListener implements HttpSessionAttributeListener { @Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("attributeAdded......");
} @Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("attributeRemoved......");
} @Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO 自动生成的方法存根
System.out.println("attributeReplaced......");
} }
创建监听器
package servletdemo; import java.io.IOException; 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 javax.servlet.http.HttpSession; /**
* Servlet implementation class TestListenerServlet
*/
@WebServlet("/TestListenerServlet")
public class TestListenerServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public TestListenerServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session=request.getSession();
session.setAttribute("session_name", "session_value");
//替换
session.setAttribute("session_name", "session_value2");
//删除
session.invalidate();
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
} }
创建servlet
运行servlet,该监听器的事件会执行,效果如下

还有一个HttpRequestListener和HttpRequestAttributeListener,一运行servlet就会创建一个request,所以对应的监听器的add事件就会执行
还有监听器的配置文件代码:
<listener>
<listener-class>servletdemo.MyListener</listener-class>
</listener>
动手学servlet(六) 过滤器和监听器的更多相关文章
- 面试之servlet、过滤器、监听器
servlet.过滤器.监听器servlet是Java中WEB请求和响应的容器servlet的运行需要在类似tomcat容器中,一个 Web 应用对应一个 Context 容器,也就是 Servlet ...
- Servlet,过滤器和监听器的配置和使用
一.什么是Servlet Servlet使用Java语言实现的程序,运行于支持Java语言的Web服务器或者应用服务器中.Servlet先于JSP出现,提供和客户端动态交互的功能.Servlet可以处 ...
- servlet,过滤器,监听器,拦截器的区别
一.目录 1.概念 2.生命周期 3.职责 4.执行过程 二.内容 概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性, 可以动态生成web页面它 ...
- SpringBoot09 自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题
1 servlet简介 servlet是一种用于开发动态web资源的技术 参考博客:servlet基础知识 httpservlet详解 2 在springboot应用中添加servlet sp ...
- SpringBoot自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题
[转]https://www.cnblogs.com/NeverCtrl-C/p/8191920.html 1 servlet简介 servlet是一种用于开发动态web资源的技术 参考博客:serv ...
- servlet、过滤器、监听器、拦截器之间的关系和区别
一.概念 1.什么是servlet servlet是一个接口.定义了一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destr ...
- 动手学servlet(五) 共享变量
1. 无论对象的作用域如何,设置和读取共享变量的方法是一致的 -setAttribute("varName",obj); -getAttribute("varName&q ...
- 动手学servlet(四) cookie和session
Cookie cookie是保存在客户端的一个“键值对”,用来存储用户的一些信息 cookie的应用: -在电子商务会话中标识用户 -对网站进行定制,比如你经常浏览哪些内容,就展示哪些页面给你 - ...
- 动手学servlet(三) 请求头和响应头信息
获取请求头信息 package servletdemo; import java.io.IOException; import java.util.Enumeration; import javax. ...
随机推荐
- 2.4G无线射频通信模块nRF24L01+开发笔记(基于MSP430RF6989与STM32f0308)(1.(2)有错误,详见更正)
根据网上的nRF24L01+例程和TI提供的MSP430RF6989的硬件SPI总线例程编写程序,对硬件MSP-EXP430RF6989 Launch Pad+nRF24L01P射频模块(淘宝购买)进 ...
- 2015.10.15class
#include<stdio.h> main() { int a; printf("你的智商是多少?\n"); scanf("%d",&a) ...
- 《JavaScript DOM编程艺术》读后总结
这是我读的第一本关于JS的书,刚开始我为了选择合适的学习JS的书,看了网上许多人的意见,基本上都是推荐先读这本书.书的内容挺简单的,确实很适合初学者看,阅读的过程中不会产生什么障碍.内容虽然简单,但我 ...
- same story,different day
多亏了这个重感冒,宏伟计划险些又断了. 我是说当然断了一天,但是比起鄙人过往的八千多个日子,喔,虚惊一场. 又看了段lietome,作为不会看眼色的人,这样的美剧太有吸引力了.想象一下,一个八分半美女 ...
- jQuery中$.fn的用法示例介绍
$.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效,下面有个不错的示例,喜欢的朋友可以参考下 如扩展$.fn.abc(),即$.fn.abc()是对jquery ...
- install vim
常用命令: [0]安装vim: oee@copener:~$ sudo apt-get install vim vim-scripts vim-doc 刚安装完$HOME目录下只有两个文件:.vim/ ...
- [stat.simulation] Hasting-Metropolis Algorithm
问题背景:我们有一些观测数据X,这些数据假设是取值为1,...,m:我们还知道每个数据观测到的频数为: 但是我们现在无法计算B的大小.(这是一个假设,毕竟计算一串数字的和不是难事) 问题: 我们需要通 ...
- Torch 7 load saved model failed, 加载保存的模型失败
Torch 7 load saved model failed, 加载保存的模型失败: 可以尝试下面的解决方案:
- centos安装mongodb 3.2.9
centos 6.5 x64 1.下载地址:用迅雷下载,直接下载下不动 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2 ...
- js post提交
/* js跳转页面 url跳转地址,params参数列表 */ function Posturl(url,params){ //创建form表单 var temp_form=document.crea ...