Cookie免登录!(Oracle数据库)

一、Cookie是什么?

解释:可以认为是一张Vip通行证/饼干(解释就可以用/吃,没有就不能用/吃,过期了也不能用/吃)。

重点:Cookie是存在于浏览器上的(所以不安全)。

二、Cookie的主要作用

  1. 您可以使用Cookie技术存储您的账户登录信息,以便下次可以直接登录。

  2. 存储起始页的首选项。

  3. 使用缓存技术可以减少二次访问网页的加载时间,直接调用缓存数据实现二次打开。

  4. Cookie还可以记录和跟踪购物车的商品信息(如数量),记录用户的访问次数。

三、各浏览器对Cookie的不同限制

四、Cookie的优缺点

优点

  1. 数据持久性

  2. 不需要任何服务器资源。Cookie 存储在客户端并在发送后由服务器读取。

  3. 可配置到期规则。 控制 cookie 的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的 cookie 。

  4. 简单性。 基于文本的轻量结构。

  5. 通过良好的编程,控制保存在cookie中的session对象的大小。

  6. 通过加密和安全传输技术(SSL),减少cookie被破解的可能性。

  7. 只在cookie中存放不敏感数据,即使被盗也不会有重大损失。

缺点

  1. Cookie数量和长度的限制。数量:每个域的 cookie 总数有限。长度:每个 cookie 长度不超过 4KB ( 4096B ),否则会被截掉。

  2. 潜在的安全风险 。Cookie 可能被拦截、篡改。如果 cookie 被拦截,就有可能取得所有的 session 信息。

  3. 用户配置为禁用 。有些用户禁用了浏览器或客户端设备接受 cookie 的能力,因此限制了这一功能。

  4. 有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。

  5. cookie在每次发送http请求时,都会被发送到服务器,一些不必要的信息也会被发送过去,造成不必要的浪费

五、免登录代码实现:(页面有点丑请见谅!!!)

5.1)目录结构:

5.2)登录页面:index.jsp

<%--
  Created by IntelliJ IDEA.
  User: Laugh“
  Date: 2022/1/25
  Time: 17:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Login</title>
    </head>

    <%
        String names = null;
        String pwds = null;
        //获取Cookie对象,因为是多值所以用数组来接收
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            //遍历数组,取出想要的值   getValue() 取得方法
            for(Cookie cookie : cookies){
                //找Cookie对应的Key,取出Key的值
                if(cookie.getName().equals("name")){
                    //取出对应的值 赋值给 names
                    names = cookie.getValue();
                    System.out.println("我是获取的cookie账号:"+ names );
                //找Cookie对应的Key,取出Key的值
                }else if(cookie.getName().equals("pwd")){
                    //取出对应的值 赋值给 pwds
                    pwds = cookie.getValue();
                    System.out.println("我是获取的cookie密码:"+ pwds );
                }
            }
        }

        if(names != null && pwds != null){
            request.getRequestDispatcher("login?name="+ names +"&pwd="+ pwds ).forward(request, response);
        }

    %>
    <body style="margin: auto;text-align: center">
        <form action="login" method="post">
            <p style="margin-top: 80px">
                用户名称:<input type="text" name="name" />
            </p>
            <p>
                用户名称:<input type="password" name="pwd" />
            </p>
            <input type="checkbox" value="1" name="remenberme" /><label>记住我</label>
            <input type="submit" value="提交"/>
        </form>
    </body>
</html>

5.3)登录成功页面:suc.jsp

<%@ page import="java.io.PrintWriter" %>
<%--
  Created by IntelliJ IDEA.
  User: laugh"
  Date: 2022/1/25
  Time: 17:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Suc</title>
    </head>
    <body>
        欢迎<%=request.getAttribute("name") %>登录!
    </body>
</html>

5.4)登录失败页面:error.jsp

<%--
  Created by IntelliJ IDEA.
  User: Laugh”
  Date: 2022/1/27
  Time: 9:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>Error</title>
    </head>
    <body>
        登录失败!请检查账号密码!
    </body>
</html>

5.5)逻辑层:UserServlet  备注:连接数据库的需要换成自己的库,还有需要建一张表

package com.sxtt;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

//注解:提供给前端页面方便找到对应的逻辑层
@WebServlet("/login")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码格式
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        //读取前端输入的账号与密码
        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        String rem = req.getParameter("remenberme");
        //控制台打印是否选中了“记住我”,1:为选中;null:为未选
        System.out.println("是否选择:" + rem);
        int remember = 0;
        /*
        链接数据库
         */
        Connection conn = null;
        Statement s = null;
        ResultSet rs = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XX.XX:XXXXX:XXXX", "数据库账号", "数据库密码");
            String sql = "select * from Stud where NAME='"+name+"'and PWD='"+pwd+"'";
            //打印输入的Sql语句,避免Sql出错
            System.out.println(sql);
            s =  conn.createStatement();
            rs = s.executeQuery(sql);
            //查询出来如果有值则为正确的, 用rs.next()来搞,rs.next()的意思是 下一个值。
            if (rs.next()){
                String UserName = rs.getString(2);
                String UserPwd = rs.getString(3);
                //打印取出来的值
                System.out.println("账号为:"+ UserName);
                System.out.println("密码为:"+ UserPwd);
                //此处判断是否两值一致
                if (UserName.equals(name) && UserPwd.equals(pwd)){
                    //再域中绑定name值,提供suc.jsp页面中使用
                    req.setAttribute("name",name);
                    //判断是否选中页面的 记住我,提供免登录使用
                    if (rem != null){
                        //把获取道德rem封装成Integer类型
                        remember = Integer.parseInt(rem);
                        Cookie Namecookie = new Cookie("name",name);
                        Cookie Pwdcookie = new Cookie("pwd",pwd);
                        //设置Cookie有效时间
                        Namecookie.setMaxAge(remember*60);
                        Pwdcookie.setMaxAge(remember*60);
                        //添加缓存
                        resp.addCookie(Namecookie);
                        resp.addCookie(Pwdcookie);
                    }
                    //跳页面
                    req.getRequestDispatcher("suc.jsp").forward(req, resp);
                }
                //控制台打印
                System.out.println("登录成功!");
            }else {
                resp.sendRedirect("error.jsp");
                System.out.println("用户或密码错误!");
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

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

5.6)数据库表:

六、效果图

6.1)登陆页面:

6.2)登陆成功:

控制台打印截图:

6.3)登陆失败页面:

控制台打印截图:

6.4)登录成功,并选择记住我,添加的缓存:

6.5)直接访问登录页面:

控制台打印:

七、总结

登陆后需要用户自行选择记住我,用以告诉后台记住账号密码,方便下次无需登录访问成功页面!

重点:添加 / 读取缓存。

其次注意:6.2 / 6.5的访问路径!

posted @ 2022-01-27 16:20  Laugh"  阅读(284)  评论(1编辑  收藏  举报