2008-10-10 14 views
9

में फ़िल्टर करना संभव है, मैं फ़िल्टर/सर्वलेट में अनुरोध को अवरुद्ध करना चाहता हूं और इसमें कुछ पैरामीटर जोड़ना चाहता हूं। हालांकि, अनुरोध 'सेट पैरामीटर' विधि का खुलासा नहीं करता है और पैरामीटर मैप जब मैनिप्लेटेड होता है तो यह एक त्रुटि फेंकता है कि यह लॉक है। क्या कोई विकल्प है जिसे मैं कोशिश कर सकता हूं?क्या अनुरोध के उपलब्ध पैरामीटर (HttpServletRequest)

उत्तर

12

उपवर्ग HttpServletRequestWrapper और getParameter तरीकों को ओवरराइड:

इस फिल्टर का एक उदाहरण है। इस वर्ग के वर्णन में लिखा है:

HttpServletRequest इंटरफ़ेस है कि एक सर्वलेट के लिए अनुरोध अनुकूल करने के लिए बधाई देने के लिए डेवलपर्स द्वारा subclassed किया जा सकता है के लिए एक सुविधाजनक कार्यान्वयन प्रदान करता है।

फ़िल्टर में, अनुरोध को अपने उप-वर्ग के उदाहरण में लपेटें।

+0

धन्यवाद :)। यह काम किया। –

+0

क्या आप एक उदाहरण प्रदान कर सकते हैं? –

+0

पब्लिक क्लास कस्टमहट्स्सर्वलेटरक्वेटवापर एचटीपीएसर्लेट रिवेस्टवापर का विस्तार करता है { \t निजी मानचित्र <स्ट्रिंग, स्ट्रिंग> कस्टम पैरामीटर; \t सार्वजनिक कस्टमहैट्स्सर्वलेटरक्वेटवापर (एचटीपीएसर्लेट अनुरोध अनुरोध) { \t \t सुपर (अनुरोध); \t} \t सार्वजनिक शून्य addCustomParameter (स्ट्रिंग नाम, स्ट्रिंग मान) { \t \t customParameters।रखो (नाम, मूल्य); \t} \t @Override \t सार्वजनिक स्ट्रिंग getParameter (स्ट्रिंग नाम) { \t \t स्ट्रिंग originalParameter = super.getParameter (नाम); \t \t यदि (मूल पैरामीटर! = शून्य) { \t \t मूल वापसी पैरामीटर; \t \t} अन्य { \t \t \t वापसी customParameters.get (नाम); \t \t} \t} } – Riccati

1

सबसे पहले आपको अनुरोध प्राप्त करना चाहिए और इसके सभी पैरामीटर पढ़ना चाहिए। फिर मूल पैरामीटर + नए वाले के साथ एक और अनुरोध बनाएं और इसे दोबारा भेजें।

HttpServletRequest अपरिवर्तनीय है और इसे बदलने का कोई तरीका नहीं है।

6

मैं मूल HttpServletRequest को एक नए CustomHttpServletRequest में लपेटता हूं जो मूल अनुरोध के लिए प्रॉक्सी के रूप में कार्य करता है और फिर फ़िल्टर श्रृंखला में इस नए CustomHttpServletRequest को पास करता है।

इस कस्टमहैट्स्सर्लेट रिवेस्ट में आप GetParameterNames, getParameter, GetParameterMap विधियों को अपने इच्छित पैरामीटर को वापस करने के लिए ओवरराइड कर सकते हैं।

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletRequest customRequest = new CustomHttpServletRequest(httpRequest); 
    customRequest.addParameter(xxx, "xxx"); 
    chain.doFilter(customRequest, response); 
} 
+0

धन्यवाद :)। यह काम किया। –

-1

अन्यथा, आप setAttribute() विधि का उपयोग कर सकते हैं जो दृढ़ता से टाइप किया गया है। इसलिए, getAttribute() विधि का उपयोग किया जा सकता है ...

+0

मैं इसे एक संपत्ति-फ़ाइल संचालित तंत्र के रूप में जोड़ रहा हूं जो नियमित अनुरोध को संशोधित करता है। इन आवश्यकताओं को समायोजित करने के लिए यूआई और वास्तविक सर्वलेट दोनों को बदला नहीं जा सकता है - यह पारदर्शी है। –

0

आप अनुरोध पैरामीटर में उन्हें जोड़ने की कोशिश करने के बजाय अनुरोध स्कोप विशेषताओं के रूप में चर क्यों स्टोर नहीं करते हैं?

+0

मैं इसे एक संपत्ति-फ़ाइल संचालित तंत्र के रूप में जोड़ रहा हूं जो नियमित अनुरोध को संशोधित करता है। इन आवश्यकताओं को समायोजित करने के लिए यूआई और वास्तविक सर्वलेट दोनों को बदला नहीं जा सकता है - यह पारदर्शी है। –

1

आप HttpServletRequest को नए HttpServletRequestWrapper ऑब्जेक्ट में लपेट सकते हैं और कुछ विधियों को ओवरराइट कर सकते हैं।

निम्नलिखित कोड http://www.ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/ से है।

फिल्टर में पैरामीटर जोड़ने के लिए:

public class MyFilter implements Filter { 
... 
@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    if (request instanceof HttpServletRequest) { 
     HttpServletRequest httprequest = (HttpServletRequest) request; 
     Map<String, String[]> extraParams = new HashMap<String, String[]>(); 
     extraParams.put("myparamname", String[] { "myparamvalue" }); 
     request = new WrappedRequestWithParameter(httprequest, extraParams); 
    } 
    chain.doFilter(request, response); 
} 
... 

class WrappedRequestWithParameter extends HttpServletRequestWrapper { 
    private final Map<String, String[]> modifiableParameters; 
    private Map<String, String[]> allParameters = null; 

    public WrappedRequestWithParameter(final HttpServletRequest request, final Map<String, String[]> additionalParams) { 
     super(request); 
     modifiableParameters = new TreeMap<String, String[]>(); 
     modifiableParameters.putAll(additionalParams); 
    } 

    @Override 
    public String getParameter(final String name) { 
     String[] strings = getParameterMap().get(name); 
     if (strings != null) { 
      return strings[0]; 
     } 
     return super.getParameter(name); 
    } 

    @Override 
    public Map<String, String[]> getParameterMap() { 
     if (allParameters == null) { 
      allParameters = new TreeMap<String, String[]>(); 
      allParameters.putAll(super.getParameterMap()); 
      allParameters.putAll(modifiableParameters); 
     } 
     // Return an unmodifiable collection because we need to uphold the interface contract. 
     return Collections.unmodifiableMap(allParameters); 
    } 

    @Override 
    public Enumeration<String> getParameterNames() { 
     return Collections.enumeration(getParameterMap().keySet()); 
    } 

    @Override 
    public String[] getParameterValues(final String name) { 
     return getParameterMap().get(name); 
    } 
} 
} 
संबंधित मुद्दे