Java接收Axios-GET请求中的数组参数
今天前端在发起API接口请求时提示跨域问题,但同域名其他API接口请求正常,很是奇怪。
本文记录如何使用docker commit
创建一个带有SSH服务的ubuntu镜像
MySQL函数concat多个字段模糊查询不匹配问题
在大数据时代,http被劫持已经成为常态了,近期公司决定对全站做https升级。
要实现https升级需要以下步骤:
第一步骤实现起来简单,做下强制跳转即可,但要想实现第二步骤确很麻烦,业务中有很多老项目。
为了实现第二步骤,采用的方案是源代码中继续使用http,通过在服务端响应 Upgrade-Insecure-Requests: 1
头,
1 | header("Content-Security-Policy: upgrade-insecure-requests"); |
1 | <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" /> |
Content-Security-Policy
后,导致页面中的 Ajax 请求丢失 X-Requested-With: XMLHttpRequest
头信息:注意:此问题只出现在服务端做 isAjax 请求的处理逻辑中,如下面基于 Yaf 框架示例的代码。
PHP 代码:
1 | class DemoController extends \Yaf\Controller_Abstract { |
HTML 代码:
1 | <!DOCTYPE html> |
在浏览器中访问 https://yaf.codezm.com:8081/demo/index
地址:
https://yaf.codezm.com:8081/demo/index
时,Requset Headers
中携带了 X-Requested-With: XMLHttpRequest
头。<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
,将ajax的url值改成 http://yaf.codezm.com:8081/demo/index
时,Requset Headers
中并未携带 X-Requested-With: XMLHttpRequest
头,服务端也就没有办法确定是否是 ajax 请求了。分析 Ajax :
crossDomain
的值是 false
时,才会增加 X-Requested-With: XMLHttpRequest
头信息。
那为什么 crossDomain 为 true 了呢?https://github.com/jquery/jquery/blob/main/src/ajax.js#L555
解决方案:
X-Requested-With: XMLHttpRequest
头信息。crossDomain: false
,使其同源。1 | $.ajax({ |
ThinkPHP
中的 isAjax
代码:
因为 upgrade-insecure-requests
会将站点的所有非导航不安全 URL (HTTP) 自动升级(第一方 和第三方请求)。
非导航不安全 URL是指:
<a>
标签不会升级,即还是原来的<a href="http://not-example.com/">Home</a>
。
自 Chrome 85 版本之后,已将原来的 referer策略(policy):由
no-referrer-when-downgrade
,变更为strict-origin-when-cross-origin
。
strict-origin-when-cross-origin
同源时,发送完整的 Referer
字段。跨域时,https跳转https 仅发送源信息(协议+域名+端口)、https跳http不发送任何referer数据。http跳转跨域仅发送源信息。
同源:协议+域名+端口 都相同。
跨域:协议、域名、端口 任一不同。
no-referrer-when-downgrade
从 HTTPS 网址链接到 HTTP 网址,不发送Referer
字段,其他情况发送。
示例:
<a href="{{ url('members/index') }}">用户列表</a>
文件路径:webservice/application/plugins/Twig.php
要修改的代码:
1 | $twig->twig->addFunction("url", new Twig_Function_Function("Tools_help::url")); |
PHP>=5.4更改后:
1 | $twig->twig->addFunction("url", new Twig_Function_Function(function() { |
PHP5.3更改后:
1 | $twig->twig->addFunction("url", new Twig_Function_Function(array($this, 'url'))); |
示例:
<link rel="stylesheet" href="{{config['application']['site']['assetsUri']}}admin/css/bootstrap.min.css" />
更改配置文件:
application.site.assetsUri = 'http://yaf.codezm.com/assets/'
调整为 application.site.assetsUri = '//yaf.codezm.com/assets/'
或者在同域名下的 application.site.assetsUri = '/assets/
。
Twig::url
模板渲染路径去除 http:
及 https:
协议前缀,浏览器中可通过 location.protocol='https:'
来获取当前URL使用的协议值。
API: 是 http
强制跳转 https
协议,则云服务(七牛云、阿里云、gitee.com)回调地址必须是 https
协议地址,若还保持 http
会造成 301
等响应码及错误响应数据。
微信相关业务: 特约商户
回调地址需改成 https
协议,否则会报:页面地址:xxx 未注册
。
Chrome.93.0.4577.63: http协议设置的cookie、domain为 .codezm.com
,然而 ajax 在跨域请求 https 协议地址时无法携带 cookie 值。若改为https协议设置cookie即可。
Set-Cookie: API_PHPSESSID=613ac2738d9ee2.02197130; expires=Thu, 06-Jun-2024 02:26:59 GMT; path=/; domain=.codezm.com
vscode 提供了两种设置方式:
Workspace Settings 会覆盖 User Settings。
打开用户设置和项目设置的方法如下:
File > Preferences > Settings
Code > Preferences > Settings
或直接通过命令行面板(**Ctrl/Command+Shift+P
**)输入 Open Settings (JSON)
进行调出
vscode 中的 设置选项 都配置在一个 settings.json
文件中。
其中,用户设置(User Settings) 的路径为:
%APPDATA%\Code\User\settings.json
$HOME/Library/Application Support/Code/User/settings.json
$HOME/.config/Code/User/settings.json
而 项目设置(Workspace Settings) 的路径为:根目录下的 .vscode
中。