Как удалить сеанс Phoenix?

Я просматриваю Руководство Phoenix по сеансам. Он очень хорошо объясняет, как я могу привязать данные к сеансу с помощью put_session и получить значение позже с помощью get_session, но не говорит, как я могу удалить сеанс пользователя.

Из гида:

defmodule HelloPhoenix.PageController do
  use Phoenix.Controller

  def index(conn, _params) do
    conn = put_session(conn, :message, "new stuff we just set in the session")
    message = get_session(conn, :message)

    text conn, message
  end
end

person Sheharyar    schedule 23.06.2015    source источник


Ответы (4)


Нашел его в Plug Docs:

clear_session(conn)

Очищает всю сессию.

Эта функция удаляет все ключи из сеанса, очищая сеанс.

Обратите внимание, что даже если используется clear_session / 1, сеанс все равно отправляется клиенту. Если сеанс должен быть эффективно прерван, следует использовать configure_session / 2 с параметром: drop, установленным в значение true.


Вы можете поместить что-то вроде этого в свой SessionsController:

def delete(conn, _) do
  conn
  |> clear_session()
  |> redirect(to: page_path(conn, :index))
end

и добавьте для этого маршрут в свой web/router.ex.

person Sheharyar    schedule 23.06.2015

Я думаю, что вы ищете configure_session:

Plug.Conn.configure_session(conn, drop: true)
person Paweł Obrok    schedule 23.06.2015
comment
Спасибо, я не знаю, с чем мне пойти. clear_session или configure_session. - person Sheharyar; 23.06.2015
comment
Тоже не уверен, но conn |> configure_session(:drop), похоже, полностью нейтрализует его, так что это более безопасная ставка, если вы этого хотите. - person Paweł Obrok; 23.06.2015
comment
Просто попробовал, получаю исключение: (Protocol.UndefinedError) protocol Access not implemented for :drop, only the nil atom is supported - person Sheharyar; 23.06.2015
comment
Хм, кажется, я неправильно это понял - это должен быть список ключевых слов - обновил ответ - person Paweł Obrok; 23.06.2015
comment
drop session полностью уничтожит его, заставив браузер удалить cookie. clear_session просто очищает данные в сеансе, cookie продолжает работать там. - person José Valim; 23.06.2015
comment
как проверить, является ли сеанс нулевым / пустым или нет - person KJ_kaka; 06.01.2016

Если вы хотите удалить конкретный сеанс, вы должны использовать:

conn |> fetch_session |> delete_session(:session_to_delete)

Дополнительная информация:

https://github.com/elixir-lang/plug/blob/master/lib/plug/session.ex#L114:L115

person Jeremie Ges    schedule 09.07.2016

Используйте только delete_session / 2 для удаления ранее созданного сеанса, а затем перенаправить на логин или что-то в этом роде!

Пример:

# In this example I use a log_out link to delete session when user click in it.
def log_out(conn, _params) do
    conn
    |> delete_session(:session_name)
    |> redirect(to: Routes.auth_path(conn, :login))
end

Важно вернуть conn измененный, удалив ключ, который вы в него вставили.

person DarckBlezzer    schedule 21.09.2020