【问题标题】:ActiveSupport MessageVerifier InvalidSignature error handling not working as expectedActiveSupport MessageVerifier InvalidSignature 错误处理未按预期工作
【发布时间】:2014-04-02 11:20:53
【问题描述】:

全部,

我有一个视图,它在 onload 中执行一些 JQuery 代码来填充 select_tag 框:

var request = $.get("getLocalSuites");

getLocalSuites 路由到控制器中的以下函数:

  def getLocal
    myPass = sessionPass
    if (myPass != nil)
      puts "4"
      result = @@p4object.getLocalSuites(sessionUser,myPass)
      render :json => result
    end
  end

其中定义了 sessionPass 和 sessionUser 函数:

  def sessionUser()
    myConnectedUser = ConnectedUser.find_by username: cookies[:username]
    return myConnectedUser[:username]
  end

  def sessionPass()
    begin
    myConnectedUser = ConnectedUser.find_by username: cookies[:username]
    puts "1"
    verifier = ActiveSupport::MessageVerifier.new(cookies[:session])
    puts "2"
    mysession = verifier.verify(myConnectedUser[:password])
    rescue ActiveSupport::MessageVerifier::InvalidSignature
      puts "3"
      redirect_to sign_in_session_expired_url
    end
    puts mysession
    return mysession
  end

换句话说 - 我的 jQuery 调用 getLocal,它会找到存储在数据库中的用户名和密码。然后它根据会话 cookie 验证返回的加密密码。如果此验证失败,它应该重定向回登录页面,而不是尝试继续呈现当前页面。

服务器日志正确显示 Redirected to http://localhost:3000/sign_in_session_expired ... 但不是看到登录屏幕,而是呈现“原始”视图(带有 select_tag 等) - LocalSuites select_tag 填充了某种 HTML - 每个字符作为新行:<!DOCTYPE html> <html etc etc

谁能解释我在这里的误解 - 为什么我的重定向似乎有效(根据服务器日志) - 但实际上并没有发生?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby url-redirection activesupport


    【解决方案1】:

    浏览器不会自动重定向,因为重定向是在AJAX 调用中接收的,而不是常规浏览器GET,因此浏览器不会处理redirects

    看到这个问题:How to manage a redirect request after a jQuery Ajax call

    我遇到了和你类似的问题。我执行一个有 2 个 ajax 请求 可能的响应:将浏览器重定向到新页面,并且 将当前页面上的现有 HTML 表单替换为新的 一。执行此操作的 jquery 代码如下所示:

    $.ajax({
        type: "POST",
        url: reqUrl,
        data: reqBody,
        dataType: "json",
        success: function(data, textStatus) {
            if (data.redirect) {
                // data.redirect contains the string URL to redirect to
                window.location.href = data.redirect;
            }
            else {
                // data.form contains the HTML for the replacement form
                $("#myform").replaceWith(data.form);
            }
        }
    });
    

    在服务器上构造 JSON 对象“数据”以具有 2 个成员: data.redirect 和 data.form。我发现这种方法要好得多。

    【讨论】:

    • 感谢 Uri - 对服务器端 JSON 结构进行了一些试验,但仍然无法正常工作。然后我意识到我编辑了错误的视图(另一个做了一些模糊相似的事情!)......现在看起来都很可爱!好东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2018-11-02
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多