2011-01-15 13 views
3

Ich habe eine URL.LoginID, und ich möchte es aus der Adressleiste entfernen, wenn der Benutzer auf den Link zum Anmelden klickt. Es muss ein Lesezeichen sein, es kann kein Formular sein.So entfernen Sie eine URL-Variable

F: Wie entferne ich LoginID von index.cfm LoginID = XYZ & AssignmentID = 123

Es ist wahrscheinlich etwas entlang der Linien von:

<cflocation url="#cgi.SCRIPT_NAME#?#cgi.QUERY_STRING#" addtoken="no"> 

Antwort

19

Sieht aus, als ob Sie auf dem richtigen Weg sind.

Wenn loginID das einzige in der Abfragezeichenfolge ist, können Sie einfach auf die Zielseite ohne die Abfragezeichenfolge verweisen.

Wenn andere Daten in dem Query-String ist, dann kann man so etwas tun:

<cfset q = reReplaceNoCase(cgi.query_string, "LOGINID=[^&]+&?", "")> 
<cflocation url="#cgi.SCRIPT_NAME#?#q#"> 

Dies resultiert im Wesentlichen entfernt loginid und alles, bis entweder die en der Zeichenfolge oder das nächste URL-Variable.

+1

+1 für ordentlich regex - ich wusste, dass eine elegantere Art und Weise war es –

+0

+1 für intelligentere regex als meine Version, die nicht zu tun :) ist so zuverlässig. – Sergii

+0

+1. Auch bearbeitet, um 'reReplace()' zu ändern -> 'reReplaceNoCase()' – orangepips

3

Es gibt eine Reihe von Möglichkeiten zu tun dies hier ist ein Weg, um eine Liste Schleife zu lesen über die vorhandene Parameter und überprüfen Sie die, die Sie verwenden möchten, ignorieren:

<cfset newParams = "" /> 

<cfloop list="#cgi.query_string#" delimiters="&" index="i"> 
    <cfif listFirst(i, "=") neq "loginID"> 
     <cfset newParams = listAppend(newParams, i, "&") /> 
    </cfif> 
</cfloop> 


<cflocation url="#cgi.script_name#?#newParams#" addtoken="no"> 

Hoffnung, das hilft! BTW

QUERY_STRING = ReReplaceNoCase(cgi.QUERY_STRING, "LoginID=.+\&", ""); 

, ich bin nicht sicher, warum halten Sie LoginID in URL überhaupt:

2

Angenommen, Sie nicht wirklich die ? zu halten die URL gültig ist, so einfach regex sollte entfernen möchten arbeiten Es kann ein unsicherer Ansatz sein. Sessions zu verwenden klingt wie eine bessere Idee.

Edit: Ben Regex ist besser, weil meine Version ist so einfach, dass alle key=value Paare vor dem letzten "essen" wird.

1

Insert famous Zawinski two problem regex quote und lösen anders:

<cfset copy = duplicate(url)> 
<cfset structDelete(copy, "loginid")> 
<cfset entries = []> 
<cfloop collection="#copy#" item="key"> 
    <cfset arrayAppend(entries, "#key#=#copy[key]#")> 
</cfloop> 
<cfoutput>#arrayToList(entries, "&")#</cfoutput> 
+0

Gibt es einen Grund, warum Sie ArrayAppend() und ArrayToList() anstelle von listAppend() verwenden? –

+0

In Bezug auf Speicherverbrauch führt Array-Verkettung besser als String (d. H. Liste). Dieser Link auf den String-Literal-Pool in Java für ein wenig mehr Erklärung: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 – orangepips

4

Wie üblich, gibt es bereits eine UDF, dass jemand auf CFLIB verfügbar geschrieben hat: queryStringDeleteVar

können Sie dann wie tun so

<cflocation 
    url="#cgi.SCRIPT_NAME#?#queryStringDeleteVar("LoginID",cgi.QUERY_STRING)#" 
    addtoken="no" 
> 

CGI.QUERY_STRING ist eigentlich der Standard für das zweite Argument, also funktioniert das genauso gut

<cflocation 
    url="#cgi.SCRIPT_NAME#?#queryStringDeleteVar("LoginID")#" 
    addtoken="no" 
> 

Hier ist der Code für queryStringDeleteVar:

<cfscript> 
/** 
* Deletes a var from a query string. 
* Idea for multiple args from Michael Stephenson ([email protected]) 
* 
* @param variable  A variable, or a list of variables, to delete from the query string. 
* @param qs  Query string to modify. Defaults to CGI.QUERY_STRING. 
* @return Returns a string. 
* @author Nathan Dintenfass ([email protected]@changemedia.com) 
* @version 1.1, February 24, 2002 
*/ 
function queryStringDeleteVar(variable){ 
    //var to hold the final string 
    var string = ""; 
    //vars for use in the loop, so we don't have to evaluate lists and arrays more than once 
    var ii = 1; 
    var thisVar = ""; 
    var thisIndex = ""; 
    var array = ""; 
    //if there is a second argument, use that as the query string, otherwise default to cgi.query_string 
    var qs = cgi.query_string; 
    if(arrayLen(arguments) GT 1) 
     qs = arguments[2]; 
    //put the query string into an array for easier looping 
    array = listToArray(qs,"&");   
    //now, loop over the array and rebuild the string 
    for(ii = 1; ii lte arrayLen(array); ii = ii + 1){ 
     thisIndex = array[ii]; 
     thisVar = listFirst(thisIndex,"="); 
     //if this is the var, edit it to the value, otherwise, just append 
     if(not listFind(variable,thisVar)) 
      string = listAppend(string,thisIndex,"&"); 
    } 
    //return the string 
    return string; 
} 
</cfscript>