维护用户状态——Spring中session bean的使用

我们都知道,在web开发中一旦用户登陆系统,那么在他注销登陆之前,系统需要维护用户的状态,这样他才能看到自己的内容(比如个人主页、消息等)。

那么如何维护用户的状态呢?在Spring中提供了一种bean的作用域机制,可以帮助我们轻松地管理用户状态。

这里用到的主要是session bean,从名字上就能看出来,它的作用域是和session绑定的,也就是说,每一个session会对应一个session bean,session bean之间互不影响。

比如我们这里想要维护的用户状态包括:用户名和工号。为了方便管理,我们建立一个类UserPreferences

public class UserPreferences implements Serializable{
	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	private String empno;
	private String name;

	public String getEmpno() {
		return empno;
	}

	public void setEmpno(String empno) {
		this.empno = empno;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

现在我们想要做的就是将UserPreferences和session绑定,那么根据bean的作用域机制,我们需要把UserPreferences的作用域设置成session:

	<bean id="userPreferences" class="com.test.dto.UserPreferences" scope="session">
		<aop:scoped-proxy />
	</bean>

这样的话生成的是一个代理对象,因为在singleton中注入session bean,request bean 或是 global session bean时,singleton bean只会初始化一次,而它的依赖也只会被注入一次。若不加<aop:scoped-proxy/>,那么操作的都是同一个session bean,也就是最早被注入的那个(不过在使用中,我发现不加<aop:scoped-proxy/>是会有错误提示的)。而加上<aop:scoped-proxy/>后,注入到singleton中的userPreferences实际上是一个代理对象,而这个代理对象与userPreferences有着相同的public方法。调用代理对象的方法时,它会去从Http
session中寻找真正的userPreferences对象,然后调用其对应的方法。这样我们就可以在singleton(比如Controller)中使用session bean了。

下面做个简单的登陆实例:先来写个登陆页面:

<html>
	<head><title>Login</title></head>
	<body>
		<form action="login" method="post">
			<table>
				<tr><td>工号:</td><td><input name="empno"/></td></tr>
				<tr><td>姓名:</td><td><input name="name"/></td></tr>
				<tr><td colspan="2"><input type="submit"/></td></tr>
			</table>
		</form>
	</body>
</html>

然后是登陆的后台方法:

	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public ModelAndView login(Employee employee) {
		preferences.setEmpno(employee.getEmpno());
		preferences.setName(employee.getName());
		ModelAndView mv = new ModelAndView("kft/success.htm");
		return mv;
	}

success页面用来展示登陆的用户名和工号:

<html>
	<head>
		<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
		<title>Success</title>
	</head>
	<body>
		$!preferences.empno<br/>
		$!preferences.name<br/>
		<input type="button" onclick="logout()" value="logout">
	</body>
	<script type="text/javascript">
		function logout(){
			window.location.href = 'logout';
		}
	</script>
</html>

然后通过logout按钮注销登陆。

Spring的这个机制给我们提供了方便,而本质上,还是利用HttpSession来维护用户的状态的。

时间: 2024-10-20 13:16:58

维护用户状态——Spring中session bean的使用的相关文章

Spring 中的bean 是线程安全的吗?

结论: 不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究. Spring 的 bean 作用域(scope)类型 1.singleton:单例,默认作用域. 2.prototype:原型,每次创建一个新对象. 3.request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下. 4.ses

spring中bean的五种作用域?Spring中的bean是线程安全的吗?

spring中bean的五种作用域 当通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request:对于每次HTTP请求,使用request定义的Bea

spring配置,spring中的bean 的id不能相同

lib下加入包 spring.jar commons-logging.jar src下添加 applicationContext.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLS

JSP访问Spring中的bean

JSP访问Spring中的bean <%@page import="com.sai.comment.po.TSdComment"%> <%@page import="com.sai.comment.service.CommentService"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import

传统javabean与spring中的bean的区别

javabean已经没人用了 springbean可以说是javabean的发展, 但已经完全不是一回事儿了 用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处不在,任何组件都可以被称为bean. 写法不同:传统javabean作为值对象,要求每个属性都提供getter和setter方法:但spring中的bean只需为接受设值注入的属性提供setter方法. 生命周期不同:传统javabean作为值对象传递,不接受任何容器管理其生命周期:spring中的

第2章 Spring中的Bean

2.1 Bean的配置 Bean本质是Java中的类.Spring可以被看做一个大型工厂,这个工厂的作用就是生产和管理Spring容器zho中的Bean.想在项目中使用这个工厂,就需要对Spring的配置文件进行配置. Spring支持XML和Properties两种格式的配置文件.常用XML文件配置,该方式通过XML文件来注册并管理Bean之间的依赖关系. XML配置文件的根元素是<beans>,包含了多个<bean>子元素,每个子元素地定义一个Bean. <bean>

spring 中的 bean 是线程安全的吗?

Spring 不保证 bean 的线程安全.默认 spring 容器中的 bean 是单例的.ZFX代理申请www.fx61.com/brokerlist/zfx.html,当单例中存在竞态条件,即有线程安全问题.如下面的例子计数类package constxiong.interview.threadsafe;/** 计数类 @author ConstXiong @date 2019-07-16 14:35:40*/public class Counter {private int count

Spring中的Bean——装载

Bean的装配方式 Bean的装配可以理解为依赖关系注入 基于XML的装配 a) 设值注入 i.要求: Bean 类必须提供一个默认的无参构造方法. Bean 类必须为需要注入的属性提供对应的setter方法. b) 构造注入 package com.itheima.assemble; import java.util.List; public class User { private String username; private Integer password; private List

Spring中的bean

1.定义和别名 定义一个bean可以为其制定如下属性 default-lazy-init:延迟初始化(默认false,即立即初始化) default-merge:从父类合并继承属性值 default-autowire:可以按byName,byType等方式完成自动装配 default-autowire-candidates:自动装配时候排除此bean bean可以使用id定义唯一名字,还可以使用name定义别名,例如<bean id="person" name="#ab