Skip to content

Commit e94fe4a

Browse files
authored
Merge pull request eugenp#8046 from sumit-bhawsar/BAEL-3335
Bael 3335
2 parents dbcf7a1 + 6445d09 commit e94fe4a

13 files changed

+515
-1
lines changed

spring-core-2/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ This module contains articles about core Spring functionality
1616
- [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations)
1717
- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class)
1818
- [Guide to the Spring BeanFactory](https://www.baeldung.com/spring-beanfactory)
19-
- More articles: [[<-- prev]](/spring-core)
19+
- [Read HttpServletRequest Multiple Times](https://www.baeldung.com/spring-reading-httpservletrequest-multiple-times)
20+
- More articles: [[<-- prev]](/spring-core)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.baeldung.cachedrequest;
2+
3+
import java.io.BufferedReader;
4+
import java.io.ByteArrayInputStream;
5+
import java.io.IOException;
6+
import java.io.InputStream;
7+
import java.io.InputStreamReader;
8+
9+
import javax.servlet.ServletInputStream;
10+
import javax.servlet.http.HttpServletRequest;
11+
import javax.servlet.http.HttpServletRequestWrapper;
12+
13+
import org.springframework.util.StreamUtils;
14+
15+
public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
16+
17+
private byte[] cachedBody;
18+
19+
public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
20+
super(request);
21+
InputStream requestInputStream = request.getInputStream();
22+
this.cachedBody = StreamUtils.copyToByteArray(requestInputStream);
23+
}
24+
25+
@Override
26+
public ServletInputStream getInputStream() throws IOException {
27+
return new CachedBodyServletInputStream(this.cachedBody);
28+
}
29+
30+
@Override
31+
public BufferedReader getReader() throws IOException {
32+
// Create a reader from cachedContent
33+
// and return it
34+
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.cachedBody);
35+
return new BufferedReader(new InputStreamReader(byteArrayInputStream));
36+
}
37+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.baeldung.cachedrequest;
2+
3+
import java.io.ByteArrayInputStream;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
7+
import javax.servlet.ReadListener;
8+
import javax.servlet.ServletInputStream;
9+
10+
public class CachedBodyServletInputStream extends ServletInputStream {
11+
12+
private InputStream cachedBodyInputStream;
13+
14+
public CachedBodyServletInputStream(byte[] cachedBody) {
15+
this.cachedBodyInputStream = new ByteArrayInputStream(cachedBody);
16+
}
17+
18+
@Override
19+
public boolean isFinished() {
20+
try {
21+
return cachedBodyInputStream.available() == 0;
22+
} catch (IOException e) {
23+
// TODO Auto-generated catch block
24+
e.printStackTrace();
25+
}
26+
return false;
27+
}
28+
29+
@Override
30+
public boolean isReady() {
31+
return true;
32+
}
33+
34+
@Override
35+
public void setReadListener(ReadListener readListener) {
36+
throw new UnsupportedOperationException();
37+
}
38+
39+
@Override
40+
public int read() throws IOException {
41+
return cachedBodyInputStream.read();
42+
}
43+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.baeldung.cachedrequest;
2+
3+
import java.io.IOException;
4+
5+
import javax.servlet.FilterChain;
6+
import javax.servlet.ServletException;
7+
import javax.servlet.annotation.WebFilter;
8+
import javax.servlet.http.HttpServletRequest;
9+
import javax.servlet.http.HttpServletResponse;
10+
11+
import org.springframework.core.Ordered;
12+
import org.springframework.core.annotation.Order;
13+
import org.springframework.stereotype.Component;
14+
import org.springframework.web.filter.OncePerRequestFilter;
15+
16+
@Order(value = Ordered.HIGHEST_PRECEDENCE)
17+
@Component
18+
@WebFilter(filterName = "ContentCachingFilter", urlPatterns = "/*")
19+
public class ContentCachingFilter extends OncePerRequestFilter {
20+
21+
@Override
22+
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
23+
System.out.println("IN ContentCachingFilter ");
24+
CachedBodyHttpServletRequest cachedBodyHttpServletRequest = new CachedBodyHttpServletRequest(httpServletRequest);
25+
filterChain.doFilter(cachedBodyHttpServletRequest, httpServletResponse);
26+
}
27+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.baeldung.cachedrequest;
2+
3+
import org.springframework.context.annotation.ComponentScan;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
6+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
7+
/**
8+
* To initialize the WebApplication, Please see
9+
* {@link org.baeldung.spring.config.MainWebAppInitializer}
10+
*/
11+
12+
@EnableWebMvc
13+
@Configuration
14+
@ComponentScan(basePackages = "org.baeldung.cachedrequest")
15+
public class HttpRequestDemoConfig implements WebMvcConfigurer {
16+
17+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.baeldung.cachedrequest;
2+
3+
public class Person {
4+
private String firstName;
5+
6+
private String lastName;
7+
8+
private int age;
9+
10+
public Person() {
11+
}
12+
13+
public Person(String firstName, String lastName, int age) {
14+
this.firstName = firstName;
15+
this.lastName = lastName;
16+
this.age = age;
17+
}
18+
19+
public String getFirstName() {
20+
return firstName;
21+
}
22+
23+
public void setFirstName(String firstName) {
24+
this.firstName = firstName;
25+
}
26+
27+
public String getLastName() {
28+
return lastName;
29+
}
30+
31+
public void setLastName(String lastName) {
32+
this.lastName = lastName;
33+
}
34+
35+
public int getAge() {
36+
return age;
37+
}
38+
39+
public void setAge(int age) {
40+
this.age = age;
41+
}
42+
43+
@Override
44+
public String toString() {
45+
return "Person{" + "firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", age=" + age + '}';
46+
}
47+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.baeldung.cachedrequest;
2+
3+
import org.springframework.http.HttpStatus;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.PostMapping;
6+
import org.springframework.web.bind.annotation.RequestBody;
7+
import org.springframework.web.bind.annotation.ResponseStatus;
8+
import org.springframework.web.bind.annotation.RestController;
9+
10+
@RestController
11+
public class PersonController {
12+
13+
@PostMapping(value = "/person")
14+
@ResponseStatus(value = HttpStatus.NO_CONTENT)
15+
public void printPerson(@RequestBody Person person) {
16+
17+
System.out.println("In Demo Controller. Person " + "is : " + person);
18+
}
19+
20+
@GetMapping(value = "/person")
21+
@ResponseStatus(value = HttpStatus.NO_CONTENT)
22+
public void getPerson() {
23+
24+
System.out.println("In Demo Controller get method.");
25+
}
26+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.baeldung.cachedrequest;
2+
3+
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
7+
import javax.servlet.FilterChain;
8+
import javax.servlet.ServletException;
9+
import javax.servlet.annotation.WebFilter;
10+
import javax.servlet.http.HttpServletRequest;
11+
import javax.servlet.http.HttpServletResponse;
12+
13+
import org.springframework.core.Ordered;
14+
import org.springframework.core.annotation.Order;
15+
import org.springframework.stereotype.Component;
16+
import org.springframework.util.StreamUtils;
17+
import org.springframework.web.filter.OncePerRequestFilter;
18+
19+
@Order(Ordered.LOWEST_PRECEDENCE)
20+
@Component
21+
@WebFilter(filterName = "printRequestContentFilter", urlPatterns = "/*")
22+
public class PrintRequestContentFilter extends OncePerRequestFilter {
23+
@Override
24+
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
25+
System.out.println("IN PrintRequestContentFilter ");
26+
InputStream inputStream = httpServletRequest.getInputStream();
27+
byte[] body = StreamUtils.copyToByteArray(inputStream);
28+
System.out.println("In PrintRequestContentFilter. Request body is: " + new String(body));
29+
filterChain.doFilter(httpServletRequest, httpServletResponse);
30+
}
31+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.baeldung.cachedrequest;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
7+
import org.junit.After;
8+
import org.junit.Test;
9+
import org.junit.runner.RunWith;
10+
import org.mockito.junit.MockitoJUnitRunner;
11+
import org.springframework.mock.web.MockHttpServletRequest;
12+
import org.springframework.util.StreamUtils;
13+
14+
import junit.framework.TestCase;
15+
16+
@RunWith(MockitoJUnitRunner.class)
17+
public class CachedBodyHttpServletRequestUnitTest extends TestCase {
18+
19+
private CachedBodyServletInputStream servletInputStream;
20+
21+
@After
22+
public void cleanUp() throws IOException {
23+
if (null != servletInputStream) {
24+
servletInputStream.close();
25+
}
26+
}
27+
28+
@Test
29+
public void testGivenHttpServletRequestWithBody_whenCalledGetInputStream_ThenGetsServletInputStreamWithSameBody() throws IOException {
30+
// Given
31+
byte[] cachedBody = "{\"firstName\" :\"abc\",\"lastName\" : \"xyz\",\"age\" : 30\"}".getBytes();
32+
MockHttpServletRequest mockeddHttpServletRequest = new MockHttpServletRequest();
33+
mockeddHttpServletRequest.setContent(cachedBody);
34+
CachedBodyHttpServletRequest request = new CachedBodyHttpServletRequest(mockeddHttpServletRequest);
35+
36+
// when
37+
InputStream inputStream = request.getInputStream();
38+
39+
// then
40+
assertEquals(new String(cachedBody), new String(StreamUtils.copyToByteArray(inputStream)));
41+
}
42+
43+
@Test
44+
public void testGivenHttpServletRequestWithBody_whenCalledGetReader_ThenGetBufferedReaderWithSameBody() throws IOException {
45+
// Given
46+
byte[] cachedBody = "{\"firstName\" :\"abc\",\"lastName\" : \"xyz\",\"age\" : 30\"}".getBytes();
47+
MockHttpServletRequest mockeddHttpServletRequest = new MockHttpServletRequest();
48+
mockeddHttpServletRequest.setContent(cachedBody);
49+
CachedBodyHttpServletRequest request = new CachedBodyHttpServletRequest(mockeddHttpServletRequest);
50+
51+
// when
52+
BufferedReader bufferedReader = request.getReader();
53+
54+
// then
55+
String line = "";
56+
StringBuilder builder = new StringBuilder();
57+
while ((line = bufferedReader.readLine()) != null) {
58+
builder.append(line);
59+
}
60+
assertEquals(new String(cachedBody), builder.toString());
61+
}
62+
}

0 commit comments

Comments
 (0)