【发布时间】:2021-06-17 07:10:45
【问题描述】:
Stack Overflow 上有很多关于表单字段中撇号的问题;主要是关于未编码的值。 This 是一篇非常有见地的文章,介绍了为什么 encodeURIComponent(str) 不适用于撇号以及如何创建自己的自定义
function rfc3986EncodeURIComponent (str) {...
我遇到的问题是,即使我将撇号 (%27) 编码为来自 JavaScript 的 AJAX 调用中的值,我也会收到 403 Forbidden 错误。 Tomcat (8.5) 立即返回。 Tomcat 服务器上似乎没有应用程序处理(应用程序日志和 catalina.out 均未显示任何活动)。
./application/processSomeAction.action?encodedValue=abc%27 导致 403 错误。
./application/processSomeAction.action?encodedValue=abc%2a 处理正常。
./application/processSomeAction.action?encodedValue=abcd 处理正常。
AJAX 调用是纯 JavaScript,没有 JQuery。
在 AJAX 调用中根本不允许使用 RFC 3986 子分隔符吗?
【问题讨论】:
-
不可能“全部发生在 Chrome 浏览器中”,因为 Chrome 不构成请求代码(尽管它可能会返回 cached 响应)。网络选项卡显示什么?打开网络选项卡将显示实际的请求+响应,并且可以禁用缓存(无论如何都有一个选项)。
-
感谢 user2864740。编辑问题以声明“Tomcat 上没有应用程序处理”。
-
为什么不简单地发送一个
'字符? Tomcat前面有web服务器吗?还是WAF等?除了访问日志之外,您的 Tomcat 日志other 中是否还有其他内容?意思是……你能证明Tomcat看到了请求吗?当添加一个在值中包含“%27”的请求参数时(来自例如wget),我无法让我的 Tomcat 实例返回 403。 -
谢谢Chtistopher。该问题最初是由未编码的撇号引起的。然后我们尝试对撇号进行编码,同样的问题仍然存在。请注意,此问题发生在 AJAX 调用的上下文中。上面的代码遵循 "xmlhttp.open("POST", "..." 你是对的。我不确定 Tomcat 服务器是否看到了请求。我只知道 Chrome DEV 工具中的网络选项卡在我的 JavaScript 中调用“xmlhttp.send(null);”的行显示 403 状态。
-
我最初的怀疑是 Chrome 浏览器中的某些东西正在生成 403 状态,因为根据 RFC 3986,撇号是“子分隔符”,并且 Chrome 禁止我的请求,因为我没有有一对这样的分隔符。
标签: javascript ajax google-chrome tomcat tomcat8