2
2
.
.
1
1
.
.
6
6
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
-
-
A
A
d
d
d
d
I
I
n
n
f
f
o
o
[
[
G
G
]
]
This tutorial shows how to "virtually" add HTTP Request Parameters by
creating new Request (that extends HttpServletRequestWrapper)
overriding Methods that return HTTP Request Parameters (getParameterNames, getParameterValues)
Then we will load HTTP Request Parameters into PersonDTO Properties to cnfirm that they are visible to Controller.
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_addrequestparameters (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);
}
}
R
R
e
e
s
s
u
u
l
l
t
t
s
s
http://localhost:8080/Hello?name=John (Filter adds age Parameter)
Application Structure
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>