2013-02-19 15 views
5

Nach viel Forschung zu stackoverflow poste ich diese Frage, da ich keine Lösung für das Problem finden konnte.Struts2- URL-Tag - Suche ausblenden String

Anforderungsszenario: Aktualisiere einen Kunden aus einer Kundenliste basierend auf jeder Kundennummer als Parameter.

Lösung versucht: Basierend auf der Kunden-ID, die sie von der JSP erhalten haben, übergeben Sie sie an die Aktion als Struts2-URL-Tag.

Problem konfrontiert - Query String auf der URL sichtbar.
http://foo.com/Struts2Example/getCustomerAction?customerId=2

Fragen:

  1. Können wir die Query-String nicht verstecken, wenn wir Streben URL-Tag verwenden?
  2. Wenn wir die Verwendung der Abfragezeichenfolge nicht während der Verwendung von Url-Tag ausblenden können? Was ist die Alternative für das obige Szenario?

-Code für struts.xml, jsp und Aktion unter -

<h2>All Customers Details</h2> 

<s:if test="customerList.size() > 0"> 
    <table border="1px" cellpadding="8px"> 
     <tr> 
      <th>Customer Id</th> 
      <th>First Name</th> 
      <th>Last Name</th> 
      <th>Age</th> 
      <th>Created Date</th> 
     </tr> 
     <s:iterator value="customerList" status="userStatus"> 
      <tr> 
       <td><s:url var="editCustomer" action="getCustomerAction"> 
         <s:param name="customerId" value="%{customerId}" /> 
        </s:url> 

        <p> 
         <s:a href="%{editCustomer}"> 
          <s:property value="customerId" /> 
         </s:a> 
        </p></td> 

       <td><s:property value="firstname" /></td> 
       <td><s:property value="lastname" /></td> 
       <td><s:property value="age" /></td> 
       <td><s:date name="createdDate" format="dd/MM/yyyy" /></td> 
      </tr> 
     </s:iterator> 
    </table> 
</s:if> 
<br /> 
<br /> 

struts.xml-

<!-- Get Customer Details - To Pre-Populate the form to update a Customer --> 
    <action name="getCustomerAction" method="getCustomerById" 
     class="com.hcl.customer.action.CustomerAction"> 
     <result name="success">pages/customerForm.jsp </result> 
    </action> 

Kunden Aktion klassen

public class CustomerAction extends ActionSupport implements ModelDriven { 

Logger logger = Logger.getLogger(CustomerAction.class); 

Customer customer = new Customer(); 

List<Customer> customerList = new ArrayList<Customer>(); 
CustomerDAO customerDAO = new CustomerDAOImpl(); 

public Customer getCustomer() { 
    return customer; 
} 

//Set Customer onto Value Stack 
public void setCustomer(Customer customer) { 
    this.customer = customer; 
} 

public List<Customer> getCustomerList() { 
    return customerList; 
} 

//Set Customer List onto Value Stack 
public void setCustomerList(List<Customer> customerList) { 
    this.customerList = customerList; 
} 

public String execute() throws Exception { 
    return SUCCESS; 
} 

public Object getModel() { 
    return customer; 
} 



// Edit customer details, it will retrieve the records based on customerId 
//SkipValidation is used to skip the validate() 
@SkipValidation 
public String getCustomerById() { 

    logger.info("** Customer Id to edit ** " + customer.getCustomerId()); 

    customer = customerDAO.customerById(customer.getCustomerId()); 

    return SUCCESS; 

} 
+0

Warum möchten Sie die ID verstecken? Wenn Sie den Wert auf der Clientseite speichern, kann jeder die Quelle ansehen und abrufen. Sie können natürlich Post verwenden, um das Ergebnis zu senden, berücksichtigen Sie jedoch die Notwendigkeit für den Benutzer, die Seite mit einem Lesezeichen zu versehen. Wirklich die Antwort ist Sicherheit ... sollte dieser Benutzer auf diese Kundennummer zugreifen können? Wenn nicht, sollte es in keinem Fall erlaubt sein. – Quaternion

+0

Ja, der Benutzer kann eine Seite wie diese mit einem Lesezeichen versehen ... aber die Frage lautet 'Aktualisieren Sie einen Kunden', während die URL' ** getCustomer ** Action? CustomerId = 2' ist ... etwas Seltsames hier:> –

+0

@AndreaLigios - Das Szenario ist, um einen Kunden zu aktualisieren, muss ich seine Details auf dem Formular vorbelegen. Um die Details abzurufen, frage ich die Datenbank mit der customerId ab. –

Antwort

1

Einige ungeordnete Überlegungen:

  • verwenden unterschiedliche Aktionen (mit der Methode execute nur) oder verschiedene Methoden derselben Aktion, um verschiedene "Aktionen" auszuführen;
  • Der Name jeder Aktion/Methode sollte die Operation ausgeführt entsprechen und selbsterklärend sein, zum Beispiel sollten Sie eine editCustomer Methode (oder Aktion) zu bearbeiten die Kunden und eine getCustomer Methode (oder Aktion) zu erhalten der Kunde;
  • Die HTTP-Methode GET sollte zum Lesen von Daten verwendet werden, während die HTTP-Methode POST zum Senden von Daten verwendet werden sollte. jede nicht lesende Operation sollte idealerweise durch POST durchgeführt werden; Die Verwendung von GET zum Senden von Daten ist eine alte schlechte Praxis vor 20 Jahren geboren und nie gestorben:/Die Gründe für die Verwendung von POST sind die versteckte URL, eine höhere Ladekapazität, die Fähigkeit, Binärdaten zu senden, etc ...

Das heißt, sollte eine URL wie http://foo.com/Struts2Example/getCustomerAction?customerId=2 sichtbar sein (merkt zum Beispiel sein), und idealerweise verniedlicht (REST-Stil, wie Stackoverflow) werden soll: so etwas wie http://foo.com/Struts2Example/Customer/2/

Eine URL wie http://foo.com/Struts2Example/editCustomerAction?customerId=2 kann‘ t Arbeit, weil Sie keinen anderen Parameter weitergeben; Sie wissen, die ID des Kunden zu bearbeiten, aber nicht die Daten zu ändern ... Es würde so etwas wie: http://foo.com/Struts2Example/editCustomerAction?customerId=2&name=foo&lastname=bar&age=42, das würde funktionieren, aber wie gesagt (und wie in Ihrer Frage fragen) sollte versteckt und behandelt werden durch POST.

Wenn Sie in der source der Seite die ID s drucken, dann sollte es nicht notwendig sein, sie für den Benutzer zu verbergen;

Sie müssen sicherstellen, dass der Benutzer die ID s nicht außerhalb des von Ihnen angegebenen Bereichs ändern kann. Wenn Sie auf der Seite eine Liste von Kunden mit ID {1,2,3} gezeichnet haben, müssen Sie jeden Versuch des Benutzers blockieren, die ID zu ändern und versuchen, den Kunden mit ID = 4 zu aktualisieren ... um dies zu erreichen, speichern Sie einfach die Liste der ID in session vorher füllen Sie die Seite und überprüfen Sie die ID s von der Seite zurückgegeben gegen Ihre Liste. Wenn sie nicht übereinstimmen, blockieren Sie die böswillige Operation.

Hoffe, dass hilft

+0

Vielen Dank für Ihre Zeit und antworten. Stimme völlig mit Ihnen überein, w.r. Aktion/Methodennamen. Zweitens, da ich hier kein Formular verwende, wie kann ich in meinem Fall die Anfrage an die Aktion als POST stellen? schätzen Sie Ihre Hilfe hier. –

+0

Gern geschehen; Warum benutzt du kein Formular? Und warum kannst du nicht eins hinzufügen? Sie sind frei :) –

+0

Das Szenario brauchte kein Formular. Da ich keine andere passende Option finde, kann ich genauso gut mit einem Formular arbeiten. Auch da sie kostenlos sind;) Danke Leute für die Antwort auf meine Fragen. Bin dankbar! Prost! –

1

Eine Alternative ist um die Benutzer-ID zu verschlüsseln und an die HTML-Seite zurückzusenden. Pflegen Sie das Mapping auf der Client-Seite. Wenn Sie die Anfrage senden, senden Sie den verschlüsselten Wert POST. Die Entschlüsselungs-/Verschlüsselungslogik wird auf der Serverseite sein. Dies wird einen Overhead auf dem System hinzufügen, aber dies ist eine angemessene Abwägung zur Leistung im Vergleich zu Security. Sehen Sie sich auch @ jcryption.org/info an, dessen Lizenz unter MIT und GPL steht.

Eine einfachere Lösung besteht darin, dies in "POST" -Aktion umzuwandeln, so dass die Werte innerhalb des HTTP-Request-Body übergeben werden. Wenn es über HTTPS, wäre es verschlüsselt werden, aber Sie noch tun können, die Benutzer-ID-Lookup über Google Developer Tools oder IE9 Entwicklermodus

+0

konvertiert die Kommentare in Antwort. Bitte ignoriere Kommentare. Danke – user1428716

+0

@ user1428716- danke für die Antwort. In diesem Szenario, da ich kein struts-Formular verwende, wie kann ich die Anfrage zu POST erreichen/konvertieren? –