zoukankan      html  css  js  c++  java
  • JSP--监听HTTP会话

    ServletListener 之 监听HTTP会话

    在开始先要知道我们可以通过HttpSessionListener接口监听HTTP会话的创建,销毁的信息;通过HTTPSessionActivationListener监听HTTP会话的active,passivate情况;通过HttpSessionBindingListener监听HTTP会话中对象的绑定信息;通过HttpSessionAttributeListener监听HTTP会话中属性的设置情况 。
    下面写个具体的例子:

    监听HTTP会话程序


    package eflylab;
    import java.util.Hashtable;
    import java.util.Iterator;
    import javax.servlet.http.HttpSession;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;

    //HttpSessionListener接口监听会话的创建,销毁的信息
    public class SessionListener implements HttpSessionListener {
        
    /**
         * 该类实现了HttpSessionListener接口。
         * 该类还有一个属性Hashtable,用来保存所有的登录信息。
         * 当创建一个Session时,就调用 sessionCreate()方法将登录会话保存到Hashtable中;
         * 当销毁一个Session时, 就调用sessionDetoryed()方法将 登录信息从Hashtable中移除
         * 这就就实现了管理在线用户登录的会话信息目的 
         
    */

        
    // 集合对象,保存session 对象的引用
        static Hashtable ht = new Hashtable();

        
    // 实现HttpSessionListener接口,完成session创建事件控制
        public void sessionCreated(HttpSessionEvent arg0) {
            HttpSession session 
    = arg0.getSession();
            ht.put(session.getId(), session);
            System.out.println(
    "create session :" + session.getId());
        }


        
    // 实现HttpSessionListener接口,完成session销毁事件控制
        public void sessionDestroyed(HttpSessionEvent arg0) {

            HttpSession session 
    = arg0.getSession();
            System.out.println(
    "destory session :" + session.getId());
            ht.remove(session.getId());
        }


        
    // 返回全部session对象集合
        static public Iterator getSet() {
            
    return ht.values().iterator();
        }


        
    // 依据session id返回指定的session对象
        static public HttpSession getSession(String sessionId) {
            
    return (HttpSession) ht.get(sessionId);
        }

        
    }

     测试会话监听的程序index.jsp


    <%@ page contentType="text/html; charset=gb2312" %> 
    <% 
            
    String strName = null;
            
    String strThing = null;
            try {
                strName 
    = request.getParameter("name");
                strThing 
    = request.getParameter("thing");
                
    if ((strName == null) || (strName.length() == 0)) {
                    throw 
    new Exception("null strName");
                }
                
    if ((strThing == null) || (strThing.length() == 0))
                    throw 
    new Exception("null strThing");
                session.setAttribute(
    "name", strName);
                session.setAttribute(
    "thing", strThing);
                response.sendRedirect(
    "display.jsp");
            } catch (Exception e) {
            } 
    %> 
    <html> 
    <head> 
    <title>会话管理</title> 
    </head> 
    <body> 
    <center>会话管理示例</center> 
    <form action="" method="post" >
        
    <table align=''center''> 
            
    <tr> 
                
    <td>名称:</td> 
                  
    <td> <input name="name" type="input"/> </td> 
            
    </tr> 
            
    <tr> 
                
    <td>事件:</td> 
                
    <td> <input name="thing" type="input"/> </td> 
            
    </tr> 
            
    <tr> 
                
    <td align=''right''> </td> 
                
    <td align=''right''> 
                    
    <button type="submit">提交</button> 
                    
    <button type="reset">重置</button> 
                
    </td> 
            
    </tr> 
        
    </table> 
    </form> 
    </body> 
    </html> 

    当访问上面页面时就会出现一个登录框,输入后进入display.jsp显示刚才输入的内容

    会话信息显示的程序 display.jsp


    <%@ page language="java" pageEncoding="GB2312" %> 
    <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> 
    <html> 
    <head> 
    <title>会话控制显示</title> 
    </head> 
    <body bgcolor="#FFFFFF"> 
    <% 
    if (session.isNew()==true){ 
        response.sendRedirect(
    "index.jsp"); 

    out.println(
    "name: "+ session.getAttribute("name"+ "<br>"); 
    out.println(
    "thing: "+ session.getAttribute("thing"+ "<br>"); 
    out.println(
    "session id: " + session.getId() + "<br>"); 
    out.println(
    "create time: " + session.getCreationTime() ); 
    %> 
    <form >
      
    <table>
          
    <tr>
            
    <td><href="session.jsp">管理</a></td>&nbsp;&nbsp;&nbsp;&nbsp;
            
    <td><href="logout.jsp">注销</a></td>&nbsp;&nbsp;&nbsp;&nbsp;
        
    </tr>
      
    </table>
    </form>
    </body> 
    </html> 

    单击管理即进入管理页面session.jsp,单击注销就会进入 会话注销页面 logout.jsp使 HTTP会话无效

    会话管理程序 session.jsp


    <%@ page language="java" pageEncoding="GB2312" %> 
    <%@ page import= "eflylab.*,java.util.*"%> 
    <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> 
    <html> 
    <head> 
    <title>Lomboz JSP</title> 
    </head> 
    <body bgcolor="#FFFFFF"> 
    会话管理
    <br> 
    <table border=''1''> 
    <tr bgcolor=''yellow''> 
    <td>会话 id</td> 
    <td>用户名 </td> 
    <td>事件</td> 
    <td>创建时间 </td> 
    <td>操作</td> 
    </tr> 
    <% 
    Iterator iterator 
    = SessionListener.getSet(); //获得返回全部session对象集合
    while(iterator.hasNext()){ 
        try{ 
            HttpSession session1 
    = (HttpSession)iterator.next(); 
            out.println(
    "<tr>"); 
            out.println(
    "<td>" + session1.getId() + "</td>" ); 
            out.println(
    "<td>" + session1.getAttribute("name"+ "</td>" ); 
            out.println(
    "<td>" + session1.getAttribute("thing"+ "</td>" ); 
            out.println(
    "<td>" + session1.getCreationTime() + "</td>" ); 
            
    %>
            
    <td> <href='end.jsp?sessionid=<%=session1.getId() %>'>销毁</a> </td> 
            
    <%
            out.println(
    "</tr>"); 
            System.out.println(
    "sessionId " + session1.getId()); 
        }catch(Exception ex){ 
            ex.printStackTrace(); 
            return; 
        } 

    %> 
    </table> 
    </body> 
    </html> 

     注销会话的程序 logout.jsp


    <%@ page language="java" pageEncoding="GB2312" %> 
    <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> 
    <html> 
    <head> 
    <title>会话控制</title> 
    </head> 
    <body bgcolor="#FFFFFF"> 
    <% 
    if(session.isNew()!=true){ 
        session.invalidate(); 

    response.sendRedirect(
    "index.jsp"); 
    %> 
    </body> 
    </html> 

     制移除会话的程序 end.jsp


    <%@ page language="java" pageEncoding="GB2312" %> 
    <%@ page import="eflylab.*"%> 
    <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> 
    <html> 
    <head> 
    <title>Lomboz JSP</title> 
    </head> 
    <body bgcolor="#FFFFFF"> 
    <% 
    // 关闭会话,释放资源
    try { 
        
    String strSid = request.getParameter("sessionid"); 
        HttpSession session1 
    = SessionListener.getSession(strSid); //根据ID获取 Session
        
    if (session1!=null){ 
            session1.invalidate(); 
        } 
    } catch (Exception e) { 
        e.printStackTrace(); 

    response.sendRedirect(
    "session.jsp"); 
    %> 
    </body> 
    </html> 

     部署文件 web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
        xmlns
    ="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    >

    <listener>
        
    <listener-class>eflylab.SessionListener</listener-class>
    </listener>
    </web-app>



     


     

    对请求的监听
    在Servlet2.4规范中,新加了一个技术,就是可以监听客户端的请求。一旦能够在监听程序中获取客户端的请求,就可以对请求进行统一处理。比如做一个WEB管理程序,如果在梧桐访问,就可以不登录,如果是远程访问,那么就需要登录。这样我们就可以 监听客户端的请求,从请求中获得客户端地址,并通过这个地址做出对应的处理。
    我们在上面例子的基础上再扩展一下!

    package eflylab;

    import javax.servlet.*;

    public class MyRequestListener 
    implements ServletRequestListener,ServletRequestAttributeListener
    {
        
    //ServletRequestListener
        public void requestDestroyed(ServletRequestEvent sre) 
        
    {
            logout(
    "request destroyed");
        }

        
        
    public void requestInitialized(ServletRequestEvent sre) 
        
    {
            
    //在这个方法里,获得客户端请求对象,然后通过这个请求对象获得访问
            
    //的客户端IP地址。如果该地址是“127”开的,那么就认为它是从本机访问
            
    //就在请求中设置一个isLogin的属性,并且这个属性的值为Boolean(true)
            
    //对象,如果不是从本机访问,那么就必须把这个属性设置成Boolean(false)对象
            
            logout(
    "request init");//日志
            ServletRequest sr=sre.getServletRequest();
              
            
    if(sr.getRemoteAddr().startsWith("127"))
                sr.setAttribute(
    "isLogin",new Boolean(true));
            
    else 
                sr.setAttribute(
    "isLogin",new Boolean(false));
            
            
        }
    //ServletRequestListener
        
        
    //ServletRequestAttributeListener
        public void attributeAdded(ServletRequestAttributeEvent event) 
        
    {
            logout(
    "attributeAdded('" + event.getName() + "', '" +
            event.getValue() 
    + "')");
        }

        
    public void attributeRemoved(ServletRequestAttributeEvent event) 
        
    {
            logout(
    "attributeRemoved('" + event.getName() + "', '" +
            event.getValue() 
    + "')");

        }

        
        
    public void attributeReplaced(ServletRequestAttributeEvent event)
        
    {
            logout(
    "attributeReplaced('" + event.getName() + "', '" +
            event.getValue() 
    + "')");
            
        }
    //ServletRequestAttributeListener
        private void logout(String msg)
        
    {
            java.io.PrintWriter out
    =null;
            
    try
            
    {
                out
    =new java.io.PrintWriter(new java.io.FileOutputStream("c:\request.txt",true));
                out.println(msg);
                out.close();
             }

             
    catch(Exception e)
             
    {
                 out.close();
             }
              
        }
        
    }

        
            

    在MyRequestListener中,实现了对客户端请求和请求中参数设置的监听。要实现这二个监听功能,需要实现ServletRequestListener和ServletRequestAttributeListener接口 。
    如果在本机访问 ,
    则直接调用http://127.0.0.1:8088/test/display.jsp页面,如果在另外机子上访问,则出现登录界面 index.jsp

    ---------------------------------------------------------------------------------------------




  • 相关阅读:
    231. Power of Two
    204. Count Primes
    205. Isomorphic Strings
    203. Remove Linked List Elements
    179. Largest Number
    922. Sort Array By Parity II
    350. Intersection of Two Arrays II
    242. Valid Anagram
    164. Maximum Gap
    147. Insertion Sort List
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3919100.html
Copyright © 2011-2022 走看看