Как получить доступ к информации о сеансе на сервисном уровне? - PullRequest
5 голосов
/ 22 сентября 2011

Есть ли способ, которым я могу поделиться информацией Http / Wicket Session на сервисном уровне без введения зависимости сервлет API / Wicket?

Я предоставлю некоторый контекст, почему я задаю этот вопрос, на случай, если я что-то упустил и задаю неправильный вопрос.

У меня есть несколько сущностей, которые имеют группы атрибутов, которые могут быть валидными . Значение validatable означает, что есть поля, указывающие значение проверки, пользователя, который сделал проверку, и дату, в которой она была проверена. Вот как моделируются эти объекты:

@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 также должны быть изменены с идентификатором текущего пользователя и текущей датой.

На мой взгляд, есть две альтернативы; размещение этой логики на уровне представления или на уровне бизнеса / услуг

  • Размещение его на уровне представления будет иметь преимущество в эффективности. Объекты хранятся в сеансе, поэтому нет необходимости запрашивать БД для проверки изменений полей. Но, к сожалению, некоторые сущности имеют некоторые из своих полей ajax-updated, и было бы трудно сказать, действительно ли сущность изменилась. Помимо того, что уровень представления ответственности не отвечает этим требованиям.

  • Размещение его в слое обслуживания кажется наилучшей альтернативой, и я уже нашел возможный способ справиться с этим должным образом. Я придумал @PreUpdate. Было бы легко реализовать метод @PreUpdate в @Entities, чтобы сравнить значения в БД со значениями, которые будут обновлены, и соответствующим образом изменить связанный ValidationBeans. Проблема здесь, и я предполагаю, что это распространенная проблема, заключается в том, что на бизнес-уровне у меня нет места, где можно получить идентификатор user. Текущий идентификатор пользователя хранится в сеансе, который принадлежит уровню представления.

Итак, любые советы, комментарии, рекомендации о том, как я могу поделиться информацией о сеансе http на уровне обслуживания (не обязательно для Wicket), или даже альтернативы для выполнения этого требования.

UDPATE : Следуя предложению gkamal , я постараюсь интегрировать Spring-безопасность как можно менее навязчивым способом, просто чтобы воспользоваться преимуществами SecurityContext. Буду также признателен за советы по этому вопросу.

1 Ответ

6 голосов
/ 22 сентября 2011

Общий подход, используемый для решения этой проблемы, заключается во введении класса SecurityContext, который содержит сведения о текущем пользователе в качестве локальной переменной статического потока. Переменная инициализируется (из httpsession) фильтром безопасности или каким-либо другим фильтром и очищается после завершения обработки запроса. Класс SecurityContext сам будет являться частью бизнес-уровня, который предоставляет методы set / get и, следовательно, не имеет никакой зависимости от веб-уровня.

...