ActiveSupport MessageVerifier InvalidSignature错误处理未按预期工作

时间:2014-04-02 11:20:53

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

所有

我有一个视图,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 ...但是,而不是看到登录屏幕,&#34;原始&#34;渲染视图(使用select_tag等) - 使用某种HTML填充LocalSuites select_tag - 每个字符作为新行:<!DOCTYPE html> <html etc etc

任何人都可以解释我在这里误解的原因 - 为什么我的重定向似乎有效(根据服务器日志) - 但实际上并没有发生?

谢谢!

1 个答案:

答案 0 :(得分: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对象&#34;数据&#34;在服务器上构建有2个成员:   data.redirect和data.form。我发现这种方法要好得多。