会话技术Session,Cookie

会话技术


Http协议:无状态的协议,不记录客户端的信息,所以说客户端的请求希望说使用历史数据的话,是无法获取到之前的访问的信息数据的,这时候就需要Javaweb的会话技术去解决(两种方式)

程序将数据存储在服务器中,存储数据的格式是key-value的形式,服务器就会将这个key给客户端,每次客户端再次访问服务器的时候会将key带给服务器,如果想要获取存储数据就通过这个key去获取—》这种方式即为session,服务器给客户的key就是session的ID

session是基于服务器的

cookie是基于浏览器的


Cookie客户端的缓存技术

Cookie的信息数据存储在内存中或者存在浏览器的本地文件中

Cookie的API

创建cookie对象

Cookie cookie=new Cookie(key,value)==>key和value

(两者都是String类型的数据)

通过响应创建Cookie(同时下一次请求服务端的时候会在请求中携带cookie)

response.addCookie(cookie对象)

设置Cookie的最久存活时间(不受关闭浏览器影响:如果不设这个最大时间,就默认跟浏览器一样,浏览器关闭就销毁,如果设置时间长于使用浏览器的时间,那么它会保存在内存中,直到最大时间,关闭浏览器之后还是能访问)

cookie.setMaxAge(多少秒)


Cookie和Session的对比:(Cookie不安全)

1、两者都可以进行数据的存储和传输

2、session存储在服务器内存中,可以存储对象

3、Cookie通过响应存储在浏览器中,主要是存储字符串

session的数据存储是依赖于Cookie的,session的唯一标识是使用Cookie存储的JSESSIONID,每次浏览器客户端进行请求的时候,会通过Cookie将session的id带给服务器,服务器通过当前的请求拿到JSESSIONID从而找到对应的session对象

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //设置一个字符串存储在session中
    HttpSession session = request.getSession();
    session.setAttribute("name","zhangsan");
    //获取session对象的id
    String session_id = session.getId();
    //将session_id存储在Cookie中
    Cookie cookie = new Cookie("JSESSIONID",session_id);
    cookie.setMaxAge(300);
    response.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取会话
    HttpSession session = request.getSession();
    //通过会话获取属性值
    String name = (String) session.getAttribute("name");
    System.out.println(name);
}

Cookie的应用场景

记住密码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现记住密码</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/remember" method="post">
        <input type="text" name="username" placeholder="请输入用户名" value="${cookie.username.value}">
        <br>
        <input type="password" name="password" placeholder="请输入密码" value="${cookie.password.value}">
        <br>
        <input type="checkbox" name="remember" value="1">记住密码
        <input type="submit" value="登录">
    </form>
</body>
</html>

通过浏览器的请求获取对应的remember的值是否记住密码

@WebServlet("/remember")
public class RememberCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String remember = request.getParameter("remember");
        if(remember.equals("1")){
            Cookie cookie=new Cookie("username",username);
            Cookie cookie1=new Cookie("password",password);
            cookie.setMaxAge(60*60*24*7);//保存7天
            cookie1.setMaxAge(60*60*24*7);
            response.addCookie(cookie);
            response.addCookie(cookie1);

        }
        response.sendRedirect(request.getContextPath()+"/index.jsp");
    }

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

Session

session表示的是当前的会话,默认其对象的生命周期为30分钟,当存在一个请求的时候默认会创建一个与之关联的session,会话对象唯一的标识为JSESSIONID通过Cookie进行传递

一旦浏览器关闭重新打开,此时服务器默认当做一个新的会话,会给一个新的JSESSIONID给浏览器客户端,覆盖原来的JSESSIONID(那么原有的对应的session对象的属性也会随之丢失

session的API

@WebServlet("/sessionTest1")
public class SessionDemoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //表示设置session的存活时间单位为秒,默认为30分钟
        session.setMaxInactiveInterval(60*30);
        System.out.println("session id:"+session.getId());
        session.setAttribute("name","zhangsan");
        session.setAttribute("age",18);
        String name = (String) session.getAttribute("name");
        System.out.println("name:"+name);
        Integer age = (Integer) session.getAttribute("age");
        System.out.println("age:"+age);
        //让session失效
        session.invalidate();
    }

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

通过Session实现图片验证码校验

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //获取输入框中的验证码
        String captcha_code = request.getParameter("captcha");
        //获取session中存储的验证码
        HttpSession session = request.getSession();
        String session_code = (String) session.getAttribute("captcha_code");
        if (session_code.equalsIgnoreCase(captcha_code)){
            //验证码正确
            //获取用户名,密码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            if (username.equals("admin") && password.equals("123456")){
                //登录成功
                //重定向跳转到登录成功页面
                response.sendRedirect(request.getContextPath()+"/index.jsp");
            }else {
                //登录失败
                //重定向跳转到登录页面
                session.setAttribute("login_error","用户名或密码错误");
                response.sendRedirect(request.getContextPath()+"/login.jsp");
            }
        }else {
            //验证码错误
            //重定向跳转到登录页面
            session.setAttribute("login_error","验证码错误");
            response.sendRedirect(request.getContextPath()+"/login.jsp");
        }
    }
//TODO:生成图片验证码并响应给前端
@WebServlet("/captchacode")
public class CaptchaServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //    TODO:获取图片验证码的对象
        LineCaptcha lineCaptcha=new LineCaptcha(200,100,4,6);
        //获取图片验证码
        String code = lineCaptcha.getCode();
        //获取session对象
        HttpSession session = request.getSession();
        //将图片验证码存入session中
        session.setAttribute("captcha_code",code);
        //设置响应的类型
        response.setContentType("image/png");
        //将图片验证码输出到客户端
        lineCaptcha.write(response.getOutputStream());
        response.getOutputStream().close();
    }
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<div>
    <h1 style="color: red;">${login_error}</h1>
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username" placeholder="请输入用户名">
        <br>
        密码:<input type="password" name="password" placeholder="请输入密码">
        <br>
        验证码:<input type="text" name="captcha" placeholder="请输入验证码">
<%--TODO:这个地方使用'?time='+new Date().getTime()是为了每一次请求都是不一样的--%>
            <img src="${pageContext.request.contextPath}/captchacode" alt="图片验证码" width="40" height="30" onclick="this.src='${pageContext.request.contextPath}/captchacode?time='+new Date().getTime()">
        </input>
        <br>
        <input type="submit" value="登录">
    </form>
</div>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值