zoukankan      html  css  js  c++  java
  • 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字符串与文本域中字符相比较,相同受理请求同时去除原来属性

  • 相关阅读:
    MVC 【Razor 视图引擎】基础操作 --页面跳转,传值,表单提交
    MVC 【ASPX视图引擎】
    js弹出对话框的方法总结
    MVC 基础
    [转]C#中Split用法~
    对话框控件延伸文本框制作
    WinForm LIstView
    WinForm多窗体间操作
    WinForm 控件ComboBox数据绑定
    WinForm布局
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/6686206.html
Copyright © 2011-2022 走看看