Cookie Session

1. 无状态访问

浏览器发送请求,服务器给予一定的响应,但是会断开连接,当再次发送一个请求时,之前的网页状态与再次请求的网页状态无关,整个就是HTTP协议的特征,无状态连接的特征。

实际操作过程中:
	例如:
		自动登录:用户登录界面后,服务器给与一定的响应,通过会话控制直接会保持当前的状态,浏览器会保存之前页面的状态,下一个页面如果要使用,就直接取出使用。

2. 会话控制

2.1 会话控制采用的技术

cookie:浏览器中保存的内容,保存在浏览器本地,每一次访问服务器,会自动带有保存到cookie的信息,并且cookie大小有限制,通常限制为:4096byte 4KB 现在:8192byte

cookie的信息不能保存为中文,信息形式以键值对形式存在。

session:(工作中用session)

保存在服务器中,每一个session在当前的服务器中都会有一个唯一的标识符,还会保存一些浏览器访问服务器的信息。

信息的保存以键值对形式存在。

2.2 Cookie

Cookie使用的前提:浏览器开启了cookie功能。

常用的API:

  • Cookie的构造方法:
    • cookie只保存字符串
    • Cookie(String name,String value)
  • 设置Cookie的方法:
    • setValue(); 修改cookie的值
    • setMaxAge(参数); 修改cookie的有效时间 参数:
      • 正数 有效时间
      • 负数 表示当前cookie在目前浏览器打开的状态下存在,关闭浏览器后立刻被销毁
      • 0 表示销毁当前的cookie
    • setPath(String path); 几乎不用,设置当前cookie的有效路径
  • 发送cookie到浏览器进行保存
    • response.addCookie(Cookie cookie);
  • 服务器获取浏览器的cookie的信息
    • request.getCookies()
2.3 Session

使用Session的原因:

  • cookie保存的数据比较单一,只能保存字符串;
  • cookie不能保存中文;
  • cookie存在大小限制,一般4kb;
  • cookie在浏览器中保存时有一定限制;
  • 不安全。

Session可以解决以上的问题。

HttpSession API

  • HttpSession getSession(); 获取Session对象
  • setAttribute(String name,Object obj); 设置Session
  • Object getAttribute(String name); 获取Session的值
  • getId(); (重要) 获取当前Session的id号,String类型
  • invalidate(); 销毁Session
2.4 自动登录

LoginServlet

    package com.project_login;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
    
    @WebServlet("/LoginServlet")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            String user = req.getParameter("user");
            String pwd = req.getParameter("pwd");
    
            //登录信息的验证,先把数据写死
            //作业:从数据库中取值,判断和前端页面提交的数据是否一致,如果查出来有结果,将值设置到session即可
            if ("卓璇".equals(user)&& "123".equals(pwd)) {
                //创建session对象
                HttpSession session = req.getSession();//参数默认为true
                //获取当前session对象的ID
                String id = session.getId();
                //cookie的使用
                Cookie cookie = new Cookie("JSESSIONID",id);
                cookie.setMaxAge(60*60);//如果cookie关闭,session不能用,二者相辅相成
                resp.addCookie(cookie);
    
                //设置session的值
                session.setAttribute("user","卓璇");
    
                //跳转到主页
                resp.sendRedirect("SuccessServlet");
    
    
            }else{
    //            resp.sendRedirect("login.html");//相对路径
                resp.sendRedirect(req.getContextPath()+"login.html");//绝对路径
            }
    
        }
    }

SuccessServlet

    package com.project_login;
    
    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.io.IOException;
    
    @WebServlet("/SuccessServlet")
    public class SuccessServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html;charset=utf-8");
            //获取Session对象
            HttpSession session = req.getSession(false);//false,并非以创建方式获取的Session对象
            //判断Session对象中保存的信息
            if (session != null && "卓璇".equals(session.getAttribute("user"))) {
    //            req.getRequestDispatcher("success.html").forward(req,resp);
                String html = "<font size='7' face='楷体' color='green'>欢迎" + session.getAttribute("user") + "</font>";
    
                //退出
                html += "<a href='FailedServlet' style='color: red;font-size: 20px;'>退出</a>";
    
                resp.getWriter().append(html);
            }else{
                //如果失败,重定向到登录界面
                resp.sendRedirect("login.html");
            }
        }
    }

FailedServlet

    package com.project_login;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
    
    @WebServlet("/FailedServlet")
    public class FailedServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            HttpSession session = req.getSession(false);
            if (session != null) {
                //销毁
                session.invalidate();
            }
    
            //销毁cookie
            Cookie cookie = new Cookie("JSESSIONID","");
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
            resp.sendRedirect("login.html");
        }
    }
2.5 Servlet的封装

BaseServlet

    package com.util;
    
    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 java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    @WebServlet("/BaseServlet")
    public class BaseServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /**
             * 1.获取请求中method的请求方式
             */
            String methodName = req.getParameter("method");
            /**
             * 2.使用反射
             * 获取class类对象,获取当前servlet程序的类对象
             * 要求:必须是BaseServlet的子类
             * */
            Class<? extends BaseServlet> aClass = this.getClass();
            /**
             * 3.根据method和class类对象获取对应的方法
             * method: add update delete select
             */
    
            try {
                Method method1 = aClass.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
    
                /**
                 * 4.执行对应的方法
                 * this  ActionServlet    add delete update select
                 * */
    
                Object invoke = method1.invoke(this, req, resp);
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
    
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值