Session登录(Oracle数据库)

一、Session是什么?

服务器为了保存用户状态而创建的一个特殊的对象。一个Session会占用一个浏览器,只要浏览器不关闭就会一直存在。

解释:当浏览器第一次访问服务器时,服务器创建一个session对象(该对象有一个唯一的ID)。

重点:Session是存在于服务器上的(Session会占用资源,所以非必要信息尽量不使用Session存储,其他信息如需保留可使用Cookie来存放于浏览器)。

二、Session的作用

解释:Session用于保存每个用户的专用信息,每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 它的生存期是用户持续请求时间再加上一段时间。
Session中的信息保存在Web服务器内容中,保存的数据量可大可小。当 Session超时或被关闭时将自动释放保存的数据信息。由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低。对于小量的数据,使用Session对象保存还是一个不错的选择。

三、Session的优缺点

优点

  1. 如果要在诸多Web页间传递一个变量,那么用Session变量要比通过QueryString传递变量可使问题简化。

  2. 可以是任何格式,存储量理论上是无限大的,数据难以被篡改,获取,不容易丢失。

  3. 可以不用声明就使用,且不用考虑到释放问题。

缺点

  1. 占用服务器资源。

  2. 没有分布式架构,无法支持横向发展。

  3. 过度使用,代码可读性降低。

四、Session登录代码实现(这里不考虑登陆失败!):

4.1)目录结构:

4.2)登录页面:index.jsp

<%--
  Created by IntelliJ IDEA.
  User: Laugh"
  Date: 2021/12/20
  Time: 10:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Login/登录</title>
</head>
<body style="margin: auto;text-align: center">
    <form action="loginer" method="post">
        <p style="margin-top: 80px">
            用户名称:<input type="text" name="name" />
        </p>
        <p>
            用户名称:<input type="password" name="pwd" />
        </p>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

4.3)管理员页面:GuanLiYuan.jsp

<%@ page import="com.entity.User" %>
<%--
  Created by IntelliJ IDEA.
  User: Laugh"  管理员
  Date: 2021/12/20
  Time: 10:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        User user = (User) session.getAttribute("user");
        if (user == null ){ //如果user等于null 则证明没有登录
            session.setAttribute("msg","请登录!");
            response.sendRedirect("index.jsp");
        }
    %>
    欢迎<%=user.getUsername() %><span>管理员</span>登录
</body>
</html>

4.4)普通用户页面:PuTongYongHu.jsp

<%@ page import="com.entity.User" %>
<%--
  Created by IntelliJ IDEA.
  User: Laugh" 普通用户
  Date: 2021/12/20
  Time: 10:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    User user = (User) session.getAttribute("user");
    if (user == null ){ //如果user等于null 则证明没有登录
        session.setAttribute("msg","请登录!");
        response.sendRedirect("index.jsp");
    }
%>
欢迎<%=user.getUsername() %><span>普通用户</span>
</body>
</html>

4.5)实体创建:User

package com.entity;
import java.sql.Date;

public class User {
    private int userid;
    private String username;
    private String userpwd;
    private Date userdate;
    private int userrole;

    public User() {
    }

    public User(int userid, String username, String userpwd, Date userdate, int userrole) {
        this.userid = userid;
        this.username = username;
        this.userpwd = userpwd;
        this.userdate = userdate;
        this.userrole = userrole;
    }

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
    }

    public Date getUserdate() {
        return userdate;
    }

    public void setUserdate(Date userdate) {
        this.userdate = userdate;
    }

    public int getUserrole() {
        return userrole;
    }

    public void setUserrole(int userrole) {
        this.userrole = userrole;
    }
}

4.6)工具类:util(这里是工具类,连接数据库使用,可直接替换为自己的库,注意:账号密码等信息不要错误哦)

package com.JDBC;

import java.sql.Connection;
import java.sql.DriverManager;

public class util {
    private static Connection conn = null;
    public static Connection getConnection() {
        try {
            if(conn==null || conn.isClosed()) {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XX.XX:25220:XXXX", "数据库账号", "数据库密码");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    //检测是否连接数据库成功
    /*
     * public static void main(String[] args) { System.out.println(getConnection());
     * System.out.println(getConnection()); }
     */
}

4.7)登录逻辑层(没有使用Util工具类)

package com.zgtt;
import com.entity.User;

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

@WebServlet("/loginer")
public class C extends HttpServlet {

    static List<User> users = new ArrayList<>();
    @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 sql = "select * from Manger where USERNAME=? and USERPWD =?";
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XX.XX:25220:ttdb", "数据库账号", "数据库密码");
            ps = conn.prepareStatement(sql);
            ps.setString(1,name);
            ps.setString(2,pwd);
            rs = ps.executeQuery();

            //如过有下一个则成功
            if(rs.next()){
                User user = new User(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getDate(4),rs.getInt(5));
                //绑定Session
                HttpSession session = req.getSession();
                session.setAttribute("user",user);
                req.getServletPath();
                if (user.getUserrole() == 1 ){
                    resp.sendRedirect("GuanLiYuan.jsp");
                }else {
                    resp.sendRedirect("PuTongYongHu.jsp");
                }
            }else {
                resp.sendRedirect("index.jsp");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

注意:连接数据库一定要有这个!!!

4.8)数据库表

五、实例介绍:Session已插入!

判断登录用户为管理员!

登录其他账户判断用户为普通用户!

六、总结:

当用户登陆成功后浏览器会显示插入的Session,咱们可以F12查看到!

扩充:再次demo中我加了分角色展示页面,也可放开思维去拓展,根据用户Role去判断他是什么用户,进行不同方面拓展!

重点:Session可以存放东西多,但是比较占用服务器,会给造成不必要消耗。推荐大数据且不重要数据存放在Cookie中,类似于账号密码可存放再Session中。

posted @ 2022-03-25 11:46  Laugh"  阅读(372)  评论(2编辑  收藏  举报