有没有一种方法可以在不引入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
字段中的更改时,会在表示层中自动修改user
的date
和validated
字段。所有这一切都正常工作。现在,我正在尝试找到一种优雅且通用的解决方案,该解决方案可以与当前的建模集成到以下要求中:当验证组中的任何属性的值都更改并且相关的
ValidationBean.validated
不变时,user
和date
还必须使用当前用户的ID和当前日期进行修改。在我看来,有两种选择。将该逻辑放在表示层或业务/服务层
@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/