Cookie和Session

目录

前言

Cookie 

Session

核心方法 

HttpServletRequest

HttpServletResponse

HttpSession

模拟登陆

上传文件

核心方法


前言

 前边博客我们学了cookie,浏览器在本地持久化保存数据的一种方案,本篇博客我们将学习session会话机制,服务器端的机制

Cookie 

cookie是浏览器在本地持久化保存数据的一种方案,具体使用在前边博客有过讲解 

Session

服务器同一时刻收到的请求是很多的,服务器需要清楚地区分每个请求是属于哪个用户的,就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系

核心方法 

HttpServletRequest

方法描述
HttpSession
getSession()
参数填写false时,判定当前会话是否存在,如果不存在,就直接返回null,存在则返回对应的HttpSession对象;参数填写true,判定当前会话是否存在,如果不存在,就创建一个新的键值对,保存到哈希表中,并把生成的sessionId返回到浏览器这里,如果存在,则直接返回对应的HttpSession
Cookie[]
getCookies()
返回一个数组 , 包含客户端发送该请求的所有的 Cookie 对象 . 会自动把Cookie 中的格式解析成键值对 .

HttpServletResponse

方法描述
void addCookie(Cookie cookie)
把指定的 cookie 添加到响应中 .

HttpSession

一个HttpSession里边包含多个键值对 

方法描述
Object getAttribute(String
name)
该方法返回在该 session 会话中具有指定名称的对象,如果没
有指定名称的对象,则返回 null.
void setAttribute(String
name, Object value)
该方法使用指定的名称绑定一个对象到该 session 会话
boolean isNew()
判定当前是否是新创建出的会话
方法描述
String getName()
该方法返回 cookie 的名称。名称在创建后不能改变。 ( 这个值是 Set
Cooke 字段设置给浏览器的 )
String getValue()
该方法获取与 cookie 关联的值
void setValue(String
newValue)
该方法设置与 cookie 关联的值

模拟登陆

1、登录页面,用户可以填写用户名+密码

2、Servlet来处理登录请求

3、使用另一个Servlet来生成主页内容(登陆成功后,跳转到的页面)

package 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;

/**
 * @author krystal
 * @date 2022/12/2 10:18
 */
//使用这个类来处理登录请求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、从请求中获取到页面提交的用户名和密码
        String username=req.getParameter("username");
        String password=req.getParameter("password");

        // 2. 验证用户名密码是否正确
        //    正常这个操作要查数据库. 此处为了简单, 直接写成硬编码了. (把正确的用户名和密码写死了)
        //    假定正确的密码是 zhangsan 123
        if("zhangsan".equals(username) && "123".equals(password)){
            // 登陆成功
            // a) 创建一个会话. 用户刚登陆成功, 之前是没有会话的. 重新分配个新的会话给用户.
            // getSession
            //    * 创建 sessionId 和一个 HttpSession 对象
            //    * 把这两个内容以键值对的形式插入到内存的 哈希表 里
            //    * 把 sessionId 通过 Set-Cookie 写到响应中.
            HttpSession session = req.getSession(true);
            // 随意的设置 "键值对" 了. (HttpSession 对象自身也相当于是一个 哈希表)
            session.setAttribute("username", "zhangsan");
            // b) 让响应重定向到 "主页"
            resp.sendRedirect("index");
        }else {
            //登陆失败
            resp.setStatus(403);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("登陆失败,用户名或者密码错误!");
        }
    }
}
package 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;

/**
 * @author krystal
 * @date 2022/12/2 10:18
 */
//登陆成功后,要跳转的页面
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 首页中也先获取 session, 此处的 session 正是刚才登陆页的时候, 登陆成功的逻辑中创建出来的.
        // 此处 参数 写作 false 即可. 表示不新建. 如果不存在, 就返回 null 就是了.
        HttpSession session=req.getSession(false);
        if (session==null){
            resp.setStatus(403);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("您尚未登录,不能访问主页");
            return;
        }
        String username=(String)session.getAttribute("username");
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("欢迎来到主页!"+username);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form action="login" method="post">
        <input type="text" name="username">
        <input type="text" name="password">
        <input type="submit" value="登陆">
    </form>
</body>
</html>

上传文件

核心方法

HttpServletRequest 类方法

方法描述
Part getPart(String name)
获取请求中给定 name 的文件
Collection<Part> getParts()
获取所有的文件

Part 类方法

方法描述
String getSubmittedFileName()
获取提交的文件名
String getContentType()
获取提交的文件类型
long getSize()
获取文件的大小
void write(String path)
把提交的文件数据写入磁盘文件
package upload;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

/**
 * @author krystal
 * @date 2022/12/2 11:41
 */
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part part=req.getPart("myfile");
        System.out.println(part.getSubmittedFileName());
        System.out.println(part.getSize());
        System.out.println(part.getContentType());
        part.write("D:/wenjian/tmp/result.jpg");
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="myfile">
        <input type="submit" value="提交">
    </form>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值