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

Java web后端4 会话 Cookie Session

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

Java web后端4 会话 Cookie Session

会话

会话:指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应的过程。

客户端和服务器的请求和响应的过程(对话双方只要有一方发生变化,都属于不同的会话)
超时间隔【距离上一次请求的间隔】,超时后就属于不同的会话
HTTP是无状态的,不保存用户信息
cookie客户端
Session服务器

cookie

cookie是一种会话技术,它用于将会话过程中的数据保存到用户的浏览器中【保存在客户端的磁盘或缓存(内存)中】,从而使浏览器和服务器可以更好地进行数据交互。


用户第一次访问时,没有cookie

cookie API


cookie的相关方法

cookie–setMaxAge()和getMaxAge()

负数:浏览器一关,缓存就会清空【将cookie保存在浏览器的缓存中】
默认为-1

cookie的案例

@WebServlet(name = "cookie1", value = "/cookie1")
public class cookie1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");
        //字符输出流
        PrintWriter out = response.getWriter();
        Date date = new Date();
        //格式化输出
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
        //获取当前时间
        String NowTime = sdf.format(date);

        //创建cookie对象并保存当前时间到cookie对象之中
        cookie cookie = new cookie("LastTime", NowTime);
        //将cookie信息回写至客户端浏览器
        response.addcookie(cookie);
        //设置cookie保存在磁盘中,为90秒;90秒后失效
        cookie.setMaxAge(90);

        //把浏览器中所有cookie返回
        //cookie[] cookies:cookie对象数组
        cookie[] cookies = request.getcookies();

        String LastAccessTime = null;
        //如果cookies不为空,再循环,防止空指针异常
        if (cookies != null) {
            //增强型for循环
            for (cookie c : cookies) {
                //匹配是否有"LastTime" cookie
                //"LastTime"字符串写在前面,防止空指针异常
                if ("LastTime".equals(c.getName())) {
                    //获取cookie的值,如果为空,则为浏览器第一次访问
                    LastAccessTime = c.getValue();
                }
            }
        }
        //cookie的值,如果为空,则为浏览器第一次访问
        if (LastAccessTime.isEmpty()) {
            out.write("你是首次访问本站!");
        } else {
            //每次刷新,就会重新计算90秒:cookie.setMaxAge(90);
            //90秒后失效,就又会显示:你是首次访问本站!
            out.write("你上次访问本站的时间:" + LastAccessTime);
        }
    }

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

    }
}

Session会话

cookie是键值对,不能存储大量数据【每次放在请求头中】,并且不安全,效率低
所以使用Session存储大量数据,Session是一种将会话数据保存到服务器端的技术
说会话,指Session

Session的创建,由Servlet容器在发起会话时自动创建
当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性【32位16进制,16的32次方,2^128次方,ID不会重复,类似IPv6,64位】,当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。

由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助cookie技术来传递ID属性的。

Session原理


Session是通过cookie技术实现的,依赖于名为JSESSIONID的cookie,它将信息保存在服务器端。Session中能够存储复杂的Java对象,因此使用更加方便。如果客户端不支持cookie,或者禁用了cookie,仍然可以通过使用URL重写来使用Session。

Session-获取Session对象

不同的请求对象获取的Session对象,不一定不同;因为可能是处于同一次会话


Session相关方法

大型项目一般使用时间戳,国内外一致【getLastAccessedTime()】
Sesssion超时,设置为分钟,在超时时间内如果没有任何请求则超时

invalidate():类似删除Session

Tomcat的Session超时设置

Session案例

浏览器不同窗口属于同一次会话
浏览器关闭,则结束会话了



loginServlet.html




    
    Title





LoginServlet.java


//http://localhost:8082/WebServletProject_war_exploded/loginServlet.html
@WebServlet(name = "LoginServlet", value = "/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        System.out.println("进入loginServlet登录页面...");
        //获取login.html页面用户输入的值
        String name = request.getParameter("uname");
        String pwd = request.getParameter("upwd");
        if ("admin".equals(name) && "123".equals(pwd)) {
            //获取对话Session
            HttpSession session = request.getSession();
            //将当前用户的名称存入Session
            session.setAttribute("user",name);

            //:Javascript,弹出警告框
            out.write("");
            response.sendRedirect("mainServlet");
        } else {
            out.write("用户名或密码输入错误");
            response.sendRedirect("loginServlet.html");
        }

    }

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

    }
}

MainServlet.java

@WebServlet(name = "MainServlet", value = "/mainServlet")
public class MainServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //获取当前对话的Session对象
        HttpSession session = request.getSession();
        //获取Session的用户名称
        Object user = session.getAttribute("user");
        //不为空,之前已经登录过,直接访问
        if (user!=null){
            out.write("进入MainServelt主页面");
            out.write("欢迎回来!"+(String)user);
        }else {
            out.write("你还没有登录,请先登录后再访问此页面!n");
            out.write("点击此处进行登录!");
        }
    }

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

    }
}

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

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

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