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
- 10_Filter和Listener
- 12_filter
- web.xml(3)_filter
- 简单的listener和listener文件配置
- Listener 、Filter 和 Interceptor
- filter和listener
- Servlet、Filter和Listener
- Filter和Listener
- Servlet、Filter和Listener
- Servlet、Filter和Listener
- Filter 和 Listener小结
- 11Listener和Filter
- Servlet-Filter和Listener
- JavaEE Filter和Listener
- Listener 和 Callback
- ext listener和handler
- tnsname和listener
- Listener和Filter
- 风险投资的七种错觉
- 新项目经理必读
- MySql数据库语句整理(一)
- rails 8小时 时间差
- C中Union的巧妙用法
- 10_Filter和Listener
- iOS 如何监听出插入耳机 拔掉耳机事件?
- 一道有趣的笔试题
- RegexKitLite 正则 iOS
- sizeof()和strlen()
- shell 高级学习成果分享
- C 语言经典题目
- 黑客称利用 Adobe 新漏洞控制了部分雅虎服务器
- hdu 1100