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();
}