如何访问服务层的会话信息?

时间:2011-09-22 08:35:22

标签: java hibernate spring wicket

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

我会提供一些背景信息,为什么我会问这个问题,以防我错过了什么并提出错误的问题。

我有几个实体拥有可以可验证的属性组。 validatable 表示存在指示验证值的字段,进行验证的用户以及验证的日期。 这就是这些实体的建模方式:

@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; }
}
当检测到ValidationBean字段发生更改时,

user datevalidated字段会自动在表示层中进行修改。

所有这一切都正常。现在,我正试图找到一个优雅的&amp;与当前建模集成到以下要求的通用解决方案:当验证组中的任何属性更改其值并且相关ValidationBean.validated未更改时,user和{{1}还必须使用当前用户的ID和当前日期进行修改。

我认为有两种选择;将该逻辑放在表示层或业务/服务层

  • 将它放在表示层中将具有效率优势。实体存储在会话中,因此不必再次查询数据库以检查字段更改。但不幸的是,一些实体的某些字段已经更新了ajax,并且很难判断实体是否真的发生了变化。除了不是表示层负责满足此要求之外。

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

因此,我们欢迎提供有关如何将http会话信息分享到服务层(不一定是特定于Wicket)的任何提示,评论和建议,或者甚至是满足此要求的替代方案。

UDPATE :在gkamal's suggestion之后,我将尝试以更少侵入性的方式集成spring-security,以利用SecurityContext。我也很欣赏这个问题的提示。

1 个答案:

答案 0 :(得分:6)

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