• 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的访问路径!

  • 相关阅读:
    马克思主义哲学是否只是“抄袭”和断章取义了别人的思想
    马克思的思想说到底都是抄袭
    答郭沫若的《卖淫妇的饶舌》(节录)--马克思思想批判
    联系的普遍性
    辩证
    (实用篇)使用PHP生成PDF文档
    discuz!
    Access是什么?
    putty 与winscp 区别
    xshell 与 putty
  • 原文地址:https://www.cnblogs.com/superyonng/p/15850243.html
Copyright © 2020-2023  润新知