【Servlet学习六】Cookie 与Session && 实现登录与上传文件

目录

一、Cookie与Session(掌握)

🌈1、Cookie是什么?

🌈2、Session是什么?

二、代码功能演示

🌈1、实现登录功能(掌握)

🌈2、实现上传文件功能(掌握)

1、目标:实现程序,通过网页上传一张图片到服务器。

2、核心方法总结


一、Cookie与Session(掌握)

🌈1、Cookie是什么?

问题1:为什么会有cookie?

        HTTP协议本身是“无状态”协议,这里的无状态指的是:默认HTTP协议的客户端与服务器之间的通信,和下次之间的通信没有直接关系。但是在实际开发中,很多请求之间是有关联的。比如我现在登录CSDN,登录成功之后来到主页面,当我想要访问该主页面的一个“发布博客”按钮,跳转到新的页面的时候,由于没有记录当前的登录状态,所以每次跳转一个新的页面,就要你不断的进行登录,非常麻烦,所以实际中我们需要在登录一次成功之后,就将这个登录信息记录下来,当第二次访问的时候服务器就知道该请求是否已经登录过了。由于HTTP不支持,所以通过Cookie和Session来解决HTTP无状态的问题。(之前的博文中有提到

 图中的 "令牌" 通常就存储在 Cookie 字段中。

问题2:cookie是什么?

Cookie是客户端保存数据的一种机制,一个典型的应用场景是保存用户的登录信息。

🌈2、Session是什么?

问题1:为什么会有Session?

(1) Cookie是工作在浏览器端,Session工作在服务器端,两者都是用来保存某一个数据的。Session的主要作用是用于识别是哪一个用户(会话)访问了服务器。

(2)由于服务器在同一时刻收到的请求是非常多的,所以服务器需要清楚的知道目前的这个请求是来自于哪个用户的,所以在前面给用户令牌的时候,服务器这边也要记录下每个用户令牌以及用户信息的对应关系。

(3)要存储这个对应关系,因此Session本质就是通过一个“哈希表”来存储的,key值记录令牌的Id(可以叫做token/sessionId),这个Id是服务器端生成的一个“唯一性字符串”,value就是用户信息,底层也是一个HashMap。(用户信息可以根据需求灵活设计)。

(4)如果删除了本地的cookie之后,再访问该网站就会变为未登录状态。        

 

 问题2:理解Cookie与Session的整个过程?

 (1)当用户登录时,服务器在Session中新增一条记录,并将SessionId返回给客户端;

(2)客户端后续再给服务器端发送请求的时候,需要在请求中带上sessionId. (例如通过 HTTP 请求中的 Cookie 字段带上);

(3)服务器收到请求之后,根据请求中的sessionId在Session信息中获取到对应的用户信息,再进行后续操作。

 举个例子:

        到了医院看病,在挂号的时候(类比于第一次访问服务器)要求提供身份证(进行登录),然后医院会返回给你一个“就诊卡”,然后在医院这边会在系统库中记录下每个就诊卡和用户之间的关系,用户将“就诊卡”收好( 服务器返回给浏览器一个“令牌”,浏览器这边将令牌收好),之后再去各个科室进行检查等,就不用再出示身份证了,只要凭借“就诊卡”,医院这边在自己的信息库里面查询就可以识别出当前用户的身份(之后再进行其他操作,就不用再进行登录了,因为已经记录了登录的信息)。


二、代码功能演示

🌈1、实现登录功能(掌握)

(1)HTML文件:login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <!-- API接口的URL,method中写的是请求的方法:POST,GET,表单提交的时候一般都是POST -->
    <form action="login" method="post">
        <!-- 使用表单提交的时候,一定要有name属性,相应标签的值会和name属性中设置的内容拼接成key value的形式提交到服务器 -->
        <input type = "text" name="username">        
        <input type = "text" name="password">
        <button type="submit">登录</button>
    </form>
</body>
</html>

(2)后端代码:LoginInServlet.java与indexServlet .java

@WebServlet("/login")
public class LoginInServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //String username
        //String password
        //1、设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset = utf-8");
        //2、获取参数
        String username = req.getParameter("username");//username和前端的name的值对应
        String password = req.getParameter("password");
        //3、校验
        if(username == null || !username.equals("zhangsan") ||
            password == null || !password.equals("123456")){
            resp.getWriter().write("请输入正确的用户名和密码");
            return;
        }
        //4、登录成功,保存用户的信息到Session中(跳转到另一个界面)
        //(1)获取Session
        //传入True:表示第一次登录的时候(访问后端的时候),创建一个Session
        HttpSession session = req.getSession(true);
        //(2)将当前用户信息保存到Session中,每次操作的时候都会查找cookie中是否有session信息,
        session.setAttribute("userInfo",username);
        //(3)跳转到payServlet的地址
        resp.sendRedirect("index");
    }
}
@WebServlet("/index")
public class indexServlet extends HttpServlet {
    //获取当前用户Session
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //2、获取当前用户的session:
        HttpSession session = req.getSession(false);
        //3、判断当前用户是否登录
        if(session == null){
            resp.getWriter().write("没有登录,请重新登录");
            return;
        }
        //4、说明已经登录了,判断用户存不存在
        //获取当前登录的用户对象
        String username = (String) session.getAttribute("userInfo");
        //判断该对象名是否正确
        if(username == null || username.equals("")){
            resp.getWriter().write("没有找到用户信息,请重新登录");
            return;
        }
        //否则:登录成功,页面上显示用户名
        resp.getWriter().write("欢迎回来"+username);
    }
}

(3)功能演示

response.sendRedirect()实现重定向(页面跳转)_智慧浩海的博客-CSDN博客

(1)不输入任何内容,给出提示

 

 (2)输入错误的用户名或者密码,给出提示

 

(3)输入正确的用户名或者密码

 

🌈2、实现上传文件功能(掌握)

1、目标:实现程序,通过网页上传一张图片到服务器。

(1)HTML文件: upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
      <input type="file" name="uploadFile">
      <button type="submit">提交</button>
    </form>
</body>
</html>

(2)后端代码:Demo1_upload.java

@WebServlet("/upload")
//注意:要加这个注解
@MultipartConfig
public class Demo1_upload extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html,charset=utf-8");
        //2、获取上传的文件:注意这里用req.getPart()获取文件,而不是getParameter(),它获取的是String类型
        Part file = req.getPart("uploadFile");
        //3、获取文件信息
        System.out.println("文件名是"+file.getSubmittedFileName());
        System.out.println("文件类型是"+file.getContentType());
        System.out.println("文件大小是"+file.getSize());
        //4、将文件写入指定的磁盘中
        file.write("d:/"+file.getSubmittedFileName());
        //5、返回响应
        resp.getWriter().write("文件上传成功"+file.getSubmittedFileName());
    }
}

注意点:

(1)前端:

(2)后端:

  • 需要给 UploadServlet 加上 @MultipartConfig 注解,否则服务器代码无法使用 getPart 方法。
  • Part类,用于获取上传的文件。
  • getPart 的参数 需要和 form 中 input 标签的 name 属性对应;
  • 客户端一次可以提交多个文件, (使用多个 input 标签),此时服务器可以通过 getParts 获取所有的Part 对象。

效果:

(3)最终效果

(1)选择文件

(2)点击提交按钮

 (3) 在d盘可以找见上传的文件:

2、核心方法总结

(1)HttpServletRequest 类方法

方法描述
Part getPart(String name)获取请求中给定 name 的文件

Collection<Part> getParts()

获取所有的文件

(2)Part 类方法

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值