使用jQuery将额外的数据附加到页面中的每个链接

时间:2011-08-30 13:48:04

标签: jquery authentication

我正在服务器端创建一个非流行的编程语言的Web应用程序。因此,许多身份验证代码需要由我自己开发。

在服务器端,我需要接收来自客户端的每个GET请求的认证字符串,以便我可以决定这是否是有效用户(否则我将用户引导到登录屏幕)。

我想我可以使用jQuery在所有链接的href参数中添加一些东西,行:

jQuery("a").attr("href).append("?token='"+tokenStr+"'");

但是如果链接已经有了“?”,它将引入一个错误。我更喜欢将信息作为POST发送到服务器(任何其他替代方案?)但我不确定是否可以在HTML中执行此操作。

我不希望身份验证令牌成为URL的一部分的原因是因为如果用户为该页面添加书签,服务器会将他指向登录页面,因为令牌将在一段时间后过期。

3 个答案:

答案 0 :(得分:0)

您可以在页面中同时使用(POST或GET),并检查有关安全性和其他影响的信息:http://www.cs.tut.fi/~jkorpela/forms/methods.html

但是,我不明白为什么你不解析你的那个链接并采取适当的回应你可能会找到的,例如添加 + 而不是

编辑:mblase是对的。

答案 1 :(得分:0)

试试这个:

var tokenStr = 'something';
$('a').each(function(){
    var elem = $(this),
        href = elem.attr('href'),
        hasQueryString = href.indexOf('?') > -1;
    if (hasQueryString) {
        elem.attr('href', href + '&token=' + tokenStr);
    } else {
        elem.attr('href', href + '?token=' + tokenStr);
    }
});

这是一个更好的版本,允许在url中使用散列(#)/锚点:

var tokenStr = 'something';
$('a').each(function () {
    var elem = $(this),
        parts = elem.attr('href').split('#'),
        hasQueryString = parts[0].indexOf('?') > -1;
    if (parts[0].length > 0) {
        parts[0] = parts[0] + (hasQueryString ? '&' : '?') + 'token=' + tokenStr;
    }
    elem.attr('href', (parts.length > 1 ? parts.join('#') : parts.join()));
});

此外,您还可以将“token”参数作为隐藏字段注入页面上的所有表单:

$('form').append(
    $('<input type="hidden" name="token"/>').attr('value', tokenStr)
);

答案 2 :(得分:0)

您可以将隐藏的输入附加到页面上的每个表单,以支持通过POST或GET发送令牌。

$("form").append('<input type="hidden" name="token" value="'+tokenStr+'"/>');

要在页面使用的任何链接上添加令牌: 编辑:实际上,附加令牌的任何其他实现都存在问题,并且当您与其中的某个哈希链接时就是这种情况,例如: /mypage.html?foo=bar#content。 我们必须检测,只要链接的href具有哈希字符,就可以正确追加令牌。

以下更新的代码:

$("a").each(function() {
    var gps = this.href.split('#');        
    gps[0] = gps[0].indexOf('?')>-1 ? '&'+tokenStr : '?'+tokenStr;
    this.href = gps.length > 1 ? gps.join('#') : gps.join();
});