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

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




  • 相关阅读:
    python bif 如何自学
    python萌新应知应会
    Animation
    响应式布局
    浏览器兼容
    HTML基础
    SublimeText 3 Emmet Hot Keys
    Web大前端环境搭建
    Sublime Text 运行js
    bash脚本编程基础
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3919100.html
Copyright © 2011-2022 走看看