Session登录(Oracle数据库)
一、Session是什么?
服务器为了保存用户状态而创建的一个特殊的对象。一个Session会占用一个浏览器,只要浏览器不关闭就会一直存在。
解释:当浏览器第一次访问服务器时,服务器创建一个session对象(该对象有一个唯一的ID)。
重点:Session是存在于服务器上的(Session会占用资源,所以非必要信息尽量不使用Session存储,其他信息如需保留可使用Cookie来存放于浏览器)。
二、Session的作用:
解释:Session用于保存每个用户的专用信息,每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 它的生存期是用户持续请求时间再加上一段时间。
Session中的信息保存在Web服务器内容中,保存的数据量可大可小。当 Session超时或被关闭时将自动释放保存的数据信息。由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低。对于小量的数据,使用Session对象保存还是一个不错的选择。
三、Session的优缺点:
优点:
-
如果要在诸多Web页间传递一个变量,那么用Session变量要比通过QueryString传递变量可使问题简化。
-
可以是任何格式,存储量理论上是无限大的,数据难以被篡改,获取,不容易丢失。
-
可以不用声明就使用,且不用考虑到释放问题。
缺点:
-
占用服务器资源。
-
没有分布式架构,无法支持横向发展。
-
过度使用,代码可读性降低。
四、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中。
争取摘到月亮,即使会坠落。