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

哈维·洛佩斯(XaviLópez):

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

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

我有几个实体,它们具有可以验证的属性组作为可验证的方式有指示验证值,谁做了验证,并在验证日期用户领域这是这些实体建模方式:

@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; }
}

ValidationBeanuserdate在一个变化时的字段被自动在表示层改性validated检测字段。

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

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

  • 将其放在表示层中将具有效率上的优势。实体存储在会话中,因此不必再次查询DB来检查字段更改。但是不幸的是,某些实体的某些字段已用ajax更新,因此很难判断该实体是否真的发生了变化。除了不是表示层要满足此要求的责任外。

  • 将其放在服务层中似乎是最好的选择,而且我已经找到了一种正确处理此问题的方法。我想出了@PreUpdate@PreUpdate在@Entities上实现一种方法来比较DB中的值与即将更新的值,并相应地修改相关值,这很容易ValidationBeans我想这是一个普遍的问题,是在业务层,我没有从哪里获取userID的问题。当前用户ID存储在属于表示层的Session中。

因此,将欢迎有关如何与服务层共享http会话信息的任何提示,评论,建议(不一定是特定于Wicket的),甚至可以选择满足此要求的替代方法。

UDPATE:按照gkamal的建议,我将尝试以一种较不侵入的方式集成spring-security,以利用SecurityContext。我也很感谢有关此事的提示。

gkamal:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章