Как получить доступ к сеансу из класса Java - PullRequest
5 голосов
/ 20 сентября 2010

Мне нужно написать небольшой класс Java, который позволит мне добавлять и читать текущий сеанс пользователя.

Все, что я вижу, относится к сервлетам, но в идеале я хотел бы просто использовать простой старый класс.

Может кто-нибудь помочь этому новичку Java?

Спасибо

Ответы [ 4 ]

2 голосов
/ 20 сентября 2010

Общая концепция «сеанса» - это просто хранилище данных для взаимодействия между HTTP-клиентом и сервером.Управление сеансом автоматически обрабатывается всеми сервлетами HTTP.Какой фреймворк?

Если вы просто хотите сохранить информацию для консольного приложения, которая запоминает информацию между запусками, рассмотрите возможность использования Xml для сохранения / загрузки данных из файла.

1 голос
/ 20 сентября 2010

Используйте основанную на компонентах инфраструктуру MVC, которая абстрагирует все уродливые детали Servlet API, так что вы получите нулевой javax.servlet импорт.Например, JSF2 и Struts2.

В JSF2, например, вы просто объявляете класс User как управляемый компонент в сеансе:

@ManagedBean
@SessionScoped
public class User {
    // ...
}

Затем в "действии"bean-компонент, который вы используете для обработки отправки формы, укажите его как управляемое свойство:

@ManagedBean
@RequestScoped
public class SomeFormBean {

    @ManagedProperty(value="#{user}")
    private User user;

    public void submit() {
        SomeData someData = user.getSomeData();
        // ...
    }
}

Вот и все.

Если вы хотите придерживаться необработанного API сервлета, тогда выприходится жить с тем фактом, что вы должны передавать необработанные HttpServletRequest/HttpServletResponse объекты.Лучшее, что вы можете сделать, - это доморощить некоторую абстракцию вокруг нее (но тогда вам в конечном итоге понравится то, что JSF2 / Struts2 уже делает, так почему бы вам не стать доморощенными без хобби / для самообучения :)).

1 голос
/ 20 сентября 2010

Да, просто передайте HttpRequest вашему классу из вашего сервлета.

В вашем сервлете сделайте что-то подобное,

cmd.execute(request);

В вашем классе сделайте что-то подобное,

public class Command implements ICommand {
   .
   .
   public void execute(HttpServletRequest request){
      HttpSession sess = request.getSession(false);
   }
   .
   .
   .
}
0 голосов
/ 22 сентября 2016

В общем, как уже упоминалось в других ответах, сессия во многих отношениях действует как хранилище. Таким образом, чтобы взаимодействовать с сеансом из другого класса, который находится за пределами платформы Servlet / JSP, необходимо получить ссылку на данный сеанс. Есть несколько способов, которыми это может быть достигнуто:

1) Передача сеанса как часть параметра метода (уже упоминавшегося в других ответах) 2) Привязка сеанса к локальной переменной потока к текущему выполняемому потоку (см. ThreadLocal ). Преимущество этого метода состоит в том, что он не объявляет конкретные параметры в сигнатуре метода класса, который должен использовать сеанс. Кроме того, если вызывающий поток проходит через библиотеку, а затем снова вызывает некоторый определенный класс, например, Сервлет-> YourClass0 -> Apache Some Library -> YourClass1, сеанс также будет доступен для YourClass1.

Однако локальный поток также должен быть очищен, когда исполняющий поток возвращается через начальный компонент (скажем, сервлет), иначе, безусловно, могут быть утечки памяти.

Кроме того, обратитесь к вашей конкретной структуре для обработки сеансов, вышеупомянутый механизм прекрасно работает в Tomcat.

...