Use of servlet wrapper classes

Use of servlet wrapper classes

Servlet wrapper classes in Java are used to customize the behavior of request and response objects. The HttpServletRequestWrapper and HttpServletResponseWrapper are the two main wrapper classes provided by the Servlet API. These classes allow developers to extend the functionality of the request and response objects without modifying the original objects directly.

Common Uses of Servlet Wrapper Classes:

  • Modifying Request Parameters : Wrapper classes can be used to add, remove, or modify request parameters before they are processed by the servlet.
  • Filtering Content : Response wrappers can be used to filter or modify the content before it is sent to the client. This is useful for tasks like compressing response data, modifying headers, or logging responses.
  • Adding Additional Functionality: Wrapper classes can be used to add additional methods or functionality to the request or response objects.
  • Security Enhancements: Wrappers can help implement security features like input validation, request filtering, or response sanitization.

servlet wrapper

Here is an example demonstrating the use of HttpServletRequestWrapper and HttpServletResponseWrapper:

Request Wrapper Implementation :
    java
    package com.example;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.util.HashMap;
    import java.util.Map;

    public class CustomRequestWrapper extends HttpServletRequestWrapper {
        private final Map<String, String[]> customParams;

        public CustomRequestWrapper(HttpServletRequest request) {
            super(request);
            customParams = new HashMap<>(request.getParameterMap());
        }

        public void addParameter(String name, String value) {
            customParams.put(name, new String[] { value });
        }

        @Override
        public String getParameter(String name) {
            String[] values = customParams.get(name);
            if (values == null || values.length == 0) {
                return null;
            }
            return values[0];
        }

        @Override
        public Map<String, String[]> getParameterMap() {
            return customParams;
        }

        @Override
        public String[] getParameterValues(String name) {
            return customParams.get(name);
        }
    }

Response Wrapper Implementation :
    java
    package com.example;

    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    import java.io.CharArrayWriter;
    import java.io.PrintWriter;
    import java.io.IOException;

    public class CustomResponseWrapper extends HttpServletResponseWrapper {
        private final CharArrayWriter charArrayWriter;

        public CustomResponseWrapper(HttpServletResponse response) {
            super(response);
            charArrayWriter = new CharArrayWriter();
        }

        @Override
        public PrintWriter getWriter() throws IOException {
            return new PrintWriter(charArrayWriter);
        }

        public String getOutput() {
            return charArrayWriter.toString();
        }
    }

Servlet Using Wrappers :
    java
    package com.example;

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;

    @WebServlet("/testWrapper")
    public class TestWrapperServlet extends HttpServlet {

        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            CustomRequestWrapper requestWrapper = new CustomRequestWrapper(request);
            requestWrapper.addParameter("newParam", "newValue");

            CustomResponseWrapper responseWrapper = new CustomResponseWrapper(response);
            responseWrapper.getWriter().println("Original Response Content");

            String modifiedContent = responseWrapper.getOutput().replace("Original", "Modified");
            response.getWriter().write(modifiedContent);
        }
    }
   

Detailed Servlet Wrapper

CustomRequestWrapper

   This class extends HttpServletRequestWrapper to add custom parameters to the request. It overrides methods like getParameter, getParameterMap, and getParameterValues to return the modified parameters.

CustomResponseWrapper

   This class extends HttpServletResponseWrapper to capture and modify the response content. It uses a CharArrayWriter to store the response content and provides a method getOutput to retrieve the content as a string.

TestWrapperServlet

   This servlet demonstrates the use of both wrappers. It modifies the request by adding a new parameter and changes the response content before sending it to the client.

Homepage

Readmore