动手学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. ...
随机推荐
- CCI4.5/LintCode Validate Binary Search Tree
Validate BST是指按中序遍历niorder后左<node<右: 第一种方法: 先按inoreder遍历, 再放进ArrayList里用循环看是不是从小到大排序: 注意: 设置成员 ...
- JavaScript,DOM经典基础面试题
JavaScript的数据类型 JavaScript的数据类型可以分为原始类型和对象类型 原始类型包括string,number和Boolean三种,其中字符串是使用一对单引号或者一堆双引号括起来的任 ...
- Python2.7.12开发环境构建(自动补全)
一.安装readline-devel包 Python的编译安装依赖于这个包 yum -y install readline-devel 二.安装Python2.7.12 Python官方网站(到此处下 ...
- 合并果子 2004年NOIP全国联赛普及组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆 ...
- Ubuntu下配置Pyspider环境
Ubuntu 14.04.4 LTS 1.ubuntu 系统自带Python 所以不用安装Python 注:安装前先更新下软件源 命令 :sudo apt-get update 2.开始安装pip 命 ...
- lua随机数函数
function rnd(max) --lua的第1次random数不靠谱,取第3次的靠谱 local ret=0 math.randomseed(os.time()) for i=1,3 d ...
- 缓存,socket乱码等
在服务端默认的编码情况下,JAVA的SOCKET接收需要GBK编码,而C#的接收需要UTF-8编码
- Disque
Disque是一个内存储存的分布式任务队列实现, 它由 Redis 的作者 Salvatore Sanfilippo (@antirez)开发, 目前正处于预览版(alpha)阶段. 本文档将对 Di ...
- PHP递归重新排序无限级分类数组
public static function Menus($id,$spac=0){ /* $data = array( 1 => array('id' => 1,'name' => ...
- 以Administrator权限运行VS时无法拖入文件
解决办法 1.从任务管理器中关闭explorer进程(你会发现任务栏什么的都没有了) 2.从任务管理器启动explorer.exe(win8需要手动勾选"以管理员权限运行",win ...