扩展阅读
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?
  •  
    当前位置:  编程语言>java/jsp

    java Servlet实现Session创建存取以及url重写代码示例

     
        发布时间:2013-10-4  


        本文导语:  Session对象的原理在于,服务器可以为客户端创建并维护一个所谓的Session对象,用于存放数据。在创建Session对象的同时,服务器将会为该Session对象产生一个唯一编号,这个编号称之为SessionID,服务器以Cookie的方式将Se...

        Session对象原理在于,服务器可以为客户端创建并维护一个所谓的Session对象,用于存放数据。在创建Session对象的同时,服务器将会为该Session对象产生一个唯一编号,这个编号称之为SessionID,服务器以Cookie的方式将SessionID存放在客户端。当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问。需要注意的是,此时的Cookie中仅仅保存了一个SessionID,而相对较多的会话数据保存在服务器端对应的Session对象中,由服务器来统一维护,这样一定程度保证了会话数据安全性,但增加了服务器端的内存开销。

       存放在客户端的用于保存SessionID的Cookie会在浏览器关闭时清除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个“会话”。在一个“会话”过程中,可能会向同一个应用发出了多次请求,这些请求将共享一个Session对象,因为这些请求携带了相同的SessionID信息。


    1. java Servlet实现Session

    java Servlet用来演示Session的工作原理代码1:


    public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String option = request.getParameter("option");
        if ("create".equals(option)) {
            //获得HttpSession对象
            HttpSession session = request.getSession();
            //设置Session对象的最长不活动间隔
            session.setMaxInactiveInterval(30);
            //获取Session中的数据
            List list = (List) session.getAttribute("list");
            if (list == null) {
                list = new ArrayList();
                list.add("hey");
                //向Session中添加数据
                session.setAttribute("list", list);
            } else {
            list.add("hey");
        }
         out.println(list);
       }elseif ("invalidate".equals(option)) {
           HttpSession session = request.getSession(false);
           if (session != null) {
           //使Session对象失效
           session.invalidate();
       }
    }

    该servlet的url-pattern为/testsession。

    当浏览器请求地址“.../tst/testSession?option=create”时,Servlet调用request的getSession方法获得Session对象,如果此时服务器端存在与请求信息中SessionID(作为Cookie信息携带)对应的Session对象,则返回这个Session对象,否则将会创建一个新的Session对象并将其产生的SessionID以Cookie的形式通过响应信息送回。注意,Session对象的setMaxInactiveInterval方法用于设置最长不活动间隔,单位是秒,如果出现在这个的时间段内Session对象没有被存取,则该Session对象将会失效。通常为了保证服务器的性能和出于安全性考虑,这个值要妥善的设置(Tomcat针对Session的MaxInactiveInterval会有默认的设置)。若setMaxInactiveInterval设置为负值,则表示该Session永不过期。另外,Session对象分别通过setAttributegetAttribute方法存取数据,数据以“名称-对象”对的形式存放。该请求对应的请求和响应的HTTP信息为:

    请求:

    GET /tst/testSession?option=create HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, **
    Accept-Language: zh-cn
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
    Host: 192.168.5.100:8080
    Connection: Keep-Alive
    Cookie: JSESSIONID=C69B3053C575ECC8C7FCAF7D189A4FD1

    响应

    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 12
    Date: Sun, 29 Jun 2008 07:20:41 GMT
    [hey, hey]

    注意:请求信息中携带的SessionID值与上一次相应的SessionID之一致。另外响应输出HTML文本中有两个“hey”,这是因为这次请求Servlet往存放在Session中的list对象中又放置了一个String对象。

    当浏览器请求“.../tst/testSession?option=invalidate”时,Servlet会调用Session对象的invalidate方法用于使该Session对象失效。需要注意的是,此时获取Session对象的方法为重载的getSession(boolean b)其中boolean类型的参数表示当前请求没有和服务器端的某个Session对象关联时是创建新的Session(参数为true时)还是返回null(参数为false时)。


    java Servlet用来演示Session的工作原理代码2:

      下面例子演示如何在HttpServlet中存取Session。 Session实例可以通过HttpServletRequest的getSession()方法获得,此方法会返回一个布尔值来表示是否成功得到了Session。然后我们尝试获得键名为“VisitCounter”的session值,然后将获得的值转换Integer对象。 如果是空则说明session还没有设置,就往session中添加VisitCounter。 否认则对VisitCounter+1并保存到session中。


    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    public class ExampleServlet extends HttpServlet {
        /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
         * @param request servlet request
         * @param response servlet response
         */
        protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            printPageStart(out);
            //Obtain the session object, create a new session if doesn't exist
            HttpSession session = request.getSession(true);
            //Check if our session variable is set, if so, get the session variable value
            //which is an Integer object, and add one to the value.
            //If the value is not set, create an Integer object with the default value 1.
            //Add the variable to the session overwriting any possible present values.
            Integer param = (Integer) session.getAttribute("MySessionVariable");
            if (param != null) {
                session.setAttribute("MySessionVariable", new Integer(param.intValue() + 1));
                param = (Integer) session.getAttribute("MySessionVariable");
            } else {
                param = new Integer(1);
                session.setAttribute("MySessionVariable", param);
            }
            out.println("You have displayed this page <b>" + param.intValue() + "</b> times this session.<br/><br/>");
            out.println("Hit the browsers refresh button.");
            printPageEnd(out);
        }
        /** Prints out the start of the html page
         * @param out the PrintWriter object
         */
        private void printPageStart(PrintWriter out) {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Example Servlet of how to store and retrieve session variables</title>");
            out.println("</head>");
            out.println("<body>");
        }
        /** Prints out the end of the html page
         * @param out the PrintWriter object
         */
        private void printPageEnd(PrintWriter out) {
            out.println("</body>");
            out.println("</html>");
            out.close();
        }
    }


    2、java servlet URL重写

      从上面的介绍可以看出,Session对象的正常使用要依赖于Cookie。如果考虑到客户端浏览器可能出于安全的考虑禁用了Cookie,应该使用URL重写的方式使Session在客户端禁用Cookie的情况下继续生效

     下面有两个jsp页面:1.jsp中向session对象中存入了名为“hi”的一个string类型对象。通过超级链接可以链接到2.jsp,在2.jsp中将获取session中名为“hi”的对象,并显示在页面上。需要注意的是:在1.jsp中超级链接的地址并不是直接写了“2.jsp”而是通过resopnse的encodeURL方法对这个地址进行了处理。

    1.jsp

    <%
    session.setAttribute("hi","Do you work or are you a student?");
    %>
    <a href="/article/<%=response.encodeURL("/article/2.html")%>">2.jsp</a>

    2.jsp

    <%=session.getAttribute("hi")%>


    首先将浏览器的Cookie禁用(注意要重启IE),然后请求1.jsp,响应后点击链接到2.jsp,这个交互过程涉及到两次请求和相应,HTTP信息如下:

    请求1.jsp

    GET /tst/session/1.jsp HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, **
    Referer: http://192.168.5.100:8080/tst/session/1.jsp
    Accept-Language: zh-cn
    UA-CPU: x86
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
    Host: 192.168.5.100:8080
    Connection: Keep-Alive

    响应:

    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=ISO-8859-1
    Content-Length: 33
    Date: Sun, 29 Jun 2008 07:31:36 GMT
    Do you work or are you a student?

    注意:由于Cookie的禁用,这次请求协议头中虽然没有携带SessionID的信息,但SessionID的信息作为请求地址的一部分传到了服务器端,这就是URL重写的意义所在。

    response的encodeURL方法将根据浏览器是否不支持Cookie决定是否将SessionID信息写入链接地址。


    相关文章推荐:
  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
  • java 四舍五入使java保留2位小数示例讲解
  • java进行error捕获和处理示例(java异常捕获)
  • java去除集合中重复元素示例分享 java去除重复
  • java读取csv文件示例分享(java解析csv文件)
  • java求三个数的最大值的示例分享
  • java实现网页解析示例 iis7站长之家
  • java实现网页解析示例
  • java协变返回类型使用示例
  • 使用java执行定时任务示例
  • java自定义枚举转换器示例
  • java向文件末尾添加内容示例分享
  • java正则表达式获取url的host示例
  • java使用正则表达校验手机号码示例(手机号码正则)
  • java实现jframe透明窗体示例
  • java的split方法使用示例
  • java抓取网页数据示例
  • java自定义日期转化类示例
  • java集合map取key使用示例 java遍历map
  • java删除文件夹下所有文件示例分享


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3