javaEE:day11-用js操纵cookie、session技术

js操纵cookie

创建修改一个cookie

        function write(){
            var nm = "张三第";
            nm= encodeURI(nm);//如是中文, 编码
            var date = new Date();
            date.setTime(date.getTime()+1000*60*60*2);
            document.cookie = "name="+nm+";expires="+date.toGMTString()+";path=/";
        }

删除一个cookie–即声明一个key相同的过期的cookie

        function del(){//即声明一个key相同的过期时间的Cookie即可
            var date = new Date(1970,1,1);
            document.cookie="name=aa;expires="+date.toGMTString()+";path=/";
        }

遍历cookie

        function visit(){
            var cs = document.cookie.split(";");//中文解码
            for(var x=0;x<cs.length;x++){
                cs[x] = decodeURI(cs[x]);
                div1.innerHTML += "<br/>"+cs[x];//js中,id对象可以直接通过“id名”访问
                var str = cs[x].split("=");
                div2.innerHTML += "<br/>"+str[1];
            }
        }

Session技术:

Session会话简介

1会话是指在一段时间内,用户使用同一个浏览器进程与Web应用之间的交互过程。
2会话(Session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息。
3当用户关闭浏览器,上一个Session也就无法再次获得了(Cookie的maxAge为-1的情况)。再次打开新的浏览器,将开始一个新的会话。
4类javax.servlet.http.HttpSession。每一个HttpSession代表用户的一个会话。
5每一个Session的过期时间默认为30分钟。
6当浏览器第一次访问服务器时,无论先访问哪一个页面,服务器就会给用户分配一个唯一的会话标识,即jsessionid然后以cookie的形式返回给用户。
7下图是一个响应头(下图是基于Servlet3.0的,在Servlet2.5中没有HttpOnly属性)
这里写图片描述

8服务器给每个用户创建一个会话,即HttpSession对象,保存在服务器端。
那么,当用户再次访问服务器时,服务器是如何知道还是当前用户呢?
9当浏览器再次访问服务器时,会携带包含了jsessionid的cookie访问服务器。服务器根据此id返回此用户的HttpSession对象,就保持了会话。

图示session会话

这里写图片描述

Session的唯一标识Id:

每一个Session都一个唯一标识,即ID。
当浏览器获取一个新的Session时,用户即可以通过session.geId();打印出ID的值 。
再不关闭浏览器的情况下,在多个页面上跳转,使用的是同一个Session。

HttpSession:

在Servlet中,通过HttpServletRequest.getSession方法获取会话对像。
HttpSession接口的以下方法用于向会话范围内共享数据:
getAttribute(“name”)
setAttribute(“name”,object);
getAttributeNames()
removeAttrubute(“name”)
Invalidate(); - 此方法强力删除服务器缓存的session.
示例:
在一个Servlet的向httpSession中setAttribute设置某些值。
通过超连接,或其他方式转到其他servlet并通过getAttribute显示信息。
在任意Servlet中调用getAttribute显示信息。
关闭此浏览器,重新访问获取信息的servlet,你会发现已经没有信息了。

request、session、servletContext三个容器

可以大致理解为
request容器只是在同一次请求(转发、请求包含)中。
session容器是在浏览器不关中。
servletContext是在服务器不关中。

当用户在操作的过程中,不小心关闭了浏览器。用户再重新打开浏览器还能获得之前保存在Session中的信息

把cookie技术和session技术联合起来,向客户端写一个key为”jsessionid”,value为”sessionid”的cookie。因为在服务器中,它默认将这个包含jsessionid的cookie的setMaxAge设为-1,这样我们在浏览器关闭就拿不到了。这时,我们在服务器中拷一个,将它的setMaxAge设为10分钟,这样,浏览器发送请求的时候将这个jsessionid带过去,去tomcat的session池中遍历查找,找到了,就是上次关闭之前的那个网页信息。

        Cookie c= new Cookie("JSESSIONID", request.getSession().getId() );
        c.setMaxAge(60*10);
        c.setPath(request.getContextPath());
        response.addCookie(c);

安全退出

只要让session对象无效即可。设一个

request.getSession().invalidate();//安全退出让session无效即可

用session做验证码的判断

在验证码生成的时候,将真值存入到session当中。在提交表单的时候,拿用户填写的验证码的值与从session中获取的真值进行判断即可。
注意,session中存的验证码真值要用一次清一次。否则会导致两个验证码对不上。

本文完整代码如下:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
      <h1>演示Cookie技术</h1>
      <a href="CookieDemo">Cookie基本用法演示</a><br/><br/>
      <a href="servlet/CookieDemo2">演示Cookie的权限</a><br/><br/>
      <a href="servlet/DelCookieDemo">演示Cookie的删除</a><br/><br/>
      <a href="servlet/ShowCookieDemo">利用Cookie显示上一次访问的时间</a><br/><br/>
      <a href="jsps/show.jsp">利用Cookie显示用户最近浏览的图片</a><br/><br/>
      <a href="CookieJs.jsp">演示用js操作cookie</a>
      <hr/>
      <h1>演示Session技术</h1>
      <hr/>
      <h2>演示request、session、servletContext三个容器</h2>
      <form action="SaveServlet" method="post">
         姓名:<input type="text" name="name"/><br/>
        <input type="submit" value="提交" />
      </form>
      <br/>
      <a href="GetServlet">获取三个容器中的参数</a>
      <br/>
      <a href="LogOutServlet">安全退出</a><br/> <br/>
      <h2>演示利用session进行验证码验证</h2>
      <form action="TestServlet" method="post">
             姓名:<input type="text" name="name"/><br/>
             密码:<input type="password" name="pwd"/><br/>
             验证码:<input type="text" name="code"/>
             <img  src="ImgServlet" />
            <input type="submit" value="提交" />        
      </form>
      <br/>
      <br/>
      <br/>
      <hr/>
      <h2>演示URL重写技术---破解用户禁用cookie之后,我们session无效的问题</h2>
      <!-- 即利用我们response的发送url后面带参数,而不是用session
            重写url技术如下:http://127.0.0.1:8080/CookieSessionDemo_jun/GetServlet;jsessionid=1E55681054EA2BF4C8B3A6750B7A873D
            利用session如下:http://127.0.0.1:8080/CookieSessionDemo_jun/SaveServlet
       -->
      <form action="<%=response.encodeURL("SaveServlet") %>" method="post">
         姓名:<input type="text" name="name"/><br/>
        <input type="submit" value="提交" />
      </form>
      <br/>
      <br/>
      <a href="<%=response.encodeURL("GetServlet")%>">获取三个容器中的参数</a>
       <a href="<%=response.encodeURL("LogOutServlet")%>">安全退出</a><br/> <br/>
      <br/>
      <br/>
      <br/>
       <br/> <br/> <br/>
  </body>
</html>

CookieJs.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h2>显示用js操纵cookie</h2>
    <div id="div1"></div>
    <div id="div2"></div>
    <script type="text/javascript">
        function write(){
            var nm = "张三第";
            nm= encodeURI(nm);//如是中文, 编码
            var date = new Date();
            date.setTime(date.getTime()+1000*60*60*2);
            document.cookie = "name="+nm+";expires="+date.toGMTString()+";path=/";
        }
        write();
        function del(){//即声明一个key相同的过期时间的Cookie即可
            var date = new Date(1970,1,1);
            document.cookie="name=aa;expires="+date.toGMTString()+";path=/";
        }
        //del();
        function visit(){
            var cs = document.cookie.split(";");//中文解码
            for(var x=0;x<cs.length;x++){
                cs[x] = decodeURI(cs[x]);
                div1.innerHTML += "<br/>"+cs[x];//js中,id对象可以直接通过“id名”访问
                var str = cs[x].split("=");
                div2.innerHTML += "<br/>"+str[1];
            }
        }
        visit();


    </script>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>CookieDemo</servlet-name>
    <servlet-class>cn.hncu.servlet.CookieDemo</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>CookieDemo2</servlet-name>
    <servlet-class>cn.hncu.servlet.CookieDemo2</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>DelCookieDemo</servlet-name>
    <servlet-class>cn.hncu.servlet.DelCookieDemo</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ShowCookieDemo</servlet-name>
    <servlet-class>cn.hncu.servlet.ShowCookieDemo</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ShowImg</servlet-name>
    <servlet-class>cn.hncu.servlet.ShowImg</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>SaveServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.session.SaveServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>GetServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.session.GetServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>LogOutServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.session.LogOutServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.session.TestServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ImgServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.session.ImgServlet</servlet-class>
  </servlet>










  <servlet-mapping>
    <servlet-name>CookieDemo</servlet-name>
    <url-pattern>/CookieDemo</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>CookieDemo2</servlet-name>
    <url-pattern>/servlet/CookieDemo2</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>DelCookieDemo</servlet-name>
    <url-pattern>/servlet/DelCookieDemo</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowCookieDemo</servlet-name>
    <url-pattern>/servlet/ShowCookieDemo</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowImg</servlet-name>
    <url-pattern>/ShowImg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>SaveServlet</servlet-name>
    <url-pattern>/SaveServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>GetServlet</servlet-name>
    <url-pattern>/GetServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>LogOutServlet</servlet-name>
    <url-pattern>/LogOutServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ImgServlet</servlet-name>
    <url-pattern>/ImgServlet</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

SaveServlet

package cn.hncu.servlet.session;

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;

public class SaveServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");

        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        request.setAttribute("name", "request-name:"+name);
        request.getSession().setAttribute("name", "session-name:"+name);
        getServletContext().setAttribute("name", "application-name:"+name);

        //把cookie技术和session技术联合起来做应用的一个例子---※功能:
        //让用户在关闭浏览器之后,如果10分钟之内能够登录本站,还能访问到session中的信息
        //向客户端写一个key为"JSESSIONID"用value为sessionid的cookie,
        Cookie c= new Cookie("JSESSIONID", request.getSession().getId() );
        c.setMaxAge(60*10);
        c.setPath(request.getContextPath());
        response.addCookie(c);
        out.println("<br/>保存成功");
        out.flush();
        out.close();
    }

}

GetServlet

package cn.hncu.servlet.session;

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

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

public class GetServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <BODY>");
        String requestName = (String) request.getAttribute("name");
        String sessionName = (String) request.getSession().getAttribute("name");
        String applicationName = (String) getServletContext().getAttribute("name");
        out.println("<br/>"+requestName);
        out.println("<br/>"+sessionName);
        out.println("<br/>"+applicationName);

        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

LogOutServlet

package cn.hncu.servlet.session;

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

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

public class LogOutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <BODY>");
        request.getSession().invalidate();//安全退出让session无效即可
        out.print("成功安全退出");

        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

}

ImgServlet

package cn.hncu.servlet.session;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImgServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("image/jpeg");

        int w = 30;
        int h = 40;
        BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Random r = new Random();
        int  n = r.nextInt(10000);
        //将真值放入session
        request.getSession().setAttribute("code", ""+n);
        //写出验证码图片
        Graphics g = img.getGraphics();
        g.drawString(""+n, 0, h);
        g.dispose();
        ImageIO.write(img, "JPEG", response.getOutputStream());

    }

}

TestServlet

package cn.hncu.servlet.session;

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

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

public class TestServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //从客户端获取用户输入的name,pwd,code
        String name = request.getParameter("name");
        String pwd =request.getParameter("pwd");
        String code = request.getParameter("code");
        String realCode =(String) request.getSession().getAttribute("code");
        if(code==null || !code.equals(realCode)){
            out.println("<br>验证码输入错误");
        }else{
            if(name!=null && name.equals(pwd)){
                out.println("<br>登录成功");
            }else{
                out.println("<br>用户名密码错误");
            }
        }
        //每次使用验证码后要清除session中旧的验证码--用一次,清一次!
        request.getSession().removeAttribute("code");

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值