Seesion

Posted 上后谈爱情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Seesion相关的知识,希望对你有一定的参考价值。

1.服务器端保持HTTp状态信息的方案,通过SeesionID表示客户端

 

 

 2.保存Seesion 两种方式 cookie 和URL重定向

   Cookie机制可以保存sessionID,在其响应信息中回送一个sessionID,如果cookies被禁用的话 不得不把SeesionID附加到URL路径后面------URL重写:1.作为URL的路径附加信息 2.查询字符串附加到URL后面

 

seesioncookie 不同于普通cookie,session cookie 用来标识客户端与服务器之间的一次会话,当会话结束之后Seesion cookie消失

persisten cookie 存在于硬盘上的一段文本

 

 3.seesion 的生命周期:session 保持客户端与服务器之间的一次会话

   1.创建:是否浏览器访问服务器的任何一个JSP会产生一个session对象吗:

         不一定,在访问并没有让服务器产生一个Seesion,

                        1).当前JSP是客户端访问的第一个资源对象但是页面属性上 Seesion=false,服务器不会JSP创建Seesion

                        2).当前JSP不是访问的第一个资源,并且其他页面已经创建HttpSeesion对象,访问当前页面不会创建新的        Seesion,使用之前已经创建session(表示同一个会话)

        3).servlet :若servlet 客户端浏览器访问第一个WEB应用资源,则只有调用request.getSeesion(true)才会         创建Seesion对象

 2.销毁:

      session.invalidate() ;

      2).超过设定session时间:session.setMaxInactiveInterval(5)  单位S

            web.xml 设定HttpSeesion :appach/config/web.xml

在Session中最重要属性是 setAttribute() 和getAttribute() 这两个属性,set属性让多个JSP在一个会话中共用一个SessionID,不需要在URL后面添加SessionID(URL重写)

4. response.encodeURL()--将Jssion写入URL中


5. 开发时候建议编写“绝定路径”,写绝对路径一般没有问题,相对路径有可能会出现问题

   相对路径,a.jsp 是b,c.jsp的上级目录中,有时候不能通过超链接,通过Servlet转发到JSP,在转发过程出现问题(MVC方式),不建议在JSP中直接连接SQL,在Servlet中只能使用转发 功能转到其他目录下JSP

  A.jsp--href---》Servlet---转发--》b.jsp ----href-->c.jsp   b和c在同一路径不在根目录下

分析:在转发过程中,服务器内部转发,在客户端显示还是/testServlet 根目录下路径,如果b.jsp中c.jsp 不在根目录下在根子目录下,查找时候出现问题。

 解决方案:所以在b.JSP超链接修改成 <a href="<%request.getContextPath()%>/path/c.jsp"> 去C.JSP</a>

      在这里重定向的话必须加上绝对路径 response.sendRedirect(request.getContextPath()+"path/b.jsp")

     明显Servlet使用重定向爆出 严重的安全隐患,将服务器根目录直接爆了,使用访问SQL结果显示给JSP时候只能采用转发方式       

      2). / 问题:

                     1.当前WEB的根路径: 请求转发request.sendDispatcher("/path/b.jsp").forward(request,response);

                  WEB中web.xml文件中映射testServlet  <url-pattern>/TestServlet</url-pattern>

        2.当前WEB站点路径:超链接  ,action ,请求重定向response.sendRedirect

 

若/ 需要容器Tomcat处理表示根目录,;若/交由浏览器处理当前站点   站点表示当前客户端所处目录

 

 


6.Session 避免保单重复提交:

    1. Servelet使用转发策越,时候浏览器保存之前URL,在成功页面上 刷新时候会再一次提交数据

    2.在响应没有到达时,登录页面上重复点击提交按钮

    3.提交成功后点击返回到登录页面,在点击提交

不是重复提交:点击返回,在刷新相当于开了一个新页面,不算重复提交,相当于开新页面。

    2).如何避免:

     给保单做标记与提交Servlet时候,检查标记是否一致,若一致受理请求,并且销毁标记,不一致没有标记,响应提示信息重复提交

 

如下:是第一种情况

1 <form action="<%= request.getContextPath()%>/tokenServlet" method="post">
2                    name:<input type="text" name="username"/>
3                    <input type="submit" value="Submit"/>
4             </form>
View Code

Servlet中请求转发的情况:

1     String name=request.getParameter("username");
2         System.out.println("username"+name);
3         //app_1下success.jsp 
4         request.getRequestDispatcher("/app_1/success.jsp").forward(request,response);
View Code

 


    

     重定向客户重定向到成功页面,不会出现重复提交

 

 解决方法:只能通过Session进行避免标单重复,使用request进行标记时候在submit提交JSP会刷新,导致request被销毁在Servlet无法得到其中属性:

 1 <form action="<%= request.getContextPath()%>/tokenServlet" method="post">
 2                  <!-- <input type="hidden" name="token" value="atug">-->
 3                  <%
 4                     // request.setAttribute("token","tokenvalue");
 5                     //这里设定属性,在submit之后直接进入到 重复提交页面 
 6                      //原因:表单提交相当于刷新,原来request被销毁了,直接进入到null
 7                 
 8                      //将标记放在session中
 9                       session.setAttribute("token", "tokenvalue");
10                     %>
11                  
12                    name:<input type="text" name="username"/>
13                    <input type="submit" value="Submit"/>
14             </form>
 1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         // TODO Auto-generated method stub
 3         String name=request.getParameter("username");
 4         
 5         HttpSession session=request.getSession();
 6         
 7         String token=(String) session.getAttribute("token");
 8         
 9         System.out.println("token: "+token);
10         if(token!=null )
11         {
12             session.removeAttribute("token");
13         }
14         else
15         {
16             response.sendRedirect(request.getContextPath()+"/app_1/took.jsp");
17             return;
18         }
19         
20         //app_1下success.jsp 
21         //request.getRequestDispatcher("/app_1/success.jsp").forward(request,response);
22         response.sendRedirect(request.getContextPath()+"/app_1/success.jsp");
23     }

修改:利用session 防止表单重复提交时候, 原表单中生成随机数,将原表单页面放入隐藏中

 1 <%
 2          String tokenvalue=new Date().getTime()+"";
 3          session.setAttribute("token", tokenvalue); 
 4        %>
 5             <form action="<%= request.getContextPath()%>/tokenServlet" method="post">
 6              <!-- 隐藏的值,传输随机生成值与之前的进行对比 -->
 7               <input type="hidden" name="token" value=<%=tokenvalue %>>
 8   
 9                    name:<input type="text" name="username"/>
10                    <input type="submit" value="Submit"/>
11             </form>
 1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         // TODO Auto-generated method stub
 3         String name=request.getParameter("username");
 4         
 5         HttpSession session=request.getSession();
 6         
 7         String token=(String) session.getAttribute("token");
 8         String tokenvalue=request.getParameter("token");
 9         System.out.println("token: "+token);
10         
11         // s使用隐藏标签 获取随机的值
12         if(token!=null && token.equals(tokenvalue) )
13         {
14             session.removeAttribute("token");
15         }
16         else
17         {
18             response.sendRedirect(request.getContextPath()+"/app_1/took.jsp");
19             return;
20         }
21         
22         //app_1下success.jsp 
23         //request.getRequestDispatcher("/app_1/success.jsp").forward(request,response);
24         response.sendRedirect(request.getContextPath()+"/app_1/success.jsp");
25     }

7.利用Session实现一次性验证码:

  实现步骤与防止重复提交一致:

    --> 在原表单中图片中字符串先放入到session

   ---> 原表单中定义文本域,用于输入验证码

  ----> 将Session字符串与文本域中字符相比较,相同受理请求同时去除原来属性

以上是关于Seesion的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper源码阅读 Seesion

COOKIE和SEESION的配合使用

lnt+memcache实现seesion共享

php中session入库(mysql)机制

Django Cookie和Seesion

cookie,seesion学习