JavaWeb07.服务器与客户端存储

回顾:JavaWeb06.点击量&模糊查询&评论功能

目录

session对象

1.概念

2.Session的运行机制

3.Session对象的生命周期

3.1 创建

3.2 使用

3.3 消亡

4.设置页面是否使用Session管理会话

5. 设置Session对象的有效期

6. HttpSession与URL重写

7. Session对象的判断

cookie对象

1.概念

2.查看网站的cookie

3.Cookie的作用

4.安全性能

5.Cookie使用

   5.1 通过page指令导入包(可省略)

  5.2 创建

  5.3 写入(将Cookie响应到客户端)

  5.4 关于Cookie的删除

6.Cookie常用方法

实现七天免登录


session对象

1.概念

session在网络中被称为会话。
由于HTTP协议(超文本传输协议)是一种无状态协议,也就是当一个客户向服务器发出请求,服务器接收请求,并返回响应后,该连接就结束了,而服务器并不保存相关的信息。
为了弥补这一缺点,HTTP协议提供了Session。

通过Session可以在应用程序的WEB页面间进行跳转时,保存用户的状态,使整个用户会话一直存在下去,直到关闭浏览器。

但是,如果在一个会话中,客户端长时间不向服务端发出请求,Session对象就会自动消失。这个时间取决于服务器,例如,Tomcat服务器默认为30分钟。不过这个时间可以通过编写程序进行修改。

实际上,一次会话的过程也可以理解为一个打电话的过程。通话从拿起电话或手机拨号开始,一直到挂断电话结束,在这个过程中,可以与对方聊很多话题,甚至重复的话题。一个会话也是这样,可以重复访问相同的Web页。


Session就是会话(客户端的一次请求,服务端的一次响应)。
  Session用于跟踪客户的状态。
  Session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。
  在一个Session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。


2.Session的运行机制

当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息(例如购物车)。
  Servlet容器为HttpSession分配一个唯一标识符,称为Session ID。
  Servlet容器把Session ID作为Cookie保存在客户的浏览器中。
  每次客户发出HTTP请求时,Servlet容器可以从HttpServletRequest对象中读取Session ID,然后根据Session ID找到相应的HttpSession对象,从而获取客户的状态信息。

3.Session对象的生命周期

Session对象的生命周期:创建 --> 使用 --> 消亡

3.1 创建

当客户端浏览器第一次访问服务器时,服务器为这个浏览器创建一个Session对象。
      在服务器端使用request.getSession()或request.getSession(true)方法来获得Session对象。
    request.getSession()    --获得Session对象
    session.getId()        --获得session对象的ID

    例:HttpSession sess=request.getSession();    //获取Session对象


3.2 使用

创建Session对象后,使用Session对象进行数据的存取和传输。
    session.setAttribute(String name, Object obj)    --将信息保存在session范围内
    session.getAttribute(String name)        --获取保存在session范围内的信息
    session.getAttributeNames();     --返回Session对象中存储的每一个属性对象,枚举型
    session.isNew()            --判断session对象是不是新的

    具体过程:
    a. 将产生的sessionID存入到Cookie中;
    b. 当客户端再次发送请求时,会将sessionID和request一起传送给服务器端;
    c. 服务器根据请求过来的SessionID与保存在服务端的Session对应起来,判断是否为同一个Session。


    注意:getAttribute()方法返回的是Object对象,如果将获取的信息赋值给String类型的变量,则需要进行强制类型转换或调用其toString()方法,例如,下面的两行代码都是正确的。
    String user = (String)session.getAttribute("username");
    String user1 = session.getAttribute("username").toString();

3.3 消亡

以下3种方法可以结束session对象:
    a. 关闭浏览器;
    b. 请用HttpSession的invalidate()方法;
    c. session超时。


4.设置页面是否使用Session管理会话

<%@page session="false"%>            //表示该JSP页面的Session不可用,默认是true
  sess.setAttribute("username","Join");
  sess.getAttribute("username");


  方法:
  getCreationTime();        //返回Session被创建的时间.单位毫秒
  invalidate();            //设置session无效,一般用在[安全退出]
  removeAttribute("key");    //删除属性

5. 设置Session对象的有效期

a. 调用setMaxInactiveInterval(long n)进行设定;
b. 在web.xml中修改:
    <session-config>
     <!-- 会话超时间长为30分钟 -->
         <session-timeout>30</session-timeout>
    </session-config>

6. HttpSession与URL重写

URL重写是用在客户端不支持Cookie的情况下,它的实现方式是将Session ID添加到URL中,服务器通过解析重写后的URL获取Session ID,这样即使客户端不支持Cookie,也可以用Session来记录状态信息。
    response.encodeURL("login.jsp");
    或者
    response.sendRedirect(response.encodeRedirectURL("login.jsp"));
    两种方法效果一样,如果客户端支持Cookie,则生成的URL不变;如果不支持,生成的URL中会带有“login.jsp;jession=……?username=join”字符串的地址。

    response.sendRedirect("a.jsp");

7. Session对象的判断

在登录后的JSP页面文件中,通过Session来做是否已登录的判断。
      String username=session.getAttribute("username");
      if(username==null){
      response.sendRedirect("login.jsp");
      }


cookie对象

1.概念

 Cookie的中文意思是“小甜饼”,然而在互联网上的意思与这就完全不同了。它和食品完全没有关系。
    在互联网中,Cookie是小段的文本信息,在网络服务器上生成,并发送给浏览器。通过使用cookie可以标识用户身份,记录用户名和密码,跟踪重复用户等。浏览器将cookie以key/value的形式保存到客户机的某个指定目录中。
    通过cookie的getCookie()方法即可获取到所有cookie对象的集合;
    通过cookie对象的getName()方法可以获取到指定名称的cookie;
    通过getValue()方法即可获取到cookie对象的值。
    另外,将一个cookie对象发送到客户端,使用response对象的addCookie()方法。


    注意:在使用cookie时,应保证客户机上允许使用cookie。这可以通过在IE浏览器中选择“工具”/“Internet选项”命令,在打开对话框的“隐私”选项卡中进行设置。

  (可以理解客户通过浏览访问服务器时,服务器利用浏览器在客户端上生成了一个文本,该文本用来存储用户的系列信息。)

2.查看网站的cookie

    地址栏输入javascript:alert (document. cookie)
    cookie所在的位置:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies

3.Cookie的作用

  a. 对特定对象的追踪;
  b. 统计网页浏览次数;
  c. 简化登录。

4.安全性能

   容易信息泄露。
   --文本,可破解,安全性不高
   --Cookie具备加密

5.Cookie使用

   5.1 通过page指令导入包(可省略)

  <%@ page import="javax.servlet.http.Cookie" %>

  5.2 创建

  Cookie newCookie=new Cookie("key",value);

  5.3 写入(将Cookie响应到客户端)

  response.addCookie(newCookie)


 提示:
  a. 在创建Cookie后,如未设置Cookie有效期,则该Cookie只保存在浏览上,当浏览重启后,之前设置的Cookie就不在了,如这时用getCookies()方法取就是null,因此会报NullPointerException异常。

     临时Cookie----保存在浏览器上的Cookie。它随着浏览器的关闭而消失。
     要想Cookie真正保存在客户端上,就必须设置Cookie的保存时间。

  b. Internet临时文件设置,如勾上,则会清掉cookie。


  5.4 关于Cookie的删除

  <别人跑你家里来抢垃圾桶>
  Cookie是保存在客户端电脑上的文件,如果服务器可以直接通过代码来清除客户端上的文件,那将是个非常可怕的事情,因为客户端已经变成“肉鸡”了。
  所以,客户端的Cookie不能由服务器代码来删,而是客户端自己删。

  Cookie不能通过代码删,但可以通过代码设置它无效:即设置它的有效时间。

  <%
    Cookie[] cooks=request.getCookies()
    if(cooks!=null){
        for(Cookie c:cooks){
        if(c.getName().equals("uname")){
            c.setMaxAge(0);    //设置Cookie有效期0秒
            response.addCookie(c);
        }
        }
    }
    response.sendRedirect("/login.jsp");
  %>

6.Cookie常用方法

  void        setMaxAge(int e)    //设置Cookie有效期,单位秒,正数为多少秒后失效
                      负数表示当浏览器关闭时,Cookie将会被删除(争议)。
  int        getMaxAge()        //获取Cookie有的效时间,单位秒
  void        setValue(String value)    //在Cookie创建后,对Cookie进行赋值
  String    getValue()        //获取Cookie的值
  String    getName()        //获取Cookie的名称
  Cookie[]    getCookies()        //获取Cookie中所有的属性名


实现七天免登录

登录界面login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
    <style>
        * {
            outline: none !important;
        }
        html,
        body {
            background: #1abe9c;
        }
        form {
            width: 300px;
            background: #ebeff2;
            box-shadow: 0px 0px 50px rgba(0, 0, 0, .5);
            border-radius: 5px;
            padding: 20px;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
        }
        .btn-group {
            width: 100%;
        }
        .btn-group button {
            width: 50%;
        }
    </style>
    <%
    	String yh="";
    	String mm="";
    	//request.getCookies();//拿到Cookie数组
    	//为了防止前端没有Cookie而报的空指针:
    	if(request.getCookies()!=null)
    	//遍历
    	for(Cookie cookie : request.getCookies()){
    		//拿出用户名,密码的COOKIE:如果Cookies的数据名和输入框的一致就赋值
    		if(cookie.getName().equals("yh")){
    			yh=cookie.getValue();
    		}
    		if(cookie.getName().equals("mm")){
    			mm=cookie.getValue();
    		}
    	}
    %>
</head>
<body>
    <form action="doLogin.jsp" method="post" id="myForm">
        <h3 class="text-center">欢迎使用新闻管理</h3>
        <div class="form-group">
        <!--将得到的名字密码自动填入输入框:value-->
            <input value=<%=yh %> name="yh" type="text" class="form-control" id="username" placeholder="请输入您的用户名">
        </div>
        <div class="form-group">
         <!--将得到的名字密码自动填入输入框:value-->
            <input value=<%=mm %> name="mm" type="password" class="form-control" id="password" placeholder="请输入您的密码">
        </div>
        <div class="btn-group">
            <button type="submit" class="btn btn-primary">登录</button>
            <button type="button" class="btn btn-danger" onclick='location=href="register.jsp"'>没有账号?</button>
        </div>
    </form>
    <script>
    &("myForm").submit(()=>{
    	if($("#username").val().length==0){
			alert("用户名不能为null")
			return false //不提交的
		}
		if($("#password").val().length==0){
			alert("密码不能为null")
			return false //不提交的
		}
		return true
    })
    </script>
</body></html>

处理登录界面 doLogin.jsp

<%@page import="javax.servlet.http.Cookie"%>
<%@page import="java.net.CookieHandler"%>
<%@page import="oracle.jdbc.driver.OracleDriver" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.nio.charset.StandardCharsets" %>
<%@ page import="java.util.Arrays" %>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%
    request.setCharacterEncoding("utf-8");
    String yh = request.getParameter("yh");
    String mm = request.getParameter("mm");
    try {
        //加载驱动
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //定义连接字符串
        String url = "jdbc:oracle:thin:@localhost:1521:orcl";
        //获得连接
        Connection con = DriverManager.getConnection(url, "scott", "123");
        //获得执行对象
        PreparedStatement ps = con.prepareStatement("select * from t1_user where t_name=? and t_pwd=?");
        ps.setString(1, yh);
        ps.setString(2, mm);
        //获得结果集
        ResultSet rs = ps.executeQuery();
        //判断结果
        if (rs.next()) {
        	//1,将用户名存入到服务器的卡库session中/存到后端
        	//session.setAttribute("uname", yh);//在卡库中开一个空间储存数据session.setAttribute("数据名", 数据值);(红色圈)
            //2,cookie的值每次发送请求的时候会被自动带上,不会在路径上传递数据
            //cookie默认是在你当前浏览器打开的过程中生生效,浏览器不关,Cookie就不会消失
            Cookie c=new Cookie("yh",yh);//导包:javaX
            //设置前端数据的存活时间,单位:秒,填-1代表浏览器一打开就生效
            //60s*60*24h*7day:7天
           	c.setMaxAge(60*60*24*7);
            Cookie c1=new Cookie("mm",mm);
        	c1.setMaxAge(60*60*24*7);
            //将c,c1存到前端:
            	//response:响应对象:服务器->客户端
            response.addCookie(c);//响应中有两个Cookie,将yh,mm存入前端
            response.addCookie(c1);
            //7天免登录见登录界面:
        	// localhost:8080/当前项目/news/index.jsp
            //转发:request.getRequestDispatcher("index.jsp").forward(request, response);
     		//重定向:
     		response.sendRedirect("index.jsp");//所以主界面要在卡库中拿数据
        } else {
            //重定向 客户端
            response.sendRedirect("login.jsp");
        }
        //资源关闭
        if (!con.isClosed()) {
            con.close();
        }
        ps.close();
        rs.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
%>

历史记录查询 history.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<%@ page import="java.net.URLDecoder" %>
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta content="width=device-width, initial-scale=1" name="viewport">
    <link href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css" rel="stylesheet">
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
    <script src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
</head>
<body>
<nav class="navbar navbar-default hidden-sm hidden-xs">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" style="font-size: 25px;">当前是您的浏览记录</a>
        </div>
        <ul class="nav navbar-nav navbar-right" style="margin-right: 20px;">
            <li><a href="${pageContext.request.contextPath}/news/index.jsp">返回首页</a></li>
        </ul>
    </div>
</nav>
 
<div class="container">
    <ul class="list-group">
        <%
            //7天历史记录:从cookie中取历史记录
            String ls="";
            for (Cookie cookie : request.getCookies()) {//浏览器向服务器发送request时会自动发送Cookies数据
                if(cookie.getName().equals("historyList")){
                    ls= URLDecoder.decode(cookie.getValue(),"utf-8");//在历史记录中解码改为中文 
                }
            }
            System.out.println(ls);
            //session:7天历史记录
            //从session中拿历史记录的信息
            Object obj = session.getAttribute("historyList");
            if(obj!=null){//当存在历史记录时再转成集合
                List<String> historyList=(List<String>)obj;
                for (int i=historyList.size()-1;i>=0;i--) { //用fro循环倒着来
                	 //System.out.println(historyList.get(i));
                    String[] ss=historyList.get(i).split("@");//title@count根据@切割
                    //切割报错在前面打印
        %>
        <li class="list-group-item">
        	<!--切割后的集合变数组,第1位是count,第0位:title-->
            <span class="badge"><%=ss[1]%></span>
            <%=ss[0]%>
        </li>
        <%
                }
            }
        %>
    </ul>
</div>
</body>
</html>

你要尽全力保护你的梦想。那些嘲笑你梦想的人,他们注定失败,他们想把你变成和他们一样。我坚信,只要心中有梦想,我就会与众不同。你也是。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值