gpt4 book ai didi

java - 如何访问服务层的Session信息?

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:56 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

UDPATE:正在关注 gkamal's suggestion ,我将尝试以尽可能少的侵入方式集成 spring-security,只是为了利用 SecurityContext。我也很感激有关此事的提示。

最佳答案

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com