一、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)目录结构:
![](https://img2022.cnblogs.com/blog/1835940/202203/1835940-20220325145422957-683915490.png)
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);
}
}
注意:连接数据库一定要有这个!!!
![](https://img2022.cnblogs.com/blog/1835940/202203/1835940-20220325152058947-816957188.png)
4.8)数据库表
![](https://img2022.cnblogs.com/blog/1835940/202203/1835940-20220325153447745-661590528.png)
五、实例介绍:Session已插入!
![](https://img2022.cnblogs.com/blog/1835940/202203/1835940-20220325155249742-1056925162.png)
![](https://img2022.cnblogs.com/blog/1835940/202203/1835940-20220325155605977-396632082.png)
判断登录用户为管理员!
![](https://img2022.cnblogs.com/blog/1835940/202203/1835940-20220325155838553-997067997.png)
登录其他账户判断用户为普通用户!
六、总结:
当用户登陆成功后浏览器会显示插入的Session,咱们可以F12查看到!
扩充:再次demo中我加了分角色展示页面,也可放开思维去拓展,根据用户Role去判断他是什么用户,进行不同方面拓展!
重点:Session可以存放东西多,但是比较占用服务器,会给造成不必要消耗。推荐大数据且不重要数据存放在Cookie中,类似于账号密码可存放再Session中。