Session入门(非常详细),从零基础入门到精通,看完这一篇就够了_创建session-程序员宅基地

技术标签: 程序员  职业发展  java  前端  互联网  服务器  

目录

1 Session概述

2 Session原理

3 Session使用

3.1 获取Session

3.2 Session保存数据

3.3 Session获取数据

3.4 Session移除数据

4 Session与Request应用区别

4.1 Session和request存储数据

4.2 获取session和request中的值

4.3 session和request区别效果

5 Session的声明周期

5.1 Session有效时间设置

5.2 session销毁

.6 浏览器禁用Cookie解决方案(了解)

6.1 浏览器禁用Cookie的后果

6.2 URL重写

6.3 实现URL重写

7 Session实战权限验证

7.1 创建管理员表manager并添加数据

7.2 创建Web项目

7.3 基础环境搭建

7.4 登录页面

7.5 LoginMgrController

7.6 ShowAllManagerController

7.7 ShowAllManagerJsp

8 Session实战保存验证码

8.1 创建验证码

8.2 登录页面

8.3 LoginMgrController

8.4 ShowAllManagerController

今天的分享就到此结束了

创作不易点赞评论互关三连


1 Session概述

(1)Session用于记录用户的状态。Session指的是一段时间内,单个客户端与Web服务器的一连串相关的交互过程。

(2)在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。

(3)Session是由服务器端创建的

2 Session原理

(1)Session会为每一次会话分配一个Session对象

(2)同一个浏览器发起的多次请求,同属于一次会话(Session)

(3)首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端

3 Session使用

Session作用域:拥有存储数据的空间,作用范围是一次会话有效

  • 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话

  • 可以将数据存入Session中,在一次会话的任意位置进行获取

  • 可传递任何数据(基本数据类型、对象、集合、数组)

3.1 获取Session

Session是服务器端自动创建的,通过request对象获取

package com.cxyzxc.www.servlet01;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "SessionServlet01", value = "/SessionServlet01")
public class SessionServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象,首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端
        HttpSession session = request.getSession();
        System.out.println("ID:" + session.getId());//唯一标记

    }

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

3.2 Session保存数据

使用setArrtibute(属性名,Object)保存数据到session中

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "SessionServlet02", value = "/SessionServlet02")
public class SessionServlet02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象,首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端
        HttpSession session = request.getSession();

        //将数据存储以键值对的形式到session对象中,可传递任何数据(基本数据类型、对象、集合、数组)
        session.setAttribute("username","张三");

    }

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

3.3 Session获取数据

(1)使用getAttribute(“属性名”);获取session中数据。

(2)先访问SessionServlet02将数据存储到session对象中,然后通过GetSessionValueServlet01请求获取session中的数据

package com.cxyzxc.www.servlet01;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "GetSessionValueServlet01", value = "/GetSessionValueServlet01")
public class GetSessionValueServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象
        HttpSession session = request.getSession();
        //获取session对象中的值,获取的值是Object类型,转换为其对应的类型
        String username = (String) session.getAttribute("username");
        System.out.println("session对象中存储的username值:" + username);
    }

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

3.4 Session移除数据

(1)使用removeAttribute(“属性名”);从session中删除数据

(2)向请求SessionServlet02向session对象中存储数据,然后访问GetSessionValueServlet01可以获取session对象中的值,再访问SessionServlet03移除session对象中存储的数据,最后访问GetSessionValueServlet01获取session对象中的值为null

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "SessionServlet03", value = "/SessionServlet03")
public class SessionServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象,首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端
        HttpSession session = request.getSession();

        //通过键移除session作用域中的值
        session.removeAttribute("username");

    }

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

4 Session与Request应用区别

(1)request是一次请求有效,请求改变,则request改变

(2)session是一次会话有效,浏览器改变,则session改变

4.1 Session和request存储数据

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "SessionServlet04", value = "/SessionServlet04")
public class SessionServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象
        HttpSession session = request.getSession();

        //使用session存储数据
        session.setAttribute("username","zhangsan");
        //使用request存储数据
        request.setAttribute("password","123456");

        //重定向
        response.sendRedirect("/webProject10_war_exploded/GetSessionValueServlet01");

    }

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

4.2 获取session和request中的值

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "GetSessionValueServlet01", value = "/GetSessionValueServlet01")
public class GetSessionAndRequestValueServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象
        HttpSession session = request.getSession();
        //获取session对象中的值,获取的值是Object类型,转换为其对应的类型
        String username = (String) session.getAttribute("username");
        //获取request对象中的值,获取的值是Object类型,转换为其对应的类型
        String password = (String) request.getAttribute("password");

        System.out.println("session对象中存储的username值:" + username);
        System.out.println("request对象中存储的password值:" + password);
    }

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

4.3 session和request区别效果

5 Session的声明周期

  1. 开始

    第一次使用到Session的请求产生,则创建Session

  2. 结束

    • 浏览器关闭,则失效

    • Session超时,则失效

      session.setMaxInactiveInterval(seconds);//设置最大有效时间(单位:秒)

    • 手工销毁,则失效

      session.invalidate();//登录退出,销毁

5.1 Session有效时间设置

SessionServlet05类设置session有效期为20秒,先通过请求SessionServlet05类将session存储在,然后在20秒内第一次在GetSessionValueServlet02获取sessionID值,与SessionServlet05类中输出的id值一致,过20秒后在GetSessionValueServlet02类中输出的sessionID值不一致了

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "SessionServlet05", value = "/SessionServlet05")
public class SessionServlet05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象,首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端
        HttpSession session = request.getSession();

        //设置session有效期,时间单位为秒
        session.setMaxInactiveInterval(20);

        //输出sessionid值
        System.out.println("SessionServlet05类中输出ID:"+session.getId());

    }

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

5.2 session销毁

先使用GetSessionValueServlet03类获取session的id值,然后使用GetSessionValueServlet04类获取session的id值,两个类获取的id值一致,在GetSessionValueServlet04类中输出id值后销毁了session,然后再在GetSessionValueServlet03类中获取id值,就不一致了,就是服务器新建的session对象了

5.2.1 GetSessionValueServlet03类

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "GetSessionValueServlet03", value = "/GetSessionValueServlet03")
public class GetSessionValueServlet03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象
        HttpSession session = request.getSession();

        //输出sessionid值
        System.out.println("GetSessionValueServlet03类中输出ID:"+session.getId());

    }

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

5.2.2 GetSessionValueServlet04类

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "GetSessionValueServlet04", value = "/GetSessionValueServlet04")
public class GetSessionValueServlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象
        HttpSession session = request.getSession();

        //输出sessionid值
        System.out.println("GetSessionValueServlet04类中输出ID:"+session.getId());

        //销毁session
        session.invalidate();

    }

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

.6 浏览器禁用Cookie解决方案(了解)

6.1 浏览器禁用Cookie的后果

服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁止Cookie,则sessionID不会被浏览器保存,此时,服务器可以使用URL重写这样的方式来发送sessionID

多次请求GetSessionValueServlet05类输出的session的id值都不相同,并且在网站的Cookie对象中没有session的id值存在

6.2 URL重写

浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即在原来的地址后面加上了sessionID)

6.3 实现URL重写

response.encodeRedirectURL(String url)生成重写的URL

6.3.1 重写URL

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "GetSessionValueServlet06", value = "/GetSessionValueServlet06")
public class GetSessionValueServlet06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象
        HttpSession session = request.getSession();

        //输出sessionid值
        System.out.println("GetSessionValueServlet06类中输出ID:"+session.getId());

        //重写URL追加session值
        String newURL = response.encodeURL("/webProject10_war_exploded/GetSessionValueServlet07");
        System.out.println("重写后的URL:"+newURL);
        //重定向
        response.sendRedirect(newURL);

    }

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

6.3.1 获取session

package com.cxyzxc.www.servlet01;

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;

@WebServlet(name = "GetSessionValueServlet07", value = "/GetSessionValueServlet07")
public class GetSessionValueServlet07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求参数的编码格式,这种方式对get请求方式无效
        request.setCharacterEncoding("UTF-8");
        //设置响应编码格式为UTF-8
        response.setContentType("text/html;charset=UTF-8");

        //获取Session对象
        HttpSession session = request.getSession();

        //输出sessionid值
        System.out.println("GetSessionValueServlet07类中输出ID:"+session.getId());


    }

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

7 Session实战权限验证

7.1 创建管理员表manager并添加数据

7.2 创建Web项目

创建Web项目,导入相关jar包

  • commons-dbutils-1.7.jar

  • druid-1.1.5.jar

  • mysql-connector-java-5.1.25-bin.jar

  • servlet-api.jar

7.3 基础环境搭建

在项目下创建包目录结构如下

  • com.cxyzxc.www.controller包:调用业务逻辑Servlet

  • com.cxyzxc.www.dao包:数据访问层接口

  • com.cxyzxc.www.dao.impl包:数据访问层接口实现类

  • com.cxyzxc.www.entity包:实体类

  • com.cxyzxc.www.jsp包:打印显示页面Servlet

  • com.cxyzxc.www.service包:业务逻辑层接口

  • com.cxyzxc.www.service.impl包:业务逻辑层接口实现类

  • com.cxyzxc.www.utils包:工具类

  • database.properties:数据库连接及连接池配置文件

7.4 登录页面

7.4.1 login.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>管理员登录页面</title>
        <link type="text/css" rel="stylesheet" href="css/login.css"/>
    </head>

    <body>
        <div>
            <form action="LoginMgrController" method="post">
                <p>
                    账号:<input type="text" name="username"/>
                </p>
                <p>
                    密码:<input type="password" name="password"/>
                </p>
                <p>
                    <input type="submit" value="登录"/>
                </p>
            </form>
        </div>
    </body>
</html>

7.4.2 login.css

* {
    margin: 0;
    padding: 0;
}

div {
    width: 400px;
    background-color: #ccc;
    margin: 30px auto;
    padding-top: 30px;
    text-align: center;
}

p {
    margin-top: 10px;
}

input {
    outline: none;
}

7.5 LoginMgrController

package com.cxyzxc.www.controller;

import com.cxyzxc.www.entity.Manager;
import com.cxyzxc.www.service.ManagerService;
import com.cxyzxc.www.service.impl.ManagerServiceImpl;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "LoginMgrController", value = "/LoginMgrController")
public class LoginMgrController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、处理乱码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //2、收参(获取客户端发送过来的请求数据)
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //3、调用业务方法
        ManagerService managerService = new ManagerServiceImpl();
        Manager manager = managerService.login(username, password);


        //4、处理结果,根据结果做不同的跳转
        if (manager != null) {//manager不为null,说明账号和密码正确,登录成功
            //将获取的账号和密码信息存储在session中
            HttpSession session = request.getSession();
            session.setAttribute("manager", manager);
            //跳转到显示所有管理员信息的Servlet
            response.sendRedirect("/managerProject01_war_exploded/ShowAllManagerController");
        } else {//manager为null。说明账号或者密码错误,登录失败
            response.sendRedirect("/managerProject01_war_exploded/login.html");
        }


    }

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

7.6 ShowAllManagerController

package com.cxyzxc.www.controller;

import com.cxyzxc.www.entity.Manager;
import com.cxyzxc.www.service.ManagerService;
import com.cxyzxc.www.service.impl.ManagerServiceImpl;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;

@WebServlet(name = "ShowAllManagerController", value = "/ShowAllManagerController")
public class ShowAllManagerController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、处理乱码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //通过HttpSession完成权限控制
        HttpSession session =request.getSession();
        //获取session中存储的值
        Manager manager = (Manager)session.getAttribute("manager");
        //判断获取的值
        if(manager!=null){
            //调用业务,只做业务,业务与显示分离
            ManagerService managerService = new ManagerServiceImpl();
            List<Manager> managers =managerService.showAllManager();
            //将获取的数据存储在request作用域中
            request.setAttribute("managers",managers);
            //转发,跳转到显示结果的Servlet
            request.getRequestDispatcher("/ShowAllManagerJsp").forward(request,response);
        }else{
            //说明没有登录,要先去登录才能进行显示
            response.sendRedirect("/managerProject01_war_exploded/login.html");
        }
    }

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

7.7 ShowAllManagerJsp

package com.cxyzxc.www.jsp;

import com.cxyzxc.www.entity.Manager;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

@WebServlet(name = "ShowAllManagerJsp", value = "/ShowAllManagerJsp")
public class ShowAllManagerJsp extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、处理乱码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //2、获取数据
        List<Manager> managers = (List<Manager>) request.getAttribute("managers");

        //获取输出流
        PrintWriter printWriter = response.getWriter();
        if (managers.size() != 0) {
            printWriter.println("<html>");
            printWriter.println("<head>");
            printWriter.println("<title>所有管理员</title>");
            printWriter.println("<link type=\"text/css\" rel=\"stylesheet\" href=\"css/table.css\" />");
            printWriter.println("</head>");
            printWriter.println("<table border='1px' cellspacing='0'>");
            printWriter.println("<tr>");
            printWriter.println(" <th>序号</th>");
            printWriter.println(" <th>账号</th>");
            printWriter.println(" <th>密码</th>");
            printWriter.println(" <th>操作</th>");
            printWriter.println(" </tr>");
            for (int i = 0; i < managers.size(); i++) {
                printWriter.println("<tr>");
                printWriter.println("<td>" + (i + 1) + "</td>");
                printWriter.println("<td>" + managers.get(i).getUsername() + "</td>");
                printWriter.println("<td>" + managers.get(i).getPassword() + "</td>");
                printWriter.println("<td><a href=\"#\">修改</a> <a href=\"#\">删除</a></td>");
                printWriter.println("</tr>");
            }
            printWriter.println("</table>");
            printWriter.println("</html>");
        } else {
            printWriter.println("<h2>数据库中没有数据查询</h2>");
        }
    }

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

8 Session实战保存验证码

生成验证码的方式有很多种,可以使用随机数的方式实现,也可以使用ValidateCode类来实现(需要导入ValidateCode.jar包)。在这里,我们学习使用ValidateCode类来生成验证码

8.1 创建验证码

package com.cxyzxc.www.controller;

import cn.dsna.util.images.ValidateCode;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

/**
 * 此Servlet的作用是生成验证码并将生成的验证码存储到session中、发送到页面中显示
 */
@WebServlet(name = "VerificationServlet", value = "/VerificationServlet")
public class VerificationServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置验证码规格
        ValidateCode validateCode = new ValidateCode(200, 20, 4, 10);
        //获取验证码
        String code = validateCode.getCode();
        //将验证码存储在session中
        HttpSession session = request.getSession();
        session.setAttribute("code",code);
        //将验证码输出到客户端
        validateCode.write(response.getOutputStream());
    }

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

8.2 登录页面

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>管理员登录页面</title>
        <link type="text/css" rel="stylesheet" href="css/login.css"/>
    </head>

    <body>
        <div>
            <form action="LoginMgrController" method="post">
                <p>
                    账号:<input type="text" name="username"/>
                </p>
                <p>
                    密码:<input type="password" name="password"/>
                </p>
                <p>
                    验证码:<input type="text" name="verification"/>
                    <img src="/managerProject02_war_exploded/VerificationServlet" />
                </p>
                <p>
                    <input type="submit" value="登录"/>
                </p>
            </form>
        </div>
    </body>
</html>

8.3 LoginMgrController

package com.cxyzxc.www.controller;

import com.cxyzxc.www.entity.Manager;
import com.cxyzxc.www.service.ManagerService;
import com.cxyzxc.www.service.impl.ManagerServiceImpl;

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;

@WebServlet(name = "LoginMgrController", value = "/LoginMgrController")
public class LoginMgrController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、处理乱码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //2、收参(获取客户端发送过来的请求数据)
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String inputCodde = request.getParameter("verification");

        //获取session中的验证码
        HttpSession session = request.getSession();
        String codes = (String) session.getAttribute("code");

        if (!inputCodde.isEmpty() && inputCodde.equalsIgnoreCase(codes)) {
            //3、调用业务方法
            ManagerService managerService = new ManagerServiceImpl();
            Manager manager = managerService.login(username, password);

            //4、处理结果,根据结果做不同的跳转
            if (manager != null) {//manager不为null,说明账号和密码正确,登录成功
                //将获取的账号和密码信息存储在session中
                HttpSession session2 = request.getSession();
                session2.setAttribute("manager", manager);
                //跳转到显示所有管理员信息的Servlet
                response.sendRedirect("/managerProject02_war_exploded/ShowAllManagerController");
            } else {//manager为null。说明账号或者密码错误,登录失败
                response.sendRedirect("/managerProject02_war_exploded/login.html");
            }
        } else {//验证码不对,重新登录
            response.sendRedirect("/managerProject02_war_exploded/login.html");
        }


    }

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

8.4 ShowAllManagerController

package com.cxyzxc.www.controller;

import com.cxyzxc.www.entity.Manager;
import com.cxyzxc.www.service.ManagerService;
import com.cxyzxc.www.service.impl.ManagerServiceImpl;

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;
import java.util.List;

@WebServlet(name = "ShowAllManagerController", value = "/ShowAllManagerController")
public class ShowAllManagerController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过HttpSession完成权限控制
        HttpSession session =request.getSession();
        //获取session中存储的值
        Manager manager = (Manager)session.getAttribute("manager");
        //判断获取的值
        if(manager!=null){
            //调用业务,只做业务,业务与显示分离
            ManagerService managerService = new ManagerServiceImpl();
            List<Manager> managers =managerService.showAllManager();
            //将获取的数据存储在request作用域中
            request.setAttribute("managers",managers);
            //转发,跳转到显示结果的Servlet
            request.getRequestDispatcher("/ShowAllManagerJsp").forward(request,response);
        }else{
            //说明没有登录,要先去登录才能进行显示
            response.sendRedirect("/managerProject02_war_exploded/login.html");
        }
    }

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

今天的分享就到此结束了

创作不易点赞评论互关三连

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

  • 2023届全国高校毕业生预计达到1158万人,就业形势严峻;

  • 国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

    一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

`黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Javachichi/article/details/131743788

智能推荐

linux里面ping www.baidu.com ping不通的问题_linux桥接ping不通baidu-程序员宅基地

文章浏览阅读3.2w次,点赞16次,收藏90次。对于这个问题我也是从网上找了很久,终于解决了这个问题。首先遇到这个问题,应该确认虚拟机能不能正常的上网,就需要ping 网关,如果能ping通说明能正常上网,不过首先要用命令route -n来查看自己的网关,如下图:第一行就是默认网关。现在用命令ping 192.168.1.1来看一下结果:然后可以看一下电脑上面百度的ip是多少可以在linux里面ping 这个IP,结果如下:..._linux桥接ping不通baidu

android 横幅弹出权限,有关 android studio notification 横幅弹出的功能没有反应-程序员宅基地

文章浏览阅读512次。小妹在这里已经卡了2-3天了,研究了很多人的文章,除了低版本api 17有成功外,其他的不是channel null 就是没反应 (channel null已解决)拜托各位大大,帮小妹一下,以下是我的程式跟 gradle, 我在这里卡好久又没有人可问(哭)![image](/img/bVcL0Qo)public class MainActivity extends AppCompatActivit..._android 权限申请弹窗 横屏

CNN中padding参数分类_cnn “相同填充”(same padding)-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏6次。valid padding(有效填充):完全不使用填充。half/same padding(半填充/相同填充):保证输入和输出的feature map尺寸相同。full padding(全填充):在卷积操作过程中,每个像素在每个方向上被访问的次数相同。arbitrary padding(任意填充):人为设定填充。..._cnn “相同填充”(same padding)

Maven的基础知识,java技术栈-程序员宅基地

文章浏览阅读790次,点赞29次,收藏28次。手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长![外链图片转存中…(img-Qpoc4gOu-1712656009273)][外链图片转存中…(img-bSWbNeGN-1712656009274)]

getFullYear()和getYear()有什么区别_getyear和getfullyear-程序员宅基地

文章浏览阅读469次。Date对象取得年份有getYear和getFullYear两种方法经 测试var d=new Date;alert(d.getYear())在IE中返回 2009,在Firefox中会返回109。经查询手册,getYear在Firefox下返回的是距1900年1月1日的年份,这是一个过时而不被推荐的方法。而alert(d.getFullYear())在IE和FF中都会返回2009。因此,无论何时都应使用getFullYear来替代getYear方法。例如:2016年用 getFullYea_getyear和getfullyear

Unix传奇 (上篇)_unix传奇pdf-程序员宅基地

文章浏览阅读182次。Unix传奇(上篇) 陈皓 了解过去,我们才能知其然,更知所以然。总结过去,我们才会知道我们明天该如何去规划,该如何去走。在时间的滚轮中,许许多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道,流传至今。要知道明天怎么去选择,怎么去做,不是盲目地跟从今天各种各样琳琅满目前沿技术,而应该是去 —— 认认真真地了解和回顾历史。 Unix是目前还在存活的操作系_unix传奇pdf

随便推点

ACwing 哈希算法入门:_ac算法 哈希-程序员宅基地

文章浏览阅读308次。哈希算法:将字符串映射为数字形式,十分巧妙,一般运用为进制数,进制据前人经验,一般为131,1331时重复率很低,由于字符串的数字和会很大,所以一般为了方便,一般定义为unsigned long long,爆掉时,即为对 2^64 取模,可以对于任意子序列的值进行映射为数字进而进行判断入门题目链接:AC代码:#include<bits/stdc++.h>using na..._ac算法 哈希

VS配置Qt和MySQL_在vs中 如何装qt5sqlmysql模块-程序员宅基地

文章浏览阅读952次,点赞13次,收藏27次。由于觉得Qt的编辑界面比较丑,所以想用vs2022的编辑器写Qt加MySQL的项目。_在vs中 如何装qt5sqlmysql模块

【渝粤题库】广东开放大学 互联网营销 形成性考核_画中画广告之所以能有较高的点击率,主要由于它具有以下特点-程序员宅基地

文章浏览阅读1k次。选择题题目:下面的哪个调研内容属于经济环境调研?()题目:()的目的就是加强与客户的沟通,它是是网络媒体也是网络营销的最重要特性。题目:4Ps策略中4P是指产品、价格、顾客和促销。题目:网络市场调研是目前最为先进的市场调研手段,没有任何的缺点或不足之处。题目:市场定位的基本参数有题目:市场需求调研可以掌握()等信息。题目:在开展企业网站建设时应做好以下哪几个工作。()题目:对企业网站首页的优化中,一定要注意下面哪几个方面的优化。()题目:()的主要作用是增进顾客关系,提供顾客服务,提升企业_画中画广告之所以能有较高的点击率,主要由于它具有以下特点

爬虫学习(1):urlopen库使用_urlopen the read operation timed out-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏5次。以爬取CSDN为例子:第一步:导入请求库第二步:打开请求网址第三步:打印源码import urllib.requestresponse=urllib.request.urlopen("https://www.csdn.net/?spm=1011.2124.3001.5359")print(response.read().decode('utf-8'))结果大概就是这个样子:好的,继续,看看打印的是什么类型的:import urllib.requestresponse=urllib.r_urlopen the read operation timed out

分享读取各大主流邮箱通讯录(联系人)、MSN好友列表的的功能【升级版(3.0)】-程序员宅基地

文章浏览阅读304次。修正sina.com/sina.cn邮箱获取不到联系人,并精简修改了其他邮箱代码,以下就是升级版版本的介绍:完整版本,整合了包括读取邮箱通讯录、MSN好友列表的的功能,目前读取邮箱通讯录支持如下邮箱:gmail(Y)、hotmail(Y)、 live(Y)、tom(Y)、yahoo(Y)(有点慢)、 sina(Y)、163(Y)、126(Y)、yeah(Y)、sohu(Y) 读取后可以发送邮件(完..._通讯录 应用读取 邮件 的相关

云计算及虚拟化教程_云计算与虚拟化技术 教改-程序员宅基地

文章浏览阅读213次。云计算及虚拟化教程学习云计算、虚拟化和计算机网络的基本概念。此视频教程共2.0小时,中英双语字幕,画质清晰无水印,源码附件全课程英文名:Cloud Computing and Virtualization An Introduction百度网盘地址:https://pan.baidu.com/s/1lrak60XOGEqMOI6lXYf6TQ?pwd=ns0j课程介绍:https://www.aihorizon.cn/72云计算:概念、定义、云类型和服务部署模型。虚拟化的概念使用 Type-2 Hyperv_云计算与虚拟化技术 教改