为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Ajax 更改服务器端语言 cookie,就像客户端一样?

如何使用 Ajax 更改服务器端语言 cookie,就像客户端一样?

红颜莎娜 2023-10-20 15:02:08
我有两个新闻网站,一个是西班牙语,一个是英语:es.example.com // Spanishexample.com // English但从主域(英语)我正在集成一个系统,以便能够以另一种语言显示新闻,例如:example.com/es/url-de-la-noticia/ // Spanish根据该 URL,我创建一个“cookie”,其中将存储 URL 的语言,这是第一个文件夹/子文件夹或目录“/es/”://I create the cookies automatically for the subdomain and for the URLs in Spanish.if($FOLDER_LANG === "es" || $SUBDOMAIN_LANG === "es") {    setcookie ('language', 'es', time()+60*60*24*365, '/', '.example.com');}使用此参数,网站的新闻将以西班牙语显示:es.example.com通过子域es或通过西班牙语的 URL example.com/es/url-de-la-noticia/=es//We verify the existence of the cookieif(isset($_COOKIE['language'])){    //We print variables of the language in coincidence of the value that the cookie stores    if($_COOKIE['language']==='en'){        $website_title = " | Sitio en español";        $lang = 'es';        $language = "es";    }elseif($_COOKIE['language']==='es'){        $website_title = " | WebSite Ingles";        $lang = 'en';        $language = "en";    }} else {    //In case there is no cookie, I show the English language by default.    $website_title = " | WebSite Ingles";    $lang = 'en';    $language = "en";}到目前为止,一切似乎都运行正常。但是当我尝试通过Ajax更改语言时,问题就出现了,虽然Ajax代码确实发送和发送信息,但由于某种原因它并没有替换cookie,也就是说,如果我点击英文语言,它并没有改变它,语言的变化。language.ini.php文件将负责更改语言、创建各自的 cookie。<?php    if (isset($_POST['lang'])) {        $lang = $_POST['lang'] ?: '';            if ($lang === "en") {            setcookie ('language', 'en', time()+60*60*24*365, '/', 'example.com');        } elseif ($lang === "es") {            setcookie ('language', 'es', time()+60*60*24*365, '/', 'es.example.com');        }    }?>
查看完整描述

5 回答

?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

服务器端 Ajax 调用(修复)

在你的language.ini.php中你必须改变这一行:

setcookie ('language', 'es', time()+60*60*24*365, '/', 'es.example.com');

到 :

 setcookie ('language', 'es', time()+60*60*24*365, '/', 'example.com');

因为如果您在标头中指定cookie 的域,则它将不是仅主机 cookie,并且在您的两者中example.comes.example.com将使用。

根据RFC6265

Cookie 的工作原理

  1. Cookie通常会由服务器端请求设置,浏览器会保存它们。

  2. 浏览器在每个请求中发送 Cookie。

  3. 服务器可以从浏览器的请求中访问cookie。

Cookie 是必不可少的,因为Http 是无连接协议,服务器希望将数据与客户端关联并在下一个请求中使用它。

首选场景(所需的解决方案)

只要您的用户决定以他们喜欢的语言查看您的网站。并且您的服务器不会对其执行任何操作(没有控件,没有安全线程)。

你可以使用快捷方式

在您的客户端设置 Cookie

然后删除language.ini.php文件。

当用户尝试在浏览器中导航时,您可以通过纯 JavaScript 来完成此操作。他/她的请求将通过已设置 JavaScript 的新 Cookie 发送。

只是您必须注意不要在 Cookie 上启用 HTTP-Only 标志(这可以防止 Js 操作 Cookie)。

Jquery 示例:

$.cookie('language', '', { expires: 365, path: '/', domain: 'example.com' });

您的 js 可以如下所示,而不是发送 ajax 请求:

$(function() {

    $(".lang").click(function(e) {

        e.preventDefault();

        var language = $(this).attr('data-value');

        $.cookie('language', language, { expires: 365, path: '/', domain: 'example.com' });


    });

});


查看完整回答
反对 回复 2023-10-20
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

也许 J. Mick,使用会话存储并不是解决这个问题的方法,也许使用 HTML Web 存储更合适?至少这样,您不必刷新页面来更新 cookie 值等,它可以直接从 JavaScript 写入和读取。


查看完整回答
反对 回复 2023-10-20
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

可以针对您的浏览器(无论是 AJAX)发出的所有请求发送和接收 Cookie。您还可以更新已经设置的cookie,setcookie您似乎已经在使用该cookie。您可以通过在选项卡下方Request Headers和选项卡Response Headers中查看来验证相同的内容Networks

可能还有其他原因导致了您的问题。


查看完整回答
反对 回复 2023-10-20
?
largeQ

TA贡献2039条经验 获得超7个赞

使用 chrome 扩展,您可以使用 javascript api 轻松修改服务器 cookie 或您想要的任何 cookie

https://developers.chrome.com/docs/extensions/reference/cookies/

通过这种方式,您可以访问任何 cookie,这与常规 DOM javascript 不同,例如,常规 DOM javascript 只能访问非 httpOnly cookie。 https://www.cookiepro.com/knowledge/httponly-cookie/

当在服务器上创建 cookie 并将 httpOnly 属性设置为 true 时,则无法从 DOM javascript 读取此 cookie。但 chrome webextension api 确实可以访问这些 cookie。

如果您需要更多帮助或者这对您有帮助,请告诉我......


查看完整回答
反对 回复 2023-10-20
?
不负相思意

TA贡献1777条经验 获得超10个赞

对于同一件事,您似乎有多个 UI。您有一个英语和一个西班牙语网站。由于域不同,如果您在不同的域上有不同的会话和 cookie,我不会感到惊讶。

但是,为了避免重复代码和功能,至少可以在某个 URL 上提供底层逻辑,从而向您的西班牙语和英语版本公开 API。

您的方法是有缺陷的,因为您没有重新加载页面。然而,如果你有这三个部分,你就可以解决这个问题:

  • 应用程序编程接口

  • 英文界面

  • 西班牙语用户界面

英语 UI 和西班牙语 UI 都将以类似的方式使用 API,并且在 API 级别上,实际的英语/西班牙语文本的相关性较低,但 API 将是确定语言的级别。

因此,如果您单击西班牙语网站上的英语按钮或英语网站上的西班牙语按钮,则会发生以下情况:

  • 请求被发送到 API

  • API 为其他语言的站点生成令牌,因此用户无需手动登录

  • 包含该令牌的链接将返回到 UI

  • UI 会自动重定向到其他语言的 UI

  • 这可确保域正确并且页面已加载

  • 一旦访问其他 URL,就会向 API 发送请求

  • API 验证令牌

  • 如果令牌有效,则允许用户进入系统并销毁令牌

这就是我的处理方式。起初,您的 API 可能非常简单,仅处理此功能,但理想情况下,将逻辑与两个 UI 分开会很棒。

由于此解决方案涉及向 API 发送 AJAX 请求(该请求将位于不同的 URL 上),因此您需要确保拥有正确的 HTML 标头,以允许您的页面向 API 发送请求,而不会违反该网站的 CORS 政策。浏览器。


查看完整回答
反对 回复 2023-10-20
  • 5 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信