2013-02-19 23 views
5

स्टैक ओवरफ्लो पर बहुत सारे शोध के बाद मैं इस प्रश्न को पोस्ट कर रहा हूं क्योंकि मुझे इस मुद्दे का समाधान नहीं मिला।स्ट्रूट 2- यूआरएल टैग - छुपाएं क्वेरी स्ट्रिंग

आवश्यकता परिदृश्य: प्रत्येक ग्राहक आईडी के आधार पर ग्राहकों की सूची से ग्राहक को एक पैरामीटर के रूप में अपडेट करें।

समाधान प्रयास किया गया: जेएसपी से प्राप्त ग्राहक आईडी के आधार पर, इसे स्ट्रूट 2 यूआरएल टैग के रूप में क्रिया में पास करें।

समस्या का सामना करना - URL पर दिखाई देने वाली क्वेरी स्ट्रिंग।
http://foo.com/Struts2Example/getCustomerAction?customerId=2

सवाल:

  1. हम नहीं क्वेरी स्ट्रिंग को छिपाने कर सकते हैं अगर हम struts यूआरएल टैग का उपयोग?
  2. यदि हम यूआरएल टैग का उपयोग करते समय उपयोग क्वेरी स्ट्रिंग को छिपा नहीं सकते हैं? उपरोक्त परिदृश्य के लिए विकल्प क्या है।

struts.xml, jsp और नीचे कार्रवाई के लिए कोड -

<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> 

ग्राहक कार्रवाई कक्षा

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

क्यों आप आईडी को छिपाना चाहते हैं? यदि आप ग्राहक पक्ष पर मूल्य संग्रहीत करते हैं तो कोई भी स्रोत को देख सकता है और इसे प्राप्त कर सकता है। परिणाम देखने के लिए आप निश्चित रूप से पोस्ट का उपयोग कर सकते हैं, हालांकि उपयोगकर्ता को पृष्ठ को बुकमार्क करने की आवश्यकता पर विचार करें। वास्तव में जवाब सुरक्षा है ... क्या यह उपयोगकर्ता इस ग्राहक आईडी तक पहुंचने में सक्षम होना चाहिए? यदि नहीं तो किसी भी मामले में इसकी अनुमति नहीं दी जानी चाहिए। – Quaternion

+0

हाँ उपयोगकर्ता इस तरह के एक पेज को बुकमार्क कर सकता है ... लेकिन सवाल कहता है कि यूआरएल '** ग्राहक को अपडेट करें '** प्राप्त करें ग्राहक ** कार्य? ग्राहक आईडी = 2' ... यहां कुछ अजीब बात है:> –

+0

@AndreaLigios - परिदृश्य है, एक ग्राहक को अद्यतन करने के लिए, मुझे फॉर्म पर अपने विवरण पूर्व-पॉप्युलेट करना होगा। विवरण लाने के लिए, मैं ग्राहक आईडी के साथ डेटाबेस से पूछता हूं। –

उत्तर

1

कुछ अव्यवस्थित विचारों का उपयोग कर उपयोगकर्ता आईडी देखने कर सकते हैं एन्क्रिप्टेड किया जाएगा:

  • उपयोग विभिन्न क्रिया (निष्पादित विधि के साथ केवल) , या अलग-अलग "क्रियाएं" करने के लिए, एक ही क्रिया के विभिन्न तरीके;
  • प्रत्येक कार्रवाई के नाम/विधि आपरेशन से मेल खाना चाहिए प्रदर्शन किया और आत्म व्याख्यात्मक हो, उदाहरण के लिए आप करने के लिए संपादित ग्राहक और एक getCustomer विधि (या एक्शन) एक editCustomer विधि (या एक्शन) होना चाहिए प्राप्त ग्राहक;
  • डेटा HTTP पढ़ने के लिए HTTP विधि का उपयोग किया जाना चाहिए, जबकि POST HTTP विधि डेटा भेजने के लिए उपयोग की जानी चाहिए; प्रत्येक गैर-पठन ऑपरेशन आदर्श रूप से POST के माध्यम से किया जाना चाहिए; डेटा भेजने के लिए जीईटी का उपयोग करना 20 साल पहले पैदा हुआ एक पुराना बुरा अभ्यास है और कभी नहीं मर गया:/POST का उपयोग करने के कारण छिपे हुए यूआरएल, उच्च लोड क्षमता, द्विआधारी डेटा भेजने की क्षमता आदि हैं ...

कहा कि, http://foo.com/Struts2Example/getCustomerAction?customerId=2 की तरह एक URL दिखाई देना चाहिए (उदाहरण के लिए बुकमार्क किया जा करने के लिए), और आदर्श prettified किया जाना चाहिए (बाकी शैली, StackOverflow की तरह): जैसे http://foo.com/Struts2Example/Customer/2/

http://foo.com/Struts2Example/editCustomerAction?customerId=2 की तरह एक यूआरएल कुछ कर सकते हैं ' टी काम नहीं, क्योंकि आप किसी अन्य पैरामीटर को पार नहीं कर रहे हैं; आप ग्राहक को संपादित करने की आईडी जानते हैं, लेकिन डेटा बदलने के लिए नहीं ... यह कुछ ऐसा हो जाएगा: http://foo.com/Struts2Example/editCustomerAction?customerId=2&name=foo&lastname=bar&age=42, जो काम करेगा, लेकिन जैसा कि कहा गया है (और जैसा कि आपके प्रश्न में पूछता है) छुपाया जाना चाहिए, और संभाला जाना चाहिए पोस्ट के माध्यम से।

यदि आप पृष्ठ ID एस में प्रिंट कर रहे हैं, तो उन्हें उपयोगकर्ता को छिपाने की कोई आवश्यकता नहीं होनी चाहिए;

आपको यह सुनिश्चित करने के लिए क्या करना है कि उपयोगकर्ता ID एस आपके द्वारा निर्दिष्ट सीमा के बाहर नहीं बदल सकता है; यदि आपने पृष्ठ में ID {1,2,3} वाले ग्राहकों की एक सूची बनाई है तो आपको आईडी को बदलने और ID = 4 के साथ ग्राहक को अपडेट करने का प्रयास करने के लिए उपयोगकर्ता के किसी भी प्रयास को अवरुद्ध करना होगा ... प्राप्त करने के लिए, बस session में ID की सूची संग्रहीत करें पृष्ठ को पॉप्युलेट करना, और अपनी सूची के विरुद्ध पृष्ठ द्वारा लौटाए गए ID एस की जांच करें। यदि वे मेल नहीं खाते हैं, तो दुर्भावनापूर्ण ऑपरेशन को अवरुद्ध करें।

आशा है कि

+0

आपके समय और उत्तर के लिए धन्यवाद। पूरी तरह से आपसे सहमत हैं, w.r.t एक्शन/विधि नाम। दूसरा, चूंकि मैं यहां एक फॉर्म का उपयोग नहीं कर रहा हूं, इसलिए मैं अपने मामले में POST के रूप में कार्रवाई के लिए अनुरोध कैसे कर सकता हूं? यहां आपकी मदद की सराहना करें। –

+0

आपका स्वागत है; आप एक फॉर्म का उपयोग क्यों नहीं कर रहे हैं? और आप एक क्यों नहीं जोड़ सकते? वे स्वतंत्र हैं :) –

+0

परिदृश्य को हालांकि एक फॉर्म की आवश्यकता नहीं थी। चूंकि मुझे कोई अन्य विकल्प उपयुक्त नहीं मिल रहा है, इसलिए मैं एक फॉर्म के साथ भी जा सकता हूं। इसके अलावा वे स्वतंत्र हैं;) मेरे प्रश्नों के जवाब के लिए धन्यवाद दोस्तों। इसकी प्रशंसा करना! चीयर्स! –

1

एक वैकल्पिक, है उपयोगकर्ता आईडी को एन्क्रिप्ट करने और इसे HTML पृष्ठ पर वापस भेजने के लिए। ग्राहक पक्ष पर मैपिंग बनाए रखें। जब आप अनुरोध जमा करते हैं, तो एन्क्रिप्टेड मान पोस्ट करें। डिक्रिप्शन/एनक्रिप्शन तर्क सर्वर की तरफ होगा। यह सिस्टम पर एक ओवरहेड जोड़ देगा लेकिन यह सुरक्षा की तुलना में प्रदर्शन के लिए एक सभ्य पर्याप्त व्यापार-बंद है। कृपया एमआईटी और जीपीएल लाइसेंस के तहत @ jcryption.org/info देखें।

एक आसान समाधान इसे "पोस्ट" क्रिया में परिवर्तित करना है ताकि मान HTTP अनुरोध निकाय के अंदर पास हो जाएं। अगर अपने से अधिक HTTPS, यह हालांकि आप अभी भी गूगल डेवलपर टूल या IE9 डेवलपर मोड

+0

टिप्पणियों को उत्तर में परिवर्तित कर दिया। कृपया टिप्पणियों को अनदेखा करें। धन्यवाद – user1428716

+0

@ user1428716- उत्तर के लिए धन्यवाद। इस परिदृश्य में, चूंकि मैं स्ट्रैट्स फॉर्म का उपयोग नहीं कर रहा हूं, इसलिए मैं अनुरोध को POST में कैसे प्राप्त/परिवर्तित कर सकता हूं? –

संबंधित मुद्दे