JSP Session处理

    技术2022-05-11  110

    ASP程序员经常要在global.asa文件内处理Application_start,Session_Start

    事件,如:用户验证、重定向不同编码页面等,十分方便,然而一向颇受欢迎的JSP并不很支持这种处理,除了商业化服务器JRun支持global.jsa以外,竟连应用率极高的开放源码服务器Tomcat都不支持,这给JSP的开发造成不小障碍,虽然早期Tomcat(5.0以前版本)下可以通过以下方式实现Session-start事件处理

    1.       添加Session

    session.put(“bind.listener”,new MyListener(getServletContext())

    2.       定义MyListener

    import javax.servlet.http.*;

    import javax.servlet.*;

    public class MyListener implements HttpSessionBindingListener

    {

            ServletContext context;

            public ODSessionListener(ServletContext context)

            {

                   this.context=context;

            }

           

            public void valueBound(HttpSessionBindingEvent event)

            {

                   System.out.println(“bound”);

            }

                  

            public void valueUnBound(HttpSessionBindingEvent event)

            {

                   System.out.println(“unbound”);

            }

    }

     

    但处理前提是Session已经建立,并且不能在Session创建时处理验证等事件,通过研究Servlet 2.4Tomcat5.0内建)终于找到一种可行方法,实现方法如下:

    //---------------------- SessionListener.java----------------------------------------------------

    package listeners;

    import javax.servlet.ServletContext;

    import javax.servlet.ServletContextEvent;

    import javax.servlet.ServletContextListener;

    import javax.servlet.http.HttpSessionAttributeListener;

    import javax.servlet.http.HttpSessionBindingEvent;

    import javax.servlet.http.HttpSessionEvent;

    import javax.servlet.http.HttpSessionListener;

    // ServletRequestListenerServlet2.4新增接口

    import javax.servlet.ServletRequestListener;

    import javax.servlet.ServletRequestEvent;

    import javax.servlet.http.HttpServletRequest;

     

    public final class SessionListener

    implements HttpSessionListener,ServletRequestListener {

    private  HttpServletRequest  request;

    public void requestDestroyed(ServletRequestEvent sre) { }

     

    public  void requestInitialized(ServletRequestEvent sre)

     {

              request=(HttpServletRequest)sre.getServletRequest();

        }

        public void sessionCreated(HttpSessionEvent event) {

            String logMsg=event.getSession().getId()

                +"'  '"+request.getRemoteAddr()

                +":"+request.getRemotePort();

            log("sessionCreated('" + logMsg + "')");

        }

     

        public void sessionDestroyed(HttpSessionEvent event) {

            log("sessionDestroyed('" + event.getSession().getId() + "')");

        }

     

        private void log(String message) {

              System.out.println("SessionListener: " + message);

        }

    }

     

    在开始接到客户端请求(requestInitialized)时,获得当前的HttpRequest对象保存在私有成员 request ,这样在Session创建时可以实现对Session用户进行验证,以及关闭Session,限制IP地址访问等,这里仅以记录Session来源为例(SessionListener.java

    编译这个类后还要在web.xmlhost元素内加入以下行:

      <listener>

        <listener-class>listeners.SessionListener</listener-class>

      </listener>

                  本文适用环境:Tomcat 5.02,J2SE1.41(不支持商业服务器)

     

     


    最新回复(0)