有没有一种方法可以在不引入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; }
}

当检测到ValidationBean字段中的更改时,会在表示层中自动修改userdatevalidated字段。

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

在我看来,有两种选择。将该逻辑放在表示层或业务/服务层
  • 将其放在表示层中将具有效率上的优势。实体存储在 session 中,因此不必再次查询DB来检查字段更改。但是不幸的是,某些实体的某些字段已经过ajax更新,因此很难判断该实体是否真的发生了变化。除了不是表示层满足此要求的责任外。
  • 将其放在服务层中似乎是最好的选择,而且我已经找到了一种正确处理此问题的方法。我想出了 @PreUpdate 。在@Entities上实现@PreUpdate方法以将DB中的值与即将更新的值进行比较,并相应地修改相关的ValidationBeans会很容易。我认为这是一个常见问题,是在业务层,我没有从哪里获取user id的问题。当前用户ID存储在属于表示层的Session中。

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

    UDPATE :在gkamal's suggestion之后,我将尝试以一种较不侵入的方式集成spring-security,以利用SecurityContext。我也很感谢在此问题上的提示。

    最佳答案

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

    关于java - 如何在服务层访问 session 信息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7511914/

    10-10 04:19