一个关于session使用的讨论

本文介绍了ASP.NET中Session状态的不同存储方式,包括InProc、StateServer及SQLServer,并详细讲解了StateServer模式的具体配置方法及体验效果。

 由于我前段时间在使用一个在一个本页的查询里使用了session存储了一个dataset,

我的一起学.net的朋友就说我那样是浪费资源。会降低性能的

我首先考虑的是session存储在那里的

是客服端还是在服务器端呢

下面有篇文章给了我明确的解释

是可以在服务器上也可以在本机上的。还可以是存储在mssql里的

那样我就不用担心使用太多的session会降低服务器的性能了,

具体的测试我还没做过,我想那样强大的一个东西,不会是就有存一些小东西用的吧。在窗体件的通信方面我决得是很好用的一个东西,

文章的内容如下:

Session丢失已经是一种习以为常的问题了,在自己也了解一些如何解决的问题,但是也一直没有机会去用,现在由于新的项目要在B/S下开发,所以不得不让我考虑Session的问题。

解决session丢失的问题有两种方法:1)将session保存在一台sate server中。2)将session保存在sql server中。我们使用的数据库是oracle,不想再装一个数据库,所以用了第一种方法。

首先根据网上查的资料对webconfig文件中session部分进行修改。如下:

<sessionState
  mode="StateServer"
  cookieless="false"
  timeout="240"
  stateConnectionString="tcpip=10.164.222.122:42424"
  stateNetworkTimeout="14400"
 />
 <machineKey
  validationKey="78AE3850338BFADCE59D8DDF58C9E4518E7510149C46142D7AAD7F1AD49D95D4"
  decryptionKey="5FC88DFC24EA123C"
  validation="SHA1"
 />

然后再在10.164.222.122 这台电脑上的asp.net state server 服务启动

这样基本上就行了。体验一下。

我用了一个测试程序,在3个小时以后session仍然可用,更绝的是我的电脑都重起了,在其它电脑上打开的网页中session仍然可用。一番体验以后,感觉还真不错。

.NET Framework 常规参考

<sessionState> 元素
为当前应用程序配置会话状态设置。

<configuration>
<system.web>
<sessionState>

<sessionState mode="Off|InProc|StateServer|SQLServer"
cookieless="true|false"
timeout="number of minutes"
stateConnectionString="tcpip=server:port"
sqlConnectionString="sql connection string"
stateNetworkTimeout="number of seconds"/>
必选属性
属性 选项 说明
mode 指定在哪里存储会话状态。
Off 指示会话状态未启用。
InProc 指示在本地存储会话状态。
StateServer 指示在远程计算机上存储会话状态。
SQLServer 指示在 SQL Server 上存储会话状态。

可选属性
属性 选项 说明
cookieless 指定不具有 Cookie 的会话是否应用于标识客户端会话。
true 指示应使用不具有 Cookie 的会话。
false 指示不应使用没有 Cookie 的会话。默认值为 false。
timeout 指定在放弃一个会话前该会话可以处于空闲状态的分钟数。默认值为 20。
stateConnectionString 指定远程存储会话状态的服务器名称和端口。例如“tcpip=127.0.0.1:42424”。当 mode 为 StateServer 时该属性是必需的。
sqlConnectionString 为 SQL Server 指定连接字符串。例如“data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind”。当 mode 为 SQLServer 时该属性是必需的。
stateNetworkTimeout 在使用 StateServer 模式存储会话状态时,指定在放弃会话之前 Web 服务器和状态服务器之间的 TCP/IP 网络连接空闲的时间(以秒为单位)。默认值为 10。

备注
使用 StateServer 模式

确保运行 ASP.NET 状态服务的服务器是要存储会话状态信息的远程服务器。该服务与 ASP.NET 一起安装,其默认位置为 <驱动器>:/systemroot/Microsoft.NET/Framework/version/aspnet_state.exe。
在应用程序的 Web.config 文件中,设置 mode=StateServer 并设置 stateConnectionString 属性。例如,stateConnectionString="tcpip=sarath:42424"。
使用 SQLServer 模式

在运行 SQL Server 的计算机(它将存储会话状态)上运行 InstallSqlState.sql(默认的安装位置为 <驱动器>:/systemroot/Microsoft.NET/Framework/version)。这将创建一个名为 ASPState 的数据库,该数据库具有新的存储过程并且在 TempDB 数据库中具有 ASPStateTempApplications 表和 ASPStateTempSessions 表。
在应用程序的 Web.config 文件中,设置 mode=SQLServer 并设置 sqlConnectionString 属性。例如,sqlConnectionString="data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。
示例
以下示例指定若干会话状态配置设置。

<configuration>
<system.web>
<sessionState mode="InProc"
cookieless="true"
timeout="20"/>
</sessionState>
</system.web>
</configuration>
要求
包含于:<system.web>

Web 平台:IIS 5.0、IIS 5.1、IIS 6.0

配置文件:Machine.config、Web.config

配置节处理程序:System.Web.SessionState.SessionStateSectionHandler 
 Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1489931

<think>我们正在讨论的是在Spring框架中定义Session级别的Bean。根据之前的对话和引用内容,用户已经了解了一些关于Session Bean的基本概念和配置方法。现在用户直接询问“使用Session级别的bean的方法”,我们需要提供详细的实现步骤和注意事项。 根据引用[2]和[3],我们知道在Web应用中,Session作用域的Bean(如购物车)是每个用户会话独立的。在Spring中,我们可以通过注解或XML配置来实现。 同时,引用[1]和[4]提到了EJB中的Session Bean(有状态和无状态)的生命周期管理,但用户的问题是在Spring框架中,所以我们主要关注Spring的解决方案。 因此,我们将重点放在Spring(包括Spring Boot)中如何定义和使用Session作用域的Bean。 回答结构: 1. 回顾Session作用域Bean的概念和用途(结合引用[2]的例子) 2. 详细说明配置方法(注解和XML) 3. 关键注意事项(如代理模式、生命周期、销毁回调) 4. 提供一个完整的代码示例(包括Bean定义和注入使用) 5. 讨论在非Web环境中的限制(因为Session作用域依赖于Web环境) 最后,按照要求生成相关问题。 注意:引用标注要自然,在相关内容的末尾添加。 </think> 在Spring框架中定义和使用Session级别的Bean涉及以下核心方法,确保每个用户会话拥有独立实例: --- ### 一、配置Session作用域Bean的方法 1. **注解配置(推荐)** 使用`@Scope`注解显式声明作用域: ```java @Component @Scope( value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS // 必须启用代理 ) public class ShoppingCart { private List<String> items = new ArrayList<>(); public void addItem(String item) { items.add(item); } @PreDestroy public void cleanup() { // Session销毁时触发 items.clear(); } } ``` *代理模式解决单例Bean注入Session Bean时的作用域不匹配问题[^2]* 2. **Spring Boot简化注解** 直接使用`@SessionScope`: ```java @Component @SessionScope // 等效于@Scope(session) public class UserSession { private String sessionId; // ... } ``` 3. **XML配置(传统项目适用)** ```xml <bean id="userPrefs" class="com.example.UserPreferences" scope="session"> <aop:scoped-proxy/> <!-- 关键:动态代理 --> </bean> ``` --- ### 二、Session Bean的使用方法 1. **在Controller中直接注入** ```java @Controller public class CartController { @Autowired private ShoppingCart cart; // 自动关联当前用户会话的Bean @PostMapping("/add") public String addToCart(String item) { cart.addItem(item); return "cart-page"; } } ``` 2. **手动访问Session作用域** 通过`RequestContextHolder`获取: ```java RequestAttributes attributes = RequestContextHolder.currentRequestAttributes(); ShoppingCart cart = (ShoppingCart) attributes.getAttribute( "shoppingCart", RequestAttributes.SCOPE_SESSION ); ``` --- ### 三、关键特性与注意事项 1. **生命周期管理** - **创建**:用户首次访问时实例化 - **销毁**:Session超时或调用`session.invalidate()`时触发`@PreDestroy`[^3] - **钝化/激活**:可通过实现`Serializable`支持Session持久化 2. **代理模式必要性** | 代理模式 | 适用场景 | |----------------------|-------------------------| | `ScopedProxyMode.TARGET_CLASS` | Bean未实现接口时(CGLIB代理) | | `ScopedProxyMode.INTERFACES` | Bean实现接口时(JDK动态代理) | 3. **典型应用场景** - 用户购物车(保存会话中的临时商品)[^2] - 多步骤表单数据暂存 - 用户个性化配置(如语言、主题) --- ### 四、与其他作用域对比 | 作用域 | 生命周期 | 典型用例 | |--------------|-------------------------|----------------------| | **Session** | 用户会话期间 | 购物车、登录凭证 | | **Request** | 单次HTTP请求 | 请求参数封装对象 | | **Singleton**| 应用全局唯一 | 数据库连接池 | | **Prototype**| 每次注入时创建新实例 | 需要隔离状态的工具类 | > ⚠️ **重要限制** > - 仅Web环境有效(需`spring-web`依赖) > - 测试时需模拟`HttpSession`(如`MockHttpSession`) > - 集群环境需同步Session数据(如Redis Session) --- ### 五、示例:电商购物车实现 ```java @SessionScope @Component public class ShoppingCart implements Serializable { private Map<Long, Integer> items = new HashMap<>(); // 商品ID -> 数量 public void addItem(Long productId, int quantity) { items.merge(productId, quantity, Integer::sum); } @PreDestroy public void clearCart() { items.clear(); // Session过期时自动清空 } } // 控制器中使用 @RestController public class CartApi { @Autowired ShoppingCart cart; @PostMapping("/cart/add") public void addItem(@RequestParam Long productId, @RequestParam int quantity) { cart.addItem(productId, quantity); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值