2
2
.
.
1
1
.
.
7
7
H
H
T
T
T
T
P
P
R
R
e
e
q
q
u
u
e
e
s
s
t
t
P
P
a
a
r
r
a
a
m
m
e
e
t
t
e
e
r
r
s
s
-
-
E
E
d
d
i
i
t
t
I
I
n
n
f
f
o
o
[
[
G
G
]
]
This tutorial shows how to "virtually" change value of HTTP Request Parameter by
creating new Request (that extends HttpServletRequestWrapper)
overriding Methods (getParameterNames, getParameterValues)
to return our own parameter Map (with changed values)
In the Filter we will change the value of height HTTP Request Parameter from "1,67" to "1.67".
This way Controller will be able to automatically convert and load that value into PersonDTO Float Propery height.
Without this we would need to Deserialize from Request Parameters - Using Setters bloating PersonDTO.
Application Schema [Results]
Spring Boot Starters
GROUP
DEPENDENCY
DESCRIPTION
Web
Spring Web
Enables: Controller Annotations, Tomcat Server
MyFilter
http://localhost:8080/Hello?name=John
hello()
PersonDTO
MyController
P
P
r
r
o
o
c
c
e
e
d
d
u
u
r
r
e
e
Create Project: springboot_filter_requestparameters_edit (add Spring Boot Starters from the table)
Create Package: DTO (inside main package)
Create Class: PersonDTO.java (inside DTO package)
Create Package: controllers (inside main package)
Create Class: MyController.java (inside controllers package)
Create Package: filters (inside main package)
Create Class: MyHttpServletRequestWrapper.java (inside filters package)
Create Class: MyFilter.java (inside filters package)
PersonDTO.java
package com.ivornline.springboot_filter_addrequestparameters.DTO;
public class PersonDTO {
//PROPERTIES
public String name; //EXISTING REQUEST PARAMETER
public String age; //ADDED REQUEST PARAMETER
//SETTERS (Used for Deserialization)
public void setName(String name) { this.name = name; }
public void setAge (String age ) { this.age = age; }
}
MyController.java
package com.ivornline.springboot_filter_addrequestparameters.controllers;
import com.ivornline.springboot_filter_addrequestparameters.DTO.PersonDTO;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MyController {
@ResponseBody
@RequestMapping("/Hello")
public String hello(PersonDTO personDTO) {
return personDTO.name + " is " + personDTO.age + " years old";
}
}
MyHttpServletRequestWrapper.java
package com.ivornline.springboot_filter_addrequestparameters.filters;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
//PARAMETER MAP WITH ORIGINAL AND ADDITIONAL REQUEST PARAMETERS
Map<String, String[]> extendedParameterMap = new HashMap<>();
//===============================================================
// CONSTRUCTOR
//===============================================================
public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
//CREATE ADDITIONAL REQUEST PARAMETERS
String[] age = {"20"};
//ADD ADDITIONAL REQUEST PARAMETERS TO NEW MAP
extendedParameterMap.put("age", age);
//ADD EXISTING REQUEST PARAMETERS TO NEW MAP
extendedParameterMap.putAll(request.getParameterMap());
}
//===============================================================
// GET PARAMETER NAMES
//===============================================================
@Override
public Enumeration<String> getParameterNames() {
return Collections.enumeration(extendedParameterMap.keySet());
}
//===============================================================
// GET PARAMETER VALUES
//===============================================================
@Override
public String[] getParameterValues(String name) {
return extendedParameterMap.get(name);
}
}
MyFilter.java
package com.ivornline.springboot_filter_addrequestparameters.filters;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
@Component
public class MyFilter extends OncePerRequestFilter {
@Override
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
//CREATE REPLACEMENT REQUEST
HttpServletRequest myHttpServletRequestWrapper = new MyHttpServletRequestWrapper(request);
//FORWARD REPLACEMENT REQUEST (With additional Request Parameters)
chain.doFilter(myHttpServletRequestWrapper, response);
}
}