10_Filter和Listener

来源:互联网 发布:淘宝搜不到变声软件 编辑:程序博客网 时间:2024/06/08 11:50

Filter和Listener都是JSP1.2和Servlet2.3中新引入的功能

10.1 Filter

10.1.1 Filter概述

实际应用时,可以用用Filter完成以下任务:

1.访问特定资源时的身份认证,

2.访问资源的审核和记录,

3.对资源的加密访问,

4.对被访问资源的及时转换

10.1.2 Filter的实现

示例10-1:一个简单的Filter实现

源文件:FirstFilter.java

package uikoo9.filter_listener.demo;import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter;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 D01_FirstFilter implements Filter {public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {PrintWriter pw = new PrintWriter(new FileWriter("filter.txt"));pw.print("Filter Filter");pw.close();chain.doFilter(request, response);}public void init(FilterConfig arg0) throws ServletException {}public void destroy() {}}

源文件:web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>    <filter>  <filter-name>FirstFilter</filter-name>  <filter-class>uikoo9.filter_listener.demo.D01_FirstFilter</filter-class>  </filter>    <filter-mapping>  <filter-name>FirstFilter</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping></web-app>

10.1.3 用Filter处理权限控制

示例10-2:用过滤器实现权限控制

源文件:CheckFilter.java

package uikoo9.filter_listener.demo;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletContext;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;public class D02_CheckFilter implements Filter {private FilterConfig filterConfig;private String loginPage = "/first/LoginPage.jsp";public void init(FilterConfig config) throws ServletException {//通过FilterConfig获得web.xml中设置的初始化参数filterConfig = config;if(filterConfig.getInitParameter("loginPage") != null){loginPage = filterConfig.getInitParameter("loginPage");}}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest)request;HttpServletResponse res = (HttpServletResponse)response;HttpSession session = req.getSession(true);if(session.getAttribute("auth") != null){chain.doFilter(req, res);return;}else{ServletContext ctx = filterConfig.getServletContext();setForwardURI(req);ctx.getRequestDispatcher(loginPage).forward(req, res);}}private void setForwardURI(HttpServletRequest req){StringBuffer requestURI = new StringBuffer(req.getRequestURI());String queryString = req.getQueryString();if(queryString != null){requestURI.append("?").append(queryString);}req.setAttribute("orignURL", requestURI.toString());}public void destroy() {filterConfig = null;}}

源文件:web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>    <filter>  <filter-name>CheckFilter</filter-name>  <filter-class>uikoo9.filter_listener.demo.D02_CheckFilter</filter-class>  <init-param>  <param-name>loginPage</param-name>  <param-value>/LoginPage.jsp</param-value>  </init-param>  </filter>    <filter-mapping>  <filter-name>CheckFilter</filter-name>  <url-pattern>/auth/*</url-pattern>  </filter-mapping></web-app>

示例10-3:登录页面

源文件:Loginpage.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%><%@ page contentType="text/html; charset=GBK" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>登录页面</title>  </head>    <body><h1>请登录</h1><form name="login" method="post" action="/first/login.jsp">姓名:<input type="text" name="user" /><br />密码:<input type="password" name="pwd" /><br /><input type="hidden" name="targetUrl" value="<%= request.getAttribute("orignURL") %>"><input type="submit" name="sub" value="登录" /></form>  </body></html>

示例10-4:处理登录的JSP

源文件:login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%><%@ page session="true" contentType="text/html; charset=GBK" %><%session.getAttribute("auth","yes");String targetUrl = request.getParameter("targetUrl");if(targetUrl != null){response.sendRedirect(targetUrl);}else{out.println("登录成功!");}%>

10.1.4 和Filter相关的一些注意点

10.2 Listener

10.2.1 ServletContextListener

这个监听器只能监听ServletContext的初始化和销毁方法

示例10-5:ServletContextListener的例子

源文件:MyServletContextListener.java

package uikoo9.filter_listener.demo;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.util.Date;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class D05_MyServletContextListener implements ServletContextListener {private OutputStreamWriter osw = null;private FileOutputStream fos = null;private String filePath = "log.txt";private Date date;public void contextInitialized(ServletContextEvent e) {ServletContext ctx = e.getServletContext();String appPath = ctx.getRealPath("/");filePath = appPath + "log.txt";date = new Date();String startMsg = date + " started.\n";System.out.println("======================" + filePath);writeLog(filePath,startMsg);}public void contextDestroyed(ServletContextEvent e) {date = new Date();String stopMsg = date + " stoped.\n";System.out.println("======================" + filePath);writeLog(filePath,stopMsg);}private void writeLog(String filename,String msg){try {fos = new FileOutputStream(filename,true);osw = new OutputStreamWriter(fos);osw.write(msg);} catch (Exception e) {e.printStackTrace();} finally {if(osw != null){try {osw.close();} catch (Exception e2) {e2.printStackTrace();}}if(fos != null){try {fos.close();} catch (Exception e2) {e2.printStackTrace();}}}}}

在web.xml中需要配置:

<listener><listener-class>uikoo9.filter_listener.demo.D05_MyServletContextListener</listener-class></listener>

10.2.2 ServletContextAttributeListener

这个监听器可以监听ServletContext中属性的添加,删除和替换

10.2.3 HttpSessionListener

这个监听器可以监听session的创建和销毁

示例10-6:用HttpSessionListener来统计在线人数

源文件:OnlineUser.java

package uikoo9.filter_listener.demo;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class D06_OnlineUser implements ServletContextListener,HttpSessionListener {private int count = 0;ServletContext ctx = null;public void contextInitialized(ServletContextEvent e) {ctx = e.getServletContext();}public void contextDestroyed(ServletContextEvent sce) {ctx = null;}public void sessionCreated(HttpSessionEvent arg0) {count++;ctx.setAttribute("OnlineUser", new Integer(count));}public void sessionDestroyed(HttpSessionEvent arg0) {count--;ctx.setAttribute("OnlineUser", new Integer(count));}}

在web.xml中配置:

<listener><listener-class>uikoo9.filter_listener.demo.D06_OnlineUser</listener-class></listener>

源文件:login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%><%@ page session="true" contentType="text/html; charset=GBK" %><%session.setAttribute("user","tom");out.write("Login Success!");%>

源文件:onlineuser.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%><%@ page session="true" contentType="text/html; charset=GBK" %><%out.println("Online User: " + application.getAttribute("OnlineUser"));%>

10.2.4 HttpSessionAttributeListener

原创粉丝点击