【问题标题】:How to access Session information on service layer?如何访问服务层的 Session 信息?
【发布时间】:2011-09-22 08:35:21
【问题描述】:

有没有一种方法可以在不引入 servlet api/Wicket 依赖的情况下将 Http/Wicket Session 信息共享到服务层?

我将提供一些背景信息来说明我为什么要问这个问题,以防我遗漏了什么并问错了问题。

我有几个实体具有可以可验证的属性组。 可验证意味着有字段指示验证值、进行验证的用户和验证日期。 这就是这些实体的建模方式:

@Embeddable
public class ValidationBean<T> implements Serializable {
    private T validated;
    private String user;
    private Date date;

    // Constructors, getters, setters ahead. 
    // ...
}

@Entity
@Table(name="SOME_TABLE")
public class SomeEntity implements Serializable, SomeInterface {
    // Some attributes which conform validation group 1
    public String attribute11;
    public String attribute12;
    public String attribute13;
    private ValidationBean<Integer> validationBean1 = new ValidationBean<Integer>();

    // Some attributes which conform validation group 2
    public String attribute21;
    private ValidationBean<String> validationBean2 = new ValidationBean<Integer>();

    // Constructors, various attribute getters with JPA annotations
    // ...

    @Embedded
    @AttributeOverrides(/*various overrides, each entity/validation group has its own validation column names...*/)
    public ValidationBean<Integer> getValidationBean1() { return validationBean1; }

    @Embedded
    @AttributeOverrides(/*various overrides, each entity/validation group has its own validation column names...*/)
    public ValidationBean<Integer> getValidationBean2() { return validationBean2; }
}

当检测到validated 字段发生变化时,ValidationBeanuserdate 字段会在表示层中自动修改。

所有这些都正常工作。现在,我正在尝试找到一个优雅且通用的解决方案,它与当前建模集成到以下要求:当验证组中的任何属性的值发生变化,并且相关的ValidationBean.validated 没有改变时,@ 987654329@ 和 date 也必须修改为当前用户的 id 和当前日期。

在我看来,有两种选择;将该逻辑放在表示层或业务/服务层中

  • 将它放在表示层将具有效率优势。实体存储在会话中,因此不必再次查询数据库以检查字段更改。但不幸的是,一些实体的一些字段 ajax-updated,很难判断实体是否真的改变了。除了不是表示层满足这一要求的责任。

  • 把它放在服务层似乎是最好的选择,我已经找到了一种可能的方法来正确处理这个问题。我想出了@PreUpdate。在@Entities 上实现@PreUpdate 方法很容易将DB 中的值与即将更新的值进行比较,并相应地修改相关的ValidationBeans。这里的问题,我想这是一个常见的问题,是在业务层,我没有从哪里获取user id。当前用户Id保存在Session中,属于表现层。

因此,欢迎任何关于如何将 http 会话信息共享到服务层(不一定是特定于 Wicket)的提示、cmets、建议,甚至是满足此要求的替代方案。

UDPATE :在gkamal's suggestion 之后,我将尝试以不那么侵入性的方式集成spring-security,只是为了利用SecurityContext。我也很感激关于这个问题的提示。

【问题讨论】:

    标签: java hibernate spring wicket


    【解决方案1】:

    解决这个问题的常用方法是引入一个 SecurityContext 类,该类将当前用户的详细信息作为静态线程局部变量保存。该变量由安全过滤器或其他过滤器初始化(从 httpsession),并在请求处理完成后清除。 SecurityContext 类本身将成为业务层的一部分,它提供 set / get 方法,因此没有任何 Web 层依赖项。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2011-02-11
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多