проблемы с HttpSession с 2 разными запросами - PullRequest
0 голосов
/ 24 мая 2018

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

Я хотел бы сохранить некоторую личную информацию для каждого пользователя в сеансе, поэтому я реализовал сервлет дляцель входа в систему, которая создает сеанс при успешном входе в систему:

    @WebServlet("/LoginUserWithPassword")
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB
maxFileSize = 1024 * 1024 * 10, // 10MB
maxRequestSize = 1024 * 1024 * 50) // 50MB
public class LoginUserWithPassword extends HttpServlet {
    private static final long serialVersionUID = 1L;
    static Logger log = Logger.getLogger(LoginUserWithPassword.class);


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");


....
        HttpSession session = request.getSession();
        session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("nom",usr.nom);
        session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("prenom", usr.prenom);
        session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("login", usr.email);
        session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("id", String.valueOf(usr.id_user));
        session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("id_right",String.valueOf(ur.id_right));
        session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("right",url.right);
        session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("session",session.getId());

, затем на стороне клиента (JSP / Javascript) я получаю информацию о сеансе.

Учитывая user1 , который успешно регистрируется в браузере (Chrome) со следующим кодом Javascript:

Glogin = '<%= (String) (request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute("login")) %>';
        Gsession = '<%= (String) (request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute("session")) %>';

        console.log("login from session: "+Glogin);
        console.log("Session ID: "+Gsession);

Я вижу следующие журналы консоли:

login from session: admin3@toto.com
Session ID: 7D6638EA7167580F4C1BD4D51FAD3C9C

ЗатемЯ выполняю второй вход в систему user2 на том же компьютере с другим браузером (FF), у меня есть следующее в журналах консоли:

login from session: admin@toto.com
Session ID: 376C57F6ACB08CD3B66AB8406DB72984

на этом этапе все идеальноЯ могу получить свои соответствующие атрибуты в каждом сеансе, но если я обновлю браузер user1, я получу идентификатор сеанса пользователя 2 .... и потеряю свой контекст сеанса user1.

У вас есть идея?почему у меня такое поведение?может быть мой способ реализации управления сессиями не верен?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Не помещайте его в ServletContext , он переопределит предыдущие значения.Вместо этого поместите его в текущий сеанс, как показано ниже:

request.getSession().setAttribute("nom",usr.nom);

И получите эти значения в JSP из сеанса, например

(String)session.getAttribute("nom");

[Редактировать]

В настоящее время вы придерживаетесь такой архитектуры, как

Браузер (CLient) ---> Вызов JSP на войне 1 -----> Вызов сервлета на войне 2

Вы можете поддерживать сеанс междуБраузер (Клиент) ----> Вызов JSP на войне 1

Когда вы аутентифицируете своего пользователя сведения о пользователях войны 2, сведения о пользователях могут быть записаны в виде символа канала, разделенного в строке, которая Stringможет быть сохранен в ServletContext (Примечание: выполняйте этот код только в war 2)

    Map<String. String> allUsers = new HashMap<>();
// add key as user id and value is comma separated in string
    ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath")
    servletContext.setAttribute("users",allUsers );

Ваш сервлет должен вернуть идентификатор пользователя в JSP в ответ

war 2 ----> возвращая идентификатор пользователяв JSP in war 1

Теперь вы должны сохранить этот идентификатор пользователя в сеансе, который вы поддерживаете между Browser (CLient) -----> JSP on war 1.

Всякий раз, когда вы хотитечтобы использовать значения, которые вы сохранили в war 2 в контексте сервлета, вы можете использоватькод ниже в JSP in war 1

ServletContext servletContext =request.getSession().getServletContext().getContext("contextPath")
servletContext.getAttribute("user"); 

Примечание : вы не можете разделять сеанс между двумя файлами war, но вы можете делиться объектами между ними.

помочь вам.

0 голосов
/ 24 мая 2018

Вы не используете сеанс правильно.Замените session.getServletContext().getContext("/{applicationContextRoot}") на session везде.Контекст сервлета является глобальным (общим).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...