栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Cookie和HttpSession

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力
Cookie 会话技术 什么是会话

生活中的会话&BS结构的会话

为什么会有会话技术

什么是Cookie

Cookie的执行原理 Cookie的运行原理

创建和发送

案例:在Servlet中创建一个Cookie(“user”,“孙悟空”),并且写到浏览器端去


在Tomcat7里面有汉字直接报500异常错误

package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/demo1")
public class Demo1CookieServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.使用构造方法创建一个Cookie对象,指定键和值,注意:键和值都不建议使用中文
        Cookie cookie = new Cookie("user","NewBoy");
        //2.将创建好的Cookie发给浏览器
        response.addCookie(cookie);
        //3.在默认情况下,关闭浏览器Cookie就失效失效
        //设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //获取打印流
        PrintWriter out = response.getWriter();
        out.println("向浏览器添加了cookie数据");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

设置过期的时间
package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/demo1")
public class Demo1CookieServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.使用构造方法创建一个Cookie对象,指定键和值,注意:键和值都不建议使用中文
        Cookie cookie = new Cookie("user","NewBoy");

        

        cookie.setMaxAge(60*10);
        //3.将创建好的Cookie发给浏览器
        response.addCookie(cookie);


        //设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //获取打印流
        PrintWriter out = response.getWriter();
        out.println("向浏览器添加了cookie数据");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

案例:读取Cookie信息

package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/demo2")
public class Demo2ReadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //读取数据使用请求的方法,得到Cookie数组
        Cookie[] cookies = request.getCookies();


        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();


        //判断如果数组为空,表示浏览器端没有Cookie数组
        if (cookies == null) {
            out.println("没有Cookie!");
        } else {
            //每一个元素是一个Cookie对象
            for (Cookie cookie : cookies) {
                //获取cookie对键和值
                String name = cookie.getName();
                String value = cookie.getValue();
                //输出
                out.println("名字是:" + name + ",值是:" + value + "
"); } } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
设置访问路径

package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/demo1")
public class Demo1CookieServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.使用构造方法创建一个Cookie对象,指定键和值,注意:键和值都不建议使用中文
        Cookie user = new Cookie("user","NewBoy");

        

        user.setMaxAge(60*10);
        //3.将创建好的Cookie发给浏览器
        response.addCookie(user);
        //再创建一个cookie


        Cookie age = new Cookie("age","20");
        //设置他的访问地址,只有访问demo3或它的子路径,浏览器才会将Cookie发送给服务器
        age.setPath(request.getContextPath()+"/demo3");
        age.setMaxAge(60*10);
        response.addCookie(age);

        //设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //获取打印流
        PrintWriter out = response.getWriter();
        out.println("向浏览器添加了cookie数据");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

面试题

删除Cookie

package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/demo4")
public class Demo4Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建Cookie对象
        Cookie user = new Cookie("user", "null");
        //设置过期时间为0
        user.setMaxAge(0);
        //添加到浏览器端
        response.addCookie(user);

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

实现自动登录的案例


LoginServlet文件

package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.得到用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //2.判断是否登录成功
        if ("NewBoy".equals(username)&&"1234".equals(password)){
            //登录成功,判断是否勾选"记住我"
            String remember = request.getParameter("remember");
            //如果没有勾选remember为空,不为空表示勾选
            if(remember!=null){
                //勾选的话创建cookie保存用户名
                Cookie cookieUser = new Cookie("user", username);
                //设置过期时间
                cookieUser.setMaxAge(60 *60*24*7);
                //设置只有访问登录页面login.html,才发送给Cookie给服务器
                cookieUser.setPath(request.getContextPath()+"/login.html");
                //写到浏览器端
                response.addCookie(cookieUser);

                Cookie cookiePass = new Cookie("password", password);
                cookiePass.setMaxAge(60 *60*24*7);
                cookiePass.setPath(request.getContextPath()+"/login.html");
                response.addCookie(cookiePass);

                //3.重定向跳转到成功页面
                response.sendRedirect(request.getContextPath()+"/success.html");

            }else {
                //3.没勾选也跳转重定向跳转到成功页面
                response.sendRedirect(request.getContextPath()+"/success.html");
            }
        }else {
            //重定向跳转到失败页面
            response.sendRedirect(request.getContextPath()+"/failure.html");
        }


    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

commons.js工具类(js文件夹下)

function getCookieValue(name) {

    //1.得到所有的cookie
    var cookies = document.cookie;
    if (cookies != "") { //username=admin; password=123 注:password前面有一个空格
        //2.使用分号来拆分
        var strings = cookies.split(";");
        for (var i = 0; i < strings.length; i++) {
            var cookie = strings[i];
            //3.每个元素再按"="号来拆分
            var key = cookie.split("=")[0].trim(); //第0个元素是键,去掉前后的空格
            var value = cookie.split("=")[1].trim();//第1个元素是值,去掉前后的空格
            //14.比较名字和键是否相同,如果相同就返回value
            if (name == key) {
                return value;
            }
        }
    }

    return null;
}

failure.html(登录失败)




    
    登录失败


登陆失败

点我重新登录

success.html(登录成功)




    
    登录成功


登录成功欢迎你

login.html(用户登录)




    
    Title

    



用户登录

用户名
密码
记住我

HttpSession HttpSession介绍

Cookie和Session的主要区别

Tomcat保留会话重启或者重新发布

会话对象的方法

package com.itheima.Servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;

@WebServlet("/demo1")
public class Demo1SessionServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        HttpSession session = request.getSession();
        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();
        out.println("会话对象:"+session+"
"); //获取每个用户的会话id值:32位的十六进制数组成,而且是唯一的 out.println("会话id为:"+session.getId()+"
"); out.println("是否是新会话:"+session.isNew()+"
"); //返回的是一个毫秒值,需要转时间戳来显示. out.println("创建时间:"+new Timestamp(session.getCreationTime()) +"
"); out.println("创建最后一次发访问的时间:"+new Timestamp(session.getLastAccessedTime()) +"
"); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
会话域的操作方法

会话作用域

创建会话域键和值
package com.itheima.Servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/demo2")
public class Demo2SetServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取会话域对象
        HttpSession session = request.getSession();
        //向会话域中添加值和键
        session.setAttribute("knickknack","布娃娃");
        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();
        //打印点东西
        out.println("设置了一个会话域对象");

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

获取会话域的键和值
package com.itheima.Servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/demo3")
public class Demo3GetServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取会话域对象
        HttpSession session = request.getSession();
        //从会话域中取值
        String knickknack = (String) session.getAttribute("knickknack");
        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();
        out.println("产品是:"+knickknack+"
"); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
会话访问的原理(Session)

HttpSession的一些疑问

可以配钥匙(自己写个cookie用来存Session的id)服务器端默认存30分钟

案例保存JSESSIONID


修改会话过期的方式

方式一&&方式二
package com.itheima.Servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/dem4")
public class Demo3IntervalServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();
        //获取会话对象
        HttpSession session = request.getSession();
        //浏览器输出会话对象id
        out.println("会话对象:"+session.getId()+"
"); //获取服务器会话过期最大时间:秒 //int maxInactiveInterval = session.getMaxInactiveInterval(); //浏览器端输出过期时间 //out.println("过期时间"+maxInactiveInterval+"
"); //方式一:设置会话对象最大过期时间为10s //ession.setMaxInactiveInterval(10); //浏览器端输出过期时间 out.println("过期时间:"+session.getMaxInactiveInterval()+"
"); //方式二:会话立马过期:适用于用户退出 //session.invalidate(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
方式三通过配置文件修改



    
        5
    

浏览器端禁用Cookie的处理方式


案例 验证码登录

验证码登录的准备

登录的Servlet


WelcomeServlet
login.html




    
    
    
    登录页面






用户登录

   

退出

PicCodeServlet

package com.itheima.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;


@WebServlet("/https://blog.csdn.net/anyi2351033836/article/details/code")
public class PicCodeServlet extends HttpServlet {
    //随机类
    private Random random = new Random();

    

    private Color getRandomColor() {
        //随机得到r,g,b的取值,范围是0~255
        int r = random.nextInt(256);
        int g = random.nextInt(256);
        int b = random.nextInt(256);
        //red红 green绿 blue蓝
        return new Color(r, g, b);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置MIME类型
        response.setContentType("image/jpeg");
        //定义宽和高的值
        int width = 90;
        int height = 30;
        //1,创建一张图片,参数:宽,高,图片模式
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //获取画笔对象
        Graphics graphics = image.getGraphics();
        //整个图片填充白色
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, width, height);
        //2.随机绘制4个验证码
        char[] arr = {'A', 'B', 'C', 'D', 'N', 'E', 'W', 'b', 'o', 'y', '1', '2', '3', '4', '5', '6', '7', '8'};
        //设置字体,字体对象有三个参数:字体名字,字体样式(加粗,斜体)大小
        graphics.setFont(new Font(Font.DIALOG_INPUT, Font.BOLD + Font.ITALIC, 19));
        //创建一个stringBuilder
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            //随机获取1个索引号
            int index = random.nextInt(arr.length);
            //随机获取字符数组的一个字符
            char c = arr[index];
            //添加到字符串中
            sb.append(c);
            //每个字符的颜色不同
            graphics.setColor(getRandomColor());
            //写字符,参数:文字内容,xy坐标(把字符转成字符串)
            graphics.drawString(String.valueOf(c), 10 + (i * 20), 20);
        }
        //将字符串放在会话域中
        HttpSession session = request.getSession();
        session.setAttribute("https://blog.csdn.net/anyi2351033836/article/details/code", sb.toString());
        System.out.println("验证码:" + sb);
        //3.绘制8条干扰线
        for (int i = 0; i < 8; i++) {
            //指定颜色
            graphics.setColor(getRandomColor());
            int x1 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int x2 = random.nextInt(width);
            int y2 = random.nextInt(height);
            //画线,起点和终点
            graphics.drawLine(x1, y1, x2, y2);
        }
        //4.把图片输出到浏览器,参数:输出的图片对象,图片格式,响应输出流
        ImageIO.write(image, "jpg", response.getOutputStream());
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}



LoginServlet

package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取会话对象
        HttpSession session = request.getSession();
        //从会话域中获取验证码
        String https://blog.csdn.net/anyi2351033836/article/details/code = (String) session.getAttribute("https://blog.csdn.net/anyi2351033836/article/details/code");
        //从用户输入框中获取验证码
        String vhttps://blog.csdn.net/anyi2351033836/article/details/code = request.getParameter("vhttps://blog.csdn.net/anyi2351033836/article/details/code");
        //设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //获取打印流
        PrintWriter out = response.getWriter();
        //验证码只用一次
        session.removeAttribute("https://blog.csdn.net/anyi2351033836/article/details/code");
        //1.判断验证码是否正确
        if (!https://blog.csdn.net/anyi2351033836/article/details/code.equalsIgnoreCase(vhttps://blog.csdn.net/anyi2351033836/article/details/code)){
            //验证码不匹配,就提示一下,跳回初始页面
            out.println("");
        }else {
            //验证码正确再判断用户名和密码
            String name = request.getParameter("name");
            String password = request.getParameter("password");
            if ("NewBoy".equals(name)&&"1234".equals(password)){
                //验证通过成功登录,需要将用户的信息保存在会话域中
                session.setAttribute("user",name);
                //跳转到登录成功的页面
                response.sendRedirect(request.getContextPath()+"/welcome");
            }else {
                out.println("");
            }
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

WelcomeServlet

package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/welcome")
public class WelcomeServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置响应类型和编码
        response.setContentType("text/html;charset=utf-8");
        //2.获取打印流
        PrintWriter out = response.getWriter();
        //获取会话对象
        HttpSession session = request.getSession();
        //获取用户信息
        String user = (String) session.getAttribute("user");
        //判断会话域中是否有用户信息,如果没有则是没有登录的
        //(预防插队)
        if (user==null){
            response.sendRedirect(request.getContextPath()+"login.html");
            //必须加上,否则后面代码还会继续执行
            return;
        }else {
        //显示页面
        out.println("欢迎您!jack!!!

"); //退出连接 out.println("退出"); }} @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }

LogoutServlet

package com.itheima.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取会话对象
        HttpSession session = request.getSession();
        //销毁会话对象
        session.invalidate();
        //重定向到首页登录
        response.sendRedirect(request.getContextPath()+"login.html");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);

    }
}

小结 能够说出会话的概念

能够创建,发送.接收,删除Cookie

能够说出Cookie执行原理

能够说出Session的概念

能够获取session对象,添加,删除,获取session中的数据

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866678.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号