• 传智播客JavaWeb day05-session、url重写


    1.session是什么

      1.1 session是一种会话技术  ps:还有一种是cookie

    2.session的作用

      2.1 服务器端会话范围内的数据共享

    3.session的生命周期

      3.1何时创建    request.getSession()时创建(因为session与cookie有关)

      3.2 销毁(三种销毁方式)

        3.2.1 默认30分钟过期

        3.2.2 写一个方法销毁 invalidate()

        3.2.3 服务器非正常关闭

    4.session的钝化与还原

      4.1 钝化

        当服务器正常关闭的时候,内存中的session会保存在一个文件里面(apache服务器是在work工作目录下)

      4.2 还原

        当服务器正常关闭后再次启动时,服务器端未过期的session会恢复到内存中

    5.session的原理(JsessionId)

      当客户端与服务器进行会话时,服务器会判断request的cookies中是否包含一个JSessionId的这样一个cookie,如果没有就创建一个,有的话就用来区分用户,操作session 

    6.问题:服务器怎么区分当前访问是来自于哪个用户   答:就用利用从客户端传来的JesessionId

    7.问题引申(思考):当客户端禁用cookie是怎么办?  答:当客户端禁用cookie后,那么服务器端的session也不能用了,因为session是基于cookie技术实现的;这样基于session的一些功能都不能用了,比如利用session功能实现的购物功能,那么我们要通过其他的方式来识别用户,这是就有url重定向。url重定向是将sessionid写在url里面作为url的参数,同样可以实现区分用户的目的

    8.问题:利用session实现购物、付款功能,且当用户关闭浏览器后还能结算

      8.1 知识点:session的应用;session是基于cookie实现的,而普通的cookie是会话级别的当浏览器关闭的时候cookie也就销毁了,现在需求是想当浏览器关闭后再次打开的时候还能进行结算的话,也就是关闭前和再次打开时Jsessionid值是一个,也就是说要把名字为JSessionId的cookie保存到浏览器临时文件中去

    9.session举例:购物付款

    补充:怎么设置session的timeout时间   java和.net 都是在web配置文件中设置

    url重写

    1.什么是url重写

      首先获取到一个url,然后将该url重写成需要的url

    2.url重写的应用场景

      当浏览器端禁用cookie的时候,用来传递JSessionId

    3.禁用cookie的后果

      3.1 浏览器端将不接收任何的cookie

      3.2 服务器端基于session工作的模块都将失效

      3.2 服务器可能会爆内存。原因是基于session存取数据的模块,会因为客户端不断刷新页面,不断的向session中存取数据而导致内存爆满。

    4.request.getSession()

      这个函数非常的智能。首先它会去cookie中找名为JsessionId的cookie,如果没有找到然后去url中名为JsessionId的参数如果还没有找到就重新创建一个cookie

    5.response.URLEncoding(url)

      同样,这个函数也非常的智能。如果它发现有从浏览器端传过来任何的cookie,则不会在url上加上JsessionId的参数,否则就会加上(所有第一次访问页面时,使用了该函数url会加上JSessionId参数)

    6.案例

      6.1防止表单提交

        防止表单提交的方案目前有这么几种,js判断、提交后禁用提交控件和session防止表单提交

        6.1.1 js判断   

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'formsubmit.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    <script type="text/javascript">
    var flag = true;
    function canSubmit(){
    if(flag){
    flag = false;
    return true;
    }
    alert("请勿重复提交!");
    return false;
    }
    </script>
      </head>
      
      <body>
      <form action="${pageContext.request.contextPath}/servlet/FormSubmitServlet" method="post" onsubmit="return canSubmit()">
        用户名:<input type="text" name="username"/> <br>&nbsp码:<input type="password" name="password"/><br>
      <input type="submit" value="注册"/>
      </form>
      </body>
    </html>
    View Code

        6.1.2 提交后让按钮禁用(这个简单就不贴代码了)

        6.1.3 session防止表单重复提交(原理就是来一个标记,一个口令来记录表单是否已经提交,用session实现就是先生成一个标记存在session中并返回到浏览器端,第一次提交后对口令,然后去掉session中的口令,这样当第二次提交过来的表单要求对口令时session的口令为空了,所有就当做是第二次提交表单) ps:这里用了一个随机数存在session中,客户端用一个隐藏的input来保存随机数,然后随表单一起提交到服务器

    JSP中:

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'formsubmit.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    <script type="text/javascript">
    var flag = true;
    function canSubmit(){
    if(flag){
    flag = false;
    return true;
    }
    alert("请勿重复提交!");
    return false;
    }
    </script>
      </head>
      <%
      Random r = new Random();
      int validNum = r.nextInt();
      request.getSession().setAttribute("validNUm", validNum);
       %>
      <body>
      <form action="${pageContext.request.contextPath}/servlet/FormSubmitServlet" method="post" >
        用户名:<input type="text" name="username"/> <br>&nbsp码:<input type="password" name="password"/><br>
      <input type="hidden" name="validNUm" value="<%=validNum%>" />
      <input type="submit" value="注册"/>
      </form>
      </body>
    </html>
    View Code

    Servlet中:

    public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            try {
                Thread.sleep(4*1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            response.setContentType("text/htm;charset=utf-8");
            String validNum1 = request.getParameter("validNUm");
            String validNum2 = request.getSession().getAttribute("validNUm").toString();
            if(validNum2!=null &&!"".equals(validNum2)&&validNum2.equals(validNum1)){
                response.getWriter().write("第一次注册");
                request.getSession().removeAttribute("validNUm");
            }
            else{
                response.getWriter().write("请勿重复提交!"+validNum1+validNum2);
            }
        }
    View Code

        

  • 相关阅读:
    MathML
    Redux counterpart rematch dva
    flow
    pauseable 库
    a simple machine learning system demo, for ML study.
    react图工具集成
    SQLite
    Celery
    RabbitMQ installation
    Thunk
  • 原文地址:https://www.cnblogs.com/lihongchen/p/4328588.html
Copyright © 2020-2023  润新知