以前项目中遇到过这样的情况,当时是这样解决的,这里记下来。
1,用户的保存
-----------------------------------------------------------------
用户统一存在存在session的一个map中,
map的key是用户的id,value是用户对象。
sesion.map.put("activeUserMap",map);
2,登录时的操作:
-----------------------------------------------------------------
当用户登录时,把这个用户加入到(1)的map中,这就相当于一个入口。没有登录的用户在session的map中也就
没有记录。
Map map = sesion.map.get("activeUserMap");
map.put("userId",user);
session中保存一个当前活跃的用户id(当前登录用户的id)
sesion.map.put("activeUserId",userId)
然后跳转到一个页面。
3,页面加一个js脚本
-----------------------------------------------------------------
页面获取session中的活跃用户id隐藏到某个控件中,
例如:
<intput type="hedden" name="activeUserId" value="${activeUserId}">
然后,页面加一个js的脚本,取得(2)中携带的活跃用户id,
获取页面所有的a标签,并把a标签的href中加上这个用户id,form的action也可以加上。
或者也可以在jsp手动吧每个标签后面加上这个活跃用户id
4,拦截器,判断用户是否登录
-----------------------------------------------------------------
拦截器中拦截需要用户登录的资源,获取当前带过来的活跃用户id,去(1)的session的map中查找这个用户id,
返回用户对象,如为空则代表用户没有登录,如果有值,把这个id覆盖session中的活跃用户id。
----------伪代码----------
int uid;//当前url带过来的用户id
Map map = sesion.map.get("activeUserMap");
Object obj = map.get(uid);
if(obj == null){
//用户未登录或者,用户自己输入的url,跳到错误页面。
}else{
//用户已登录,把当前带过来的用户id存到session中,覆盖活跃用户id
sesion.map.put("activeUserId",uid);
//转到action中进行处理,这里也可以将用户注入到action中,供后面action使用而不用再去。
}
把这个用户对象注入到action中,action中声明一个user属性及get...set方法,然后就转到action了,action中直接取user属性
当作当前登录用户来操作。(这里也可以让所有action实现一个接口,接口中有setUser方法就行,在拦截器中统一注入)。或者
可以不做这个操作,直接放行到action
---------------------------------------------结束分割线--------------------------------------------
就这么多了,不知道这个实不实用,以前就是这样做的。。。