付子健 2009-04-11 23:34
浏览 1294
已采纳

如何在Service层获取用户session中保存的用户信息的方法

这是我在网上找到的一段保存UserSession的java代码。
[code="java"]

/**

  • Description: 用ThreadLocal提供一个存储线程内变量的地方.

  • 客户端代码可以用静态方法存储和获取线程内变量,不需要依赖于HttpSession.
  • web层的Controller可通过此处向business层传入user_id之类的变量
  • /
    @SuppressWarnings("unchecked")
    public class UserSession {
    /
    * * 保存变量的ThreadLocal,保持在同一线程中同步数据. */
    private static final ThreadLocal SESSION_MAP = new ThreadLocal();

    /** * 工具类的protected构造方法. */
    protected UserSession() {
    }

    /**

    • 获得线程中保存的属性.
    • @param attribute
    • 属性名称
    • @return 属性值
      */
      public static Object get(String attribute) {
      Map map = (Map) SESSION_MAP.get();
      System.out.println(map.toString());
      System.out.println(map.containsKey("usersession"));

      return map.get(attribute);
      }

    /**

    • 获得线程中保存的属性,使用指定类型进行转型.
    • @param attribute
    • 属性名称
    • @param clazz
    • 类型
    • @param
    • 自动转型
    • @return 属性值 */ public static T get(String attribute, Class clazz) { return (T) get(attribute); }

    /**

    • 设置制定属性名的值.
    • @param attribute
    • 属性名称
    • @param value
    •        属性值
      

      */
      public static void set(String attribute, Object value) {
      Map map = (Map) SESSION_MAP.get();

      if (map == null) {
      map = new HashMap();
      SESSION_MAP.set(map);
      }

      map.put(attribute, value);
      }
      }

[/code]

我在用户登录的时候 执行:
[code="java"]
UserSession.set("User",User);
[/code]
然后在我需要的service层中执行
[code="java"]
UserSession.get("User");
//UserSession.get("User",User.class);
[/code]
这样第一次一般都取不到session中的User对象。
第二次就可以。请问这个是什么原因呢?

  • 写回答

3条回答 默认 最新

  • melin1204 2009-04-13 13:37
    关注

    ThreadLocal 是当前请求的对象。每一次线程请求的时候,都需要从session中把session对象取出来。放到ThreadLocal中去。 这样才能从service中取得到。acegi就是这么处理的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能