session是运行机制

本文详细介绍了HTTP协议下Session的工作原理及实现方式,包括Session如何通过浏览器的Cookie或URL传递标识符(session_id)给服务器,以便服务器识别不同的用户。还讨论了在禁用Cookie的情况下如何继续使用Session。

由于浏览器和WEB服务器是通过http协议进行通信的,http协议是无状态协议,无法保存用户的状态信息,每次发送的请求都会被当做一个独立的请求来看待。为了让服务器可以得到用户的状态信息,session便应运而生。

session保存在服务器端,默认是以文件的形式保存的服务器的文件系统里。通过配置文件是session.save_path可以指定session文件的存储路径。

当然,也可以将session保存到数据库或是memcache之类的内存缓存中。

当浏览器首次访问网站的时候,PHP会为这个请求生产一个唯一的session_id,并将这个session_id保存在服务器上一定的时间,同时将这个session_id通过response给浏览器,浏览器通过cookie将session_id保存在用于电脑的内存里(当然也可以不通过cookie保存session_id)。这样,当浏览器以后的每一次请求都会将这个session_id传递给服务器,由于服务器上保存有次session_id的用户信息,这样,服务器就可以轻而易举的辨识是哪个用户了。

当用户关闭浏览器的时候,cookie里保存的session_id便会被清除,当再次访问服务器的时候需要重新生成和保存session_id。

当用户禁用cookie的时候,我们如何使用session呢?

这个问题也是面试的时候经常会被问到的一个问题。

当浏览器禁用cookie的时候,就无法通过cookie来携带session_id,这样我们只能通过url来传递session_id,之后服务器端程序还得判断这个URL传递过来的session_id在服务器上是否存在或是过期,否则重新生成session保存在页面的每个url连接里。但通过url传递session_id风险系数太高,不推荐使用。

java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束 是一个常见的SQL语法错误,通常发生在使用JDBC连接Oracle数据库时。这个错误的具体含义是SQL语句的语法不正确,导致命令无法正常结束。以下是一些可能的原因和解决方法: ### 可能的原因 1. **SQL语句末尾有多余的分号**:在JDBC中执行SQL语句时,语句末尾不需要加分号。 2. **使用了不支持的SQL语法**:某些SQL语法在JDBC中可能不被支持。 3. **SQL语句中存在拼写错误或语法错误**。 4. **使用了不正确的占位符**:在预编译语句(PreparedStatement)中使用了不正确的占位符。 ### 解决方法 1. **检查SQL语句末尾是否有多余的分号**: ```java String sql = "SELECT * FROM users"; // 正确 // String sql = "SELECT * FROM users;"; // 错误 ``` 2. **确保SQL语法正确**: ```java String sql = "SELECT * FROM users WHERE id = ?"; // 正确 ``` 3. **使用预编译语句(PreparedStatement)时,确保占位符使用正确**: ```java String sql = "SELECT * FROM users WHERE id = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, userId); ResultSet rs = pstmt.executeQuery(); ``` 4. **检查SQL语句中是否有拼写错误或语法错误**。 ### 示例代码 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class OracleJDBCExample { public static void main(String[] args) { String url = "jdbc:oracle:thin:@localhost:1521:xe"; String user = "username"; String password = "password"; String sql = "SELECT * FROM users WHERE id = ?"; try (Connection connection = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setInt(1, 1); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { System.out.println("ID: " + rs.getInt("id")); System.out.println("Name: " + rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值