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

Xav*_*ica 5 java spring wicket hibernate

有没有办法在不引入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; }
}
Run Code Online (Sandbox Code Playgroud)

ValidationBeanuserdate字段中的改变时被自动在表示层改性validated检测字段.

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

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

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

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

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

UDPATE:遵循gkamal的建议,我将尝试以尽可能不那么干扰的方式集成spring-security,只是为了利用SecurityContext.我也很欣赏这个问题的提示.

gka*_*mal 6

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