Skip to content

Commit d7cde22

Browse files
committed
Adding spring-web-url
1 parent 12c5053 commit d7cde22

17 files changed

Lines changed: 535 additions & 3 deletions

File tree

spring-web-modules/spring-mvc-basics-3/README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@ This module contains articles about Spring MVC
77
- [A Custom Data Binder in Spring MVC](https://www.baeldung.com/spring-mvc-custom-data-binder)
88
- [Validating Lists in a Spring Controller](https://www.baeldung.com/spring-validate-list-controller)
99
- [Spring Validation Message Interpolation](https://www.baeldung.com/spring-validation-message-interpolation)
10-
- [Using a Slash Character in Spring URLs](https://www.baeldung.com/spring-slash-character-in-url)
1110
- [Using Enums as Request Parameters in Spring](https://www.baeldung.com/spring-enum-request-param)
12-
- [Excluding URLs for a Filter in a Spring Web Application](https://www.baeldung.com/spring-exclude-filter)
1311
- [Guide to Flash Attributes in a Spring Web Application](https://www.baeldung.com/spring-web-flash-attributes)
14-
- [Handling URL Encoded Form Data in Spring REST](https://www.baeldung.com/spring-url-encoded-form-data)
1512
- [Reading HttpServletRequest Multiple Times in Spring](https://www.baeldung.com/spring-reading-httpservletrequest-multiple-times)
1613
- More articles: [[<-- prev]](/spring-mvc-basics-2)[[more -->]](/spring-mvc-basics-4)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
## Spring Web URL
2+
3+
This module contains articles about Spring MVC
4+
5+
## Relevant articles:
6+
- [Using a Slash Character in Spring URLs](https://www.baeldung.com/spring-slash-character-in-url)
7+
- [Excluding URLs for a Filter in a Spring Web Application](https://www.baeldung.com/spring-exclude-filter)
8+
- [Handling URL Encoded Form Data in Spring REST](https://www.baeldung.com/spring-url-encoded-form-data)
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<artifactId>spring-web-url</artifactId>
7+
<name>spring-web-url</name>
8+
<packaging>war</packaging>
9+
<description>Demo project for Spring Boot</description>
10+
11+
<parent>
12+
<groupId>com.baeldung</groupId>
13+
<artifactId>parent-boot-2</artifactId>
14+
<version>0.0.1-SNAPSHOT</version>
15+
<relativePath>../../parent-boot-2</relativePath>
16+
</parent>
17+
18+
<dependencies>
19+
<dependency>
20+
<groupId>org.springframework.boot</groupId>
21+
<artifactId>spring-boot-starter-web</artifactId>
22+
</dependency>
23+
<dependency>
24+
<groupId>org.springframework.boot</groupId>
25+
<artifactId>spring-boot-starter-validation</artifactId>
26+
</dependency>
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-starter-test</artifactId>
30+
<scope>test</scope>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.springframework.boot</groupId>
34+
<artifactId>spring-boot-starter-thymeleaf</artifactId>
35+
<scope>provided</scope>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.springframework.boot</groupId>
39+
<artifactId>spring-boot-starter-data-jpa</artifactId>
40+
</dependency>
41+
<dependency>
42+
<groupId>org.springframework.boot</groupId>
43+
<artifactId>spring-boot-starter-mail</artifactId>
44+
</dependency>
45+
<dependency>
46+
<groupId>org.springframework.boot</groupId>
47+
<artifactId>spring-boot-starter-actuator</artifactId>
48+
</dependency>
49+
<dependency>
50+
<groupId>com.h2database</groupId>
51+
<artifactId>h2</artifactId>
52+
<scope>runtime</scope>
53+
</dependency>
54+
<dependency>
55+
<groupId>javax.persistence</groupId>
56+
<artifactId>javax.persistence-api</artifactId>
57+
<version>${jpa.version}</version>
58+
</dependency>
59+
<dependency>
60+
<groupId>com.google.guava</groupId>
61+
<artifactId>guava</artifactId>
62+
<version>${guava.version}</version>
63+
</dependency>
64+
<dependency>
65+
<groupId>org.subethamail</groupId>
66+
<artifactId>subethasmtp</artifactId>
67+
<version>${subethasmtp.version}</version>
68+
<scope>test</scope>
69+
</dependency>
70+
<dependency>
71+
<groupId>org.apache.httpcomponents</groupId>
72+
<artifactId>httpclient</artifactId>
73+
<version>${httpclient.version}</version>
74+
</dependency>
75+
</dependencies>
76+
77+
<build>
78+
<finalName>${project.artifactId}</finalName>
79+
<resources>
80+
<resource>
81+
<directory>src/main/resources</directory>
82+
<filtering>true</filtering>
83+
<excludes>
84+
<exclude>**/conf.properties</exclude>
85+
</excludes>
86+
</resource>
87+
</resources>
88+
</build>
89+
90+
<profiles>
91+
<profile>
92+
<id>autoconfiguration</id>
93+
<build>
94+
<plugins>
95+
<plugin>
96+
<groupId>org.apache.maven.plugins</groupId>
97+
<artifactId>maven-surefire-plugin</artifactId>
98+
<executions>
99+
<execution>
100+
<phase>integration-test</phase>
101+
<goals>
102+
<goal>test</goal>
103+
</goals>
104+
<configuration>
105+
<excludes>
106+
<exclude>**/*LiveTest.java</exclude>
107+
<exclude>**/*IntegrationTest.java</exclude>
108+
<exclude>**/*IntTest.java</exclude>
109+
</excludes>
110+
<includes>
111+
<include>**/AutoconfigurationTest.java</include>
112+
</includes>
113+
</configuration>
114+
</execution>
115+
</executions>
116+
<configuration>
117+
<systemPropertyVariables>
118+
<test.mime>json</test.mime>
119+
</systemPropertyVariables>
120+
</configuration>
121+
</plugin>
122+
</plugins>
123+
</build>
124+
</profile>
125+
</profiles>
126+
127+
<properties>
128+
<!-- The main class to start by executing java -jar -->
129+
<start-class>com.baeldung.exclude_urls_filter.Application</start-class>
130+
<jquery.version>3.1.1</jquery.version>
131+
<bootstrap.version>3.3.7-1</bootstrap.version>
132+
<jpa.version>2.2</jpa.version>
133+
<guava.version>18.0</guava.version>
134+
<subethasmtp.version>3.1.7</subethasmtp.version>
135+
<httpclient.version>4.5.8</httpclient.version>
136+
</properties>
137+
138+
</project>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.exclude_urls_filter;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.context.annotation.ComponentScan;
6+
import org.springframework.context.annotation.Configuration;
7+
8+
@ComponentScan(basePackages = "com.baeldung.exclude_urls_filter")
9+
@Configuration
10+
@SpringBootApplication
11+
public class Application {
12+
13+
public static void main(String[] args) {
14+
SpringApplication.run(Application.class, args);
15+
}
16+
17+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.baeldung.exclude_urls_filter.controller;
2+
3+
import com.baeldung.exclude_urls_filter.service.FAQService;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.http.HttpStatus;
6+
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RequestMethod;
9+
import org.springframework.web.bind.annotation.RestController;
10+
11+
@RestController
12+
public class FAQController {
13+
14+
private final FAQService faqService;
15+
16+
@Autowired
17+
public FAQController(FAQService faqService) {
18+
this.faqService = faqService;
19+
}
20+
21+
@RequestMapping(value = "/faq/helpline", method = RequestMethod.GET)
22+
public ResponseEntity<String> getHelpLineNumber() {
23+
String helplineNumber = faqService.getHelpLineNumber();
24+
if (helplineNumber != null) {
25+
return new ResponseEntity<String>(helplineNumber, HttpStatus.OK);
26+
} else {
27+
return new ResponseEntity<String>("Unavailable", HttpStatus.NOT_FOUND);
28+
}
29+
}
30+
31+
32+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.baeldung.exclude_urls_filter.controller;
2+
3+
import org.springframework.http.HttpStatus;
4+
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RequestMethod;
7+
import org.springframework.web.bind.annotation.RestController;
8+
9+
@RestController
10+
public class Ping {
11+
12+
@RequestMapping(value = "/health", method = RequestMethod.GET)
13+
public ResponseEntity<String> pingGet() {
14+
return new ResponseEntity<String>("pong", HttpStatus.OK);
15+
}
16+
17+
@RequestMapping(value = "/health", method = RequestMethod.POST)
18+
public ResponseEntity<String> pingPost() {
19+
return new ResponseEntity<String>("pong", HttpStatus.OK);
20+
}
21+
22+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.exclude_urls_filter.filter;
2+
3+
import org.springframework.boot.web.servlet.FilterRegistrationBean;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
@Configuration
8+
public class FilterRegistrationConfig {
9+
10+
@Bean
11+
public FilterRegistrationBean<LogFilter> logFilter() {
12+
FilterRegistrationBean<LogFilter> registrationBean = new FilterRegistrationBean<>();
13+
registrationBean.setFilter(new LogFilter());
14+
registrationBean.addUrlPatterns("/health", "/faq/*");
15+
return registrationBean;
16+
}
17+
18+
19+
@Bean
20+
public FilterRegistrationBean<HeaderValidatorFilter> headerValidatorFilter() {
21+
FilterRegistrationBean<HeaderValidatorFilter> registrationBean = new FilterRegistrationBean<>();
22+
registrationBean.setFilter(new HeaderValidatorFilter());
23+
registrationBean.addUrlPatterns("*");
24+
return registrationBean;
25+
}
26+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.baeldung.exclude_urls_filter.filter;
2+
3+
import org.springframework.core.annotation.Order;
4+
import org.springframework.http.HttpStatus;
5+
import org.springframework.web.filter.OncePerRequestFilter;
6+
7+
import javax.servlet.*;
8+
import javax.servlet.http.HttpServletRequest;
9+
import javax.servlet.http.HttpServletResponse;
10+
import java.io.IOException;
11+
12+
@Order(1)
13+
public class HeaderValidatorFilter extends OncePerRequestFilter {
14+
@Override
15+
protected void doFilterInternal(HttpServletRequest request,
16+
HttpServletResponse response,
17+
FilterChain filterChain)
18+
throws ServletException,
19+
IOException {
20+
String countryCode = request.getHeader("X-Country-Code");
21+
if (!"US".equals(countryCode)) {
22+
response.sendError(HttpStatus.BAD_REQUEST.value(), "Invalid Locale");
23+
return;
24+
}
25+
filterChain.doFilter(request, response);
26+
}
27+
28+
@Override
29+
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
30+
String path = request.getRequestURI();
31+
return "/health".equals(path);
32+
}
33+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.baeldung.exclude_urls_filter.filter;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.core.annotation.Order;
6+
import org.springframework.web.filter.OncePerRequestFilter;
7+
8+
import javax.servlet.*;
9+
import javax.servlet.http.HttpServletRequest;
10+
import javax.servlet.http.HttpServletResponse;
11+
import java.io.IOException;
12+
13+
@Order(1)
14+
public class LogFilter extends OncePerRequestFilter {
15+
private final Logger logger = LoggerFactory.getLogger(LogFilter.class);
16+
17+
@Override
18+
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
19+
FilterChain filterChain) throws ServletException, IOException {
20+
String path = request.getRequestURI();
21+
String contentType = request.getContentType();
22+
logger.info("Request URL path : {}, Request content type: {}", path, contentType);
23+
filterChain.doFilter(request, response);
24+
}
25+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.baeldung.exclude_urls_filter.service;
2+
3+
public interface FAQService {
4+
String getHelpLineNumber();
5+
}

0 commit comments

Comments
 (0)