zoukankan      html  css  js  c++  java
  • HttpSession

    (Cookie是用来设置浏览器保存数据的时间的;

       Session是只要浏览器不关闭,数据则会存在,一旦关闭浏览器数据即消失

    1. HttpSession概述
    * HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端对象(Cookie是存在于客户端),保存在服务器端!!!
    * HttpSession是Servlet三大域对象之一(request(一个请求一个request,可用请求转发获得数据request.getRequsetDispatcher("").forword(request,response);,不可以用响应重定向获得数据 response.sendRedirect("");)、session(一个用户从打开浏览器到关闭浏览器,所以在写项目中一般不用session存取数据,因为浏览器一关闭,数据就会清空,但是像验证码、登陆界面一般用session,因为不需要保存上一次的访问结果,所有的请求在一个session中)application(ServletContext)(程序不死,application不死)),所以它也有setAttribute()、getAttribute()、removeAttribute()方法
    * HttpSession底层依赖Cookie,或是URL重写!!!

    2. HttpSession的作用
    * 会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束!
    > 会话:一个用户对服务器的多次连贯性请求!所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器!
    * 服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,它们被服务器保存到一个Map中,这个Map被称之为session缓存!
    > Servlet中得到session对象:HttpSession session = request.getSession();
    > Jsp中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用!<%session.setAttribute("name","asas")%>
    * session域相关方法:
    > void setAttribute(String name, Object value);
    > Object getAttribute(String name);
    > void removeAttribute(String name);

    3. 案例1:演示session中会话的多次请求中共享数据
    * AServlet:向session域中保存数据
    * BServlet:从session域中获取数据
    * 演示:
    > 第一个请求:访问AServlet
    > 第二个请求:访问BServlet

    4. 案例2:演示保存用户登录信息(精通)
    * 案例相关页面和Servlet:
    > login.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 'login.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">
    -->

    </head>

    <body>
    <h1>登陆界面</h1>
    <%
    /*
    读取名为uname的Cookie!
    如果为空显示:""
    如果不为空显示:Cookie的值
    */
    String uname = "";
    Cookie[] cs = request.getCookies();//获取请求中所有的cookie
    if(cs != null) {// 如果存在cookie
    for(Cookie c : cs) {//循环遍历所有的cookie
    if("uname".equals(c.getName())) {//查找名为uname的cookie
    uname = c.getValue();//获取这个cookie的值,给uname这个变量
    }
    }
    }
    %>

    <%
    String message="";
    String m=(String)request.getAttribute("xx");//获取request域中的名为msg的属性
    if(m !=null){
    message=m;
    }
    %>
    <font color="red"><b><%=message %></b></font>
    <form action="LonigServlet" method="post">
    用户名: <input type="text" name="username" value="<%=uname%>"/><br/>
    密码 :<input type="password" name="password"/><br/>
    <input type="submit" value="提交"/>
    </form>
    </body>
    </html>


    > succ1.jsp:只有登录成功才能访问的页面

    <body>
    成功登陆<br>
    <%
    String username=(String)session.getAttribute("username");
    if(username==null||username==""){
    request.setAttribute("xx","请先登陆!!!");
    request.getRequestDispatcher("login.jsp").forward(request,response);
    }
    %>
    欢迎<%=session.getAttribute("username") %>登录成功!!!
    </body>


    > succ2.jsp:只有登录成功才能访问的页面
    > LoginServlet:校验用户是否登录成功!

    package com.session.Servlet;

    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    public class LonigServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    this.doPost(request, response);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    String username=request.getParameter("username");
    String password=request.getParameter("password");
    //校验用户名和密码
    if(!"zs".equalsIgnoreCase(username)){//登陆成功
    /**
    * 附加项:利用Cookie将用户名保存到浏览器
    */
    /* Cookie cookie=new Cookie("uname",username);//创建Cookie
    cookie.setMaxAge(60*60*24);//设置cookie的保存时间为一天
    response.addCookie(cookie);//保存Cookie
    */
    Cookie cookie = new Cookie("uname", username);//创建Cookie
    cookie.setMaxAge(60*60*24);//设置cookie命长为1天
    response.addCookie(cookie);//保存cookie

    /*
    * 获取session
    * 保存信息到session
    * 重定向到succ1.jsp
    */
    HttpSession session=request.getSession();
    session.setAttribute("username", username);
    response.sendRedirect("succ1.jsp");
    }else{//登陆失败
    /**
    * 保存信息到request
    * 转发到succ2.jsp
    */
    request.setAttribute("xx", "用户名或密码错误");
    request.getRequestDispatcher("login.jsp").forward(request, response);
    }

    }

    }


    * 各页面和Servlet内容:
    > login.jsp:提供登录表单,提交表单请求LoginServlet
    > LoginServlet:获取请求参数,校验用户是否登录成功
    <> 失败:保存错误信息到request域,转发到login.jsp(login.jsp显示request域中的错误信息)
    <> 成功:保存用户信息到session域中,重定向到succ1.jsp页面,显示session域中的用户信息
    > succ1.jsp:从session域获取用户信息,如果不存在,显示“您还没有登录”。存在则显示用户信息
    > succ2.jsp:从session域获取用户信息,如果不存在,显示“您还没有登录”。存在则显示用户信息

    只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就一起存在!那么用户访问succ1和succ2就会通过!

    5. HttpSession原理(理解)
    * request.getSession()方法:
    > 获取Cookie中的JSESSIONID:
    <> 如果sessionId不存在,创建session,把session保存起来,把新创建的sessionId保存到Cookie中
    <> 如果sessionId存在,通过sessionId查找session对象,如果没有查找到,创建session,把session保存起来,把新创建的sessionId保存到Cookie中
    <> 如果sessionId存在,通过sessionId查找到了session对象,那么就不会再创建session对象了。
    <> 返回session
    > 如果创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就一直存在。
    > 下次请求时,再次执行request.getSession()方法时,因为可以通过Cookie中的sessionId找到session对象,所以与上一次请求使用的是同一session对象。

    * 服务器不会马上给你创建session,在第一次获取session时,才会创建!request.getSession();

    * request.getSession(false)、request.getSession(true)、request.getSession(),后两个方法效果相同,
    > 第一个方法:如果session缓存中(如果cookie不存在),不存在session,那么返回null,而不会创建session对象。

    6. HttpSession其他方法:
    * String getId():获取sessionId;
    * int getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session;
    * void invalidate():让session失效!调用这个方法会被session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新session的sessionId;
    * boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新。

    7. web.xml中配置session的最大不活动时间
    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>

    8. URL重写(理解)

      就是把所有的页面中的路径,都使用response.encodeURL("..")处理一下!

    * session依赖Cookie,目的是让客户端发出请求时归还sessionId,这样才能找到对应的session
    * 如果客户端禁用了Cookie,那么就无法得到sessionId,那么session也就无用了!
    * 也可以使用URL重写来替代Cookie
    > 让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionId
    > 这样服务器可以通过获取请求参数得到sessionId,从而找到session对象。
    * response.encodeURL(String url)
    > 该方法会对url进行智能的重写:当请求中没有归还sessionid这个cookie,那么该方法会重写url,否则不重写!当然url必须是指向本站的url。

    9. 一次性图形验证码
    * 编写VerifyCode,用来生成一次图形验证码
    * 编写VerfiyServlet:
    > 使用VerfiyCode来生成图形验证码
    > 把文本保存到session中
    > 把图片响应给客户。
    * 在login.jsp页面中
    > <img>元素请求VerfiyServlet,页面中显示图形验证码
    > 表单给出用户输入的验证码
    * 在LoginServlet中
    > 获取用户输入的验证码,请求参数!!!
    > 获取session中保存的真正的验证码文本,这是在打开login.jsp时已经保存到session中的
    > 比较用户输入的验证码与session中真正的验证码

  • 相关阅读:
    leetcode 18 4Sum
    leetcode 71 Simplify Path
    leetcode 10 Regular Expression Matching
    leetcode 30 Substring with Concatenation of All Words
    leetcode 355 Design Twitte
    leetcode LRU Cache
    leetcode 3Sum
    leetcode Letter Combinations of a Phone Number
    leetcode Remove Nth Node From End of List
    leetcode Valid Parentheses
  • 原文地址:https://www.cnblogs.com/wangleBlogs/p/4661924.html
Copyright © 2011-2022 走看看