2

I am trying the read the request attributes and change them using Filter, so that in Controller I would receive changed values as per my need. but the changes I did in Filter is not reflected in @RequestParam.

My controller:

public Response getDetails(HttpServletRequest req, @RequestParam(required = false) String userId) {
        System.out.println("attrib in request:"+req.getParameter("userId"));
       System.out.println("attrib in RequestParam:"+userId);
}

My Filter:

@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        try {
            System.out.println("inside filter---------------------------");
            HtmlRequestWrapper req = new HtmlRequestWrapper(request);           
            chain.doFilter(req, response);  
        } catch (Exception ex) {
            request.setAttribute("errorMessage", ex);
            // request.getRequestDispatcher("/WEB-INF/views/jsp/error.jsp").forward(request,
            // response);
        }
    }

My HttpServletRequestWrapper(HtmlRequestWrapper):

public class HtmlRequestWrapper extends HttpServletRequestWrapper {

    public HtmlRequestWrapper(ServletRequest request) {
        super((HttpServletRequest) request);
    }

    public String sanitize(String input) {
        String result = "";
        result = input + "bla bla";
        return result;
    }

    public String getParameter(String paramName) {
        String value = super.getParameter(paramName);
        value = sanitize(value);
        return value;
    }

    public String[] getParameterValues() {
        String values[] = null;
        // String values[] = request.getParameterValues(paramName);
        for (Enumeration<String> en = super.getParameterNames(); en.hasMoreElements();) {
            String paramName = (String) en.nextElement();
            values = super.getParameterValues(paramName);
            int n = values.length;
            for (int i = 0; i < n; i++) {
                System.out.println("param val before: " + values[i]);
                values[i] = sanitize(values[i]);
                System.out.println("param val after: " + values[i]);
            }
        }
        return values;
    }

    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> paramMap = new HashMap<>();
        String values[] = null;
        for (Enumeration<String> en = super.getParameterNames(); en.hasMoreElements();) {
            String paramName = (String) en.nextElement();
            values = super.getParameterValues(paramName);
            int n = values.length;
            for (int i = 0; i < n; i++) {
                System.out.println("param val before in map: " + values[i]);
                values[i] = sanitize(values[i]);
                System.out.println("param val after  in map: " + values[i]);
            }
            paramMap.put(paramName, values);
            this.getRequest().setAttribute(paramName, values);
        }
        return Collections.unmodifiableMap(paramMap);
    }
}

as you can see i am just trying to append some text to the attribute values.In real scenario would be cleaning and appending with some logic.

Note: In my controller I get the changed value in req.getParameter("userId") but @RequestParam(required = false) String userId contains the same old values passed down from the actual request.

I want @RequestParam(required = false) String userId to reflect the changes in req.getParameter("userId").

updating(Adding WebConfig class):

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new ServiceInterceptor());
}
@Bean
public Filter htmlFilter() {
    return new HtmlFilter();
}
M. Deinum
  • 115,695
  • 22
  • 220
  • 224
Lord
  • 23
  • 4
  • try to debug and see that filter is executed, my educated guess is that filter is not added to filter-chain. Also, add configuration to decription – Andrii Plotnikov Apr 27 '17 at 10:10
  • filter works, and it changes the request, when i do request.getParameter i get the changed value, but inside my controller those changes are not reflected by @RequestParam – Lord Apr 28 '17 at 08:49
  • hm. this inconsistent behaviour looks like bug to me, so the solution might to put this on the ticket for spring team. – Andrii Plotnikov Apr 28 '17 at 09:01

0 Answers0