首页 > 解决方案 > 如果 AJAX 调用未经授权,则重定向到登录页面

问题描述

我有一个表单,当您单击submit它时,它将进行 AJAX 调用以更新您要更改的内容。我的用户会话将在 4 小时后过期,因此如果用户想要更新表单并且他的会话同时过期,它将呈现一条 Flash 消息,要求重新加载页面并再次登录。

尝试使用Cucumber,测试此行为时Capybara,由于未呈现 flash 消息,因此永远不会收到 AJAX 响应SeleniumChrome(如果我手动测试它就可以了)

我已经运行了另一个测试,该测试在执行另一个也使用 AJAX 的操作时呈现 Flash 消息并且它成功了。不同之处在于,一个动作会立即呈现视图,而失败的动作会重定向到另一条路径然后呈现。所有控制器都从检查用户是否被授权的同一个 BaseController 继承。

会话到期后,我调用提交表单,其中包含以下步骤:

When /^I submit the form$/ do
  generic_form_page = GenericFormPage.new(Capybara.current_session)
  generic_form_page.submit

  if Capybara.current_session.mode == :poltergeist
    ajax_page = GenericAjaxPage.new Capybara.current_session
    ajax_page.wait_for_ajax_call_to_finish
  else
    Selenium::WebDriver::Wait.new(:timeout => 50)
  end
  sleep 5
end

wait_for_ajax_call_to_finish基本上只睡几秒钟

这是失败的操作:

  def update
    @element = Element.find(params[:id])
    if @element.update_attributes(element_params)
      render :json => { :location => another_path(@element.item) }
    else
      render :action => 'edit', :layout => false
    end
  end

成功的动作:

  def edit
    @element = Element.find(params[:id])
    @item = @element.item
    render :layout => false
  end

AJAX 消息是这样的:

handle_ajax_errors = (event, request, settings) ->
  if request.status == 401
    render_flash_error_message("Your session has timed out. Please refresh the page.")
  else
    render_flash_error_message("We're sorry. An error has occurred.")

这就是我使 cookie 过期的方式:

browser = Capybara.current_session.driver.browser
  if browser.respond_to?(:clear_cookies)
    # Rack::MockSession
    browser.clear_cookies
  elsif browser.respond_to?(:manage) and browser.manage.respond_to?(:delete_all_cookies)
    # Selenium::WebDriver
    browser.manage.delete_all_cookies
  else
    raise "Don't know how to clear cookies. Weird driver?"
  end

谢谢!

标签: ruby-on-railsajaxcucumberselenium-chromedrivercapybara

解决方案


推荐阅读