- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个带有 Ruby on Rails 3.2 后端的 ExtJS 4.1 应用程序,使用 Devise(启用了 Timeoutable)进行身份验证和 session 管理。
此问题发生在服务器上,应用仅通过 SSL 提供。 Nginx 将任何不安全的请求重定向到 https url。
问题是当 Devise session 超时时,在我的例子中是 15 分钟后,任何 AJAX 请求都会被发送/重定向到 http://myapp.com/controller?params,而不是https://myapp.com/controller?params,因为它通常会这样做。
我有客户端代码,在非 SSL 设置中可以很好地捕获潜在的 session 过期问题,并重定向到登录页面,并显示 session 已超时的消息。这是一种基于以下事实的 hack,即在 session 超时后发出请求时,会返回“无效的 JSON 字符串”错误消息。该错误包含登录页面的 HTML,因为当用户登录时应该是 json 的响应变成了应用程序应该在 session 超时时重定向到的登录页面。此代码块在我的Ext.application 的launch 方法中:
launch: function () {
Ext.Error.handle = function (err) {
$.post('/logs', {message:err.msg});
if (err.msg.indexOf("invalid JSON String") != -1 && err.msg.indexOf("<!DOCTYPE html>") != -1) {
if (err.msg.indexOf("MyApp_Login") != -1)
document.location.href = "/logout?timeout=1";
else
document.location.href = "/logout?error=1";
} else {
gritter(3, "ERROR:", "A client-side error has occurred. If this issue persists, please contact your system administrator.");
if (Ext.isWebKit) console.log(err);
}
}
if (user_signed_in == true) {
Ext.require('MyDesktop.App');
Ext.require('Ext.tab.*');
_myDesktopApp = Ext.create('MyDesktop.App');
Ext.state.Manager.setProvider(Ext.create('Ext.state.CookieProvider'));
}
}
所以正如我上面所说,应用程序通过非安全套接字检测到指示 session 超时的 Controller 请求(或更准确地说响应),并采取适当的措施。但是在我的服务器上,通过 SSL,由于某种原因,一旦 session 过期, Controller 调用最终将通过 http 而不是 https。在 Chrome 中导致这样的错误:
The page at https://server.myapp.com/ displayed insecure content from http://server.app.com/campaign_components_contacts.json?authenticity_token=1vokGHUpsi5w3b3P8mrfUpEGx19hrHJpsCzPayofM7c%3D&campaign_id=2&component_id=2&contact_id=1536&format=json
这会不会是 ExtJS 的一个特性,当通过 SSL 检测到问题时,它会尝试进行非安全调用?或者 Rails 的一些特性?我敢肯定两者都不是,只是把我脑海中浮现的一些东西扔掉了。
编辑:
通过将 thin 与 --ssl 开关结合使用,我已经能够在开发环境中在本地测试该场景。服务器启动后,我浏览到
https://localhost:3000
没有问题。一旦 Devise session 过期,任何 json 请求都会触发重定向以登录,如预期的那样并通过 http 工作。
所以这个问题中描述的问题只出现在我的服务器上,并且可能与我的 NGINX 配置设置方式有关。
我还将在本地预编译应用程序并使用 prod 环境选项运行,只是为了确保它与 dev 和 prod 之间的区别无关。
最佳答案
哇,事实证明这与 Devise session 超时、Rails 或 ExtJS 无关。
最终通过调整 NGINX 配置解决了这个问题,根据文档,这对于所使用的版本来说应该是正确的,但结果却导致了这个问题。
当前 ssl 服务器位:
server {
listen 443;
ssl on;
ssl_certificate /srv/ssl/server.myapp.com.combined.crt;
ssl_certificate_key /srv/ssl/server.myapp.com.key;
server_name server.myapp.com;
root /var/www/myapp/current/public;
passenger_enabled on;
rails_env myapp_staging;
}
之前我有:
server {
listen 443 ssl;
ssl_certificate /srv/ssl/server.myapp.com.combined.crt;
ssl_certificate_key /srv/ssl/server.myapp.com.key;
server_name server.myapp.com;
root /var/www/myapp/current/public;
passenger_enabled on;
rails_env myapp_staging;
}
区别在于 split
listen 443 ssl;
进入:
listen 443;
ssl on;
关于ssl - 意外的 302/从 HTTPS 重定向到 HTTP 导致 'insecure content' javascript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13976313/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
当我尝试在 db2 中创建表时,它抛出以下错误 $ db2 CREATE TABLE employee(emp_id INT NOT NULL, emp_name VARCHAR(100)) sh:
我有: while (i < l) { if (one === two) { continue; } i++; } 但是 JSLint 说: Problem at line 1 chara
所以我有这个代码: char inputs[10] = ""; int numInputs = 0; while (numInputs < 10){ char c; printf("E
var ninja = { name: 'Ninja', say: function () { return 'I am a ' + this.name; }
我收到一个我不明白的错误,请注意,我是编码新手,所以这可能是一个简单的错误。 #include using namespace std; int main() { //Initialise Fahr
我正在使用 javascript 和 react,由于某种原因,我收到了一个奇怪的 token 错误。 这是发生错误的代码: renderNavBar() { if (!this.us
Closed. This question is off-topic。它当前不接受答案。
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else 标记。 这发生在文件的开头: #if defined( _USING_MFC ) #include "stda
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这个问题在这里已经有了答案: Difference between sh and Bash (11 个答案) 关闭 2 年前。 我正在编写一个简单的 bash 脚本,我在 XX `(' unexpe
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic
我在 Windows 7 上编写了一个脚本,它不断给我一个错误“(此时出乎意料。”对于以下代码 if %vardns%=="NODNS" ( netsh interface ipv4 set ad
我正在尝试使用xmlstarlet(使用xpath)解析XML文件,但是出现语法错误,并且我不知道如何更正我的代码。 这是我的脚本: #!/bin/bash if [ $1=="author" ];
以下脚本旨在在目录中的所有文件上运行程序“senna”,并将每个文件的输出(保留输入文件名)写入另一个目录 for file in ./Data/in/*; do ./senna -iobta
我从 challengers.coffee 运行此代码,并收到错误 ActionView::Template::Error (SyntaxError: [stdin]:3:31:unexpected
我在 config.db.database; 行中有语法错误(意外的标记“.”)。这是我在文件中的代码 const config = require('../config/config') const
这一定很明显,但是我无法使它正常工作。我正在尝试传输应该用于构建$ classKey的对象,这反过来又导致删除所需的软件(amd64或i386)。好吧,这里的代码: $name = @("softwa
我正在使用 1.3.7 版学习 Grails,但我一直无缘无故地遇到以下语法错误: unexpected token: mapping @ line x, column y. 有一次,我通过运行“gr
我正在尝试找出这段Pascal代码的问题 function Factorial(n: integer): integer; begin if n = 0 then Result := 1
我是一名优秀的程序员,十分优秀!