Per-Controller CORS Setup
Apply the @CrossOrigin annotation directly to a controller method or entire controller to enable cross-origin requests for specific endpoints:
@RestController
@RequestMapping("/system")
public class SystemInfoController {
@CrossOrigin
@GetMapping("/current-time")
public ServiceResponse fetchSystemTime() {
try {
List<SystemTimeDto> timeRecords = systemDataService.retrieveSystemTimeEntries();
return ServiceResponse.success()
.setData(timeRecords)
.setMessage("System time retrieved successfully");
} catch (Exception e) {
return ServiceResponse.failure()
.setMessage("Failed to fetch system time: " + e.getMessage());
}
}
}
Global CORS Configuration
Create a configuration class implementing WebMvcConfigurer to define cross-origin rules for all endpoints:
@Configuration
public class GlobalCorsConfiguration {
@Bean
public WebMvcConfigurer corsConfiguration() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry corsRegistry) {
corsRegistry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.exposedHeaders(HttpHeaders.SET_COOKIE)
.maxAge(3600);
}
};
}
}
For implementing IP whitelitsing via interceptors, refer to external resources: link1, link2
Apache Commons Lang3 Utility Libray Add the latest Maven dependency to your project:
<!-- Apache Commons Lang3 for Java utility classes -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
StringUtils: String Manipulation
// Truncate string and append ellipsis
StringUtils.abbreviate("helloWorld123", 8); // Returns "helloW..."
// Append suffix if missing (case-insensitive)
StringUtils.appendIfMissingIgnoreCase("HelloXYZ", "xyz"); // Returns "HelloXYZ"
// Convert first character case
StringUtils.capitalize("java"); // Returns "Java"
StringUtils.uncapitalize("Spring"); // Returns "spring"
// Center string within specified length
StringUtils.center("test", 8, "-"); // Returns "--test--"
// Remove line breaks
StringUtils.chomp("line1\r\nline2"); // Returns "line1"
// Check substring presence (case-insensitive)
StringUtils.containsIgnoreCase("Apache", "ache"); // Returns true
// Count substring occurrences
StringUtils.countMatches("abracadabra", "a"); // Returns 5
// Remove all whitespace
StringUtils.deleteWhitespace(" he llo "); // Returns "hello"
// Find differing part between two strings
StringUtils.difference("applePie", "appleCake"); // Returns "Cake"
// Check suffix/prefix matches
StringUtils.endsWith("document.pdf", ".pdf"); // Returns true
StringUtils.startsWithIgnoreCase("SpringBoot", "spring"); // Returns true
// Compare strings (case-insensitive)
StringUtils.equalsIgnoreCase("Hello", "HELLO"); // Returns true
// Get common prefix from string array
StringUtils.getCommonPrefix(new String[]{"springCore", "springBoot"}); // Returns "spring"
// Find nth occurrence index
StringUtils.ordinalIndexOf("aabbaabbaa", "ab", 2); // Returns 4
// Reverse string
StringUtils.reverse("banana"); // Returns "ananab"
// Split string with delimiter
StringUtils.split("a,b,c,d", ","); // Returns ["a", "b", "c", "d"]
RandomStringUtils: Random String Generation
// Generate 6-digit random numeric string
RandomStringUtils.randomNumeric(6);
// Generate random string from specified character set
RandomStringUtils.random(8, "abcdefghijklmnopqrstuvwxyz");
// Generate random alphabetic string
RandomStringUtils.random(5, true, false);
NumberUtils: Number Operations
// Find maximum value in integer array
NumberUtils.max(new int[]{5, 2, 9, 1}); // Returns 9
// Check if string is valid integer
NumberUtils.isDigits("12345"); // Returns true
// Check if string is valid number
NumberUtils.isNumber("123.45"); // Returns true
ArrayUtils: Array Handling
// Create string array
String[] fruitArray = ArrayUtils.toArray("apple", "banana", "cherry");
// Check array equality
ArrayUtils.isEquals(fruitArray, new String[]{"apple", "banana", "cherry"}); // Returns true
// Check if array contains element
ArrayUtils.contains(fruitArray, "banana"); // Returns true
// Convert 2D array to Map
Map<String, String> colorMap = ArrayUtils.toMap(new String[][]{\n {"RED", "#FF0000"},\n {"GREEN", "#00FF00"},\n {"BLUE", "#0000FF"}\n});
DateUtils: Date Manipulation
// Add 3 days to current date
DateUtils.addDays(new Date(), 3);
// Check if two dates are same day
DateUtils.isSameDay(new Date(), new Date()); // Returns true
// Parse string to Date
DateUtils.parseDate("2024-05-20", new String[]{"yyyy-MM-dd"});
ExtendedStringUtils: Custom String Utility Class
package com.example.util;
import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
public class ExtendedStringUtils extends StringUtils {
private static final char SEPARATOR = '_';
private static final String CHARSET = "UTF-8";
public static byte[] toBytes(String input) {
if (input == null) return null;
try {
return input.getBytes(CHARSET);
} catch (UnsupportedEncodingException e) {
return new byte[0];
}
}
public static String fromBytes(byte[] bytes) {
if (bytes == null) return EMPTY;
try {
return new String(bytes, CHARSET);
} catch (UnsupportedEncodingException e) {
return EMPTY;
}
}
public static boolean isInList(String input, String... candidates) {
if (input == null) return false;
for (String candidate : candidates) {
if (input.equals(trim(candidate))) return true;
}
return false;
}
public static String stripHtmlTags(String htmlContent) {
if (isBlank(htmlContent)) return EMPTY;
Pattern pattern = Pattern.compile("<.+?>");
Matcher matcher = pattern.matcher(htmlContent);
return matcher.replaceAll(EMPTY);
}
public static String convertToCamelCase(String input) {
if (input == null) return null;
input = input.toLowerCase();
StringBuilder result = new StringBuilder(input.length());
boolean capitalizeNext = false;
for (char c : input.toCharArray()) {
if (c == SEPARATOR) {
capitalizeNext = true;
} else if (capitalizeNext) {
result.append(Character.toUpperCase(c));
capitalizeNext = false;
} else {
result.append(c);
}
}
return result.toString();
}
public static String convertToUnderscoreCase(String input) {
if (input == null) return null;
StringBuilder result = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (i > 0 && Character.isUpperCase(c)) {
result.append(SEPARATOR);
}
result.append(Character.toLowerCase(c));
}
return result.toString();
}
public static String getClientIpAddress(HttpServletRequest request) {
String ip = request.getHeader("X-Real-IP");
if (isNotBlank(ip)) ip = request.getHeader("X-Forwarded-For");
if (isNotBlank(ip)) ip = request.getHeader("Proxy-Client-IP");
if (isNotBlank(ip)) ip = request.getHeader("WL-Proxy-Client-IP");
return (ip != null) ? ip : request.getRemoteAddr();
}
}
Spring Boot Custom Startup Banner Spring Boot displays a default ASCII banner on startup. You can customize or disable this behavior using the following methods:
Customize Banner
Create a banner.txt file in the src/main/resources directory. Use tools like patorjk.com/software/taag to generaet ASCII art, then paste it into the file. Spring Boot will automatically use this custom banner on startup.
Disable Banner
- Via Main Method:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}
}
- Via Configuration File:
Add this line to
application.properties:
spring.main.banner-mode=off
- Via Empty File: Creating an empty
banner.txtinsrc/main/resourceswill also suppress the default banner.
Banner Display Modes
The Banner.Mode enum controls where the banner is displayed:
OFF: Disable all banner outputCONSOLE: Print banner to system console (default)LOG: Print banner to application log file
enum Mode {
/** Disable banner display entirely */
OFF,
/** Print banner to system console */
CONSOLE,
/** Print banner to application log */
LOG
}