Код: Выделить всё
May 17 20:14:16 ip-IP.us-east-2.compute.internal java[2209]: 2025-05-17T20:14:16.996Z ERROR 2209 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Filter execution threw an exception] with root cause
May 17 20:14:16 ip-IP.us-east-2.compute.internal java[2209]: java.lang.StackOverflowError: null
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.core.BridgeMethodResolver.findBridgedMethod(BridgeMethodResolver.java:71) ~[spring-core-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:356) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:216) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at jdk.proxy2/jdk.proxy2.$Proxy167.authenticate(Unknown Source) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:216) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at jdk.proxy2/jdk.proxy2.$Proxy167.authenticate(Unknown Source) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:216) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at jdk.proxy2/jdk.proxy2.$Proxy167.authenticate(Unknown Source) ~[na:na]
// Create and configure cookie for access token
Cookie jwtCookie = new Cookie("auth-token", accessToken);
jwtCookie.setHttpOnly(true);
System.out.println("SECURE COOKIES: " + useSecureCookies);
jwtCookie.setSecure(useSecureCookies); // Change to true in production
jwtCookie.setPath("/");
// Set domain conditionally
if (Objects.equals(frontendUrl, "mydomain.com")) {
jwtCookie.setDomain(".mydomain.com");
System.out.println("TO DOMAIN: " + jwtCookie.getDomain());
}
// Add cookie to response
// String cookieValue = String.format("jwt=%s; Path=/; Max-Age=3600; HttpOnly; Secure; SameSite=None", accessToken);
// response.addHeader("Set-Cookie", cookieValue);
// THIS is the actual thing that adds cookies to the frontend client
response.addCookie(jwtCookie);
// Create and configure cookie for refresh token as well
Cookie refreshCookie = new Cookie("refresh-token", refreshToken);
refreshCookie.setHttpOnly(true);
refreshCookie.setSecure(useSecureCookies); // Change to true in production
refreshCookie.setPath("/");
if (Objects.equals(frontendUrl, "mydomain.com")) {
refreshCookie.setDomain(".mydomain.com");
System.out.println("TO DOMAIN: " + jwtCookie.getDomain());
}
// Conditionally set age based on if user entered "rememberMe" or not
if (request.getRememberMe()) {
refreshCookie.setMaxAge((int) Duration.ofDays(30).toSeconds());
System.out.println("REMEMBERME: " + request.getRememberMe());
System.out.println("MAXAGE: 30 DAYS");
}
else {
refreshCookie.setMaxAge(-1);
System.out.println("REMEMBERME: " + request.getRememberMe());
System.out.println("MAXAGE: UNTIL END OF SESSION");
}
// Add refresh cookie to response
// String refreshValue = String.format("refresh=%s; Path=/auth; Max-Age=2592000; HttpOnly; Secure; SameSite=None", refreshToken);
// response.addHeader("Set-Cookie", refreshValue); // 30 days
// THIS is the actual thing that adds cookies to the frontend client
response.addCookie(refreshCookie)
< /code>
Здесь также является кодом контроллера, который вызывает этот метод службы < /p>
@PostMapping("/login")
public ResponseEntity login(
@RequestBody LoginRequest loginRequest,
HttpServletResponse response
) {
try {
return loginService.authenticate(loginRequest, response);
} catch (RuntimeException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Unexpected error");
}
}
< /code>
httpstatus.internal_server_error, кстати, никогда не возвращается. Даже если ISE 500 выброшен из SOE, эта строка никогда не возвращается в запрос API, только огромный кусок текста из SOE напрямую.May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: Verifying credentials
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: SECURE COOKIES: true
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: TO DOMAIN: .mydomain.com
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: java.lang.IllegalArgumentException: An invalid domain [.mydomain.com] was specified for this cookie
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:253)
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:147)
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: at org.apache.catalina.connector.Response.generateCookieString(Response.java:881)
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: at org.apache.catalina.connector.Response.addCookie(Response.java:837)
< /code>
Интересно, что я заметил, что в производстве ошибка SOE все еще может возникнуть, но обычно уходит после небольшого или нескольких запросов, в то время как в Intellij на моей настройке разработчика она остается и буду там каждый раз, когда я запускаю программу, независимо от того, изменяю ли я вещи, инвалидирую кэши или перезапуску Intellij. И просто чтобы уточнить, эта проблема вообще не влияет на запуск программы. Это всегда работает совершенно нормально, если ничто другое не так, как в Dev, так и в Prod. Это только любой запрос, представленный в приложение, которое вызывает ошибку 500 и огромный код ответа. И да, я могу подтвердить, что код одинаково от перезапуска до перезапуска, но сборка и запуск банки и запросы все идут гладко после перезапуска, по крайней мере, до тех пор, пока ошибка снова не запустится. Затем, как я уже говорил, это как бы поправится в Prod через немного, но в Dev я только что вводил постоянно каждый раз, когда я запускаю приложение, пока не перезагружаю свой компьютер.@Component
public class JwtAuthenticationConverter implements Converter {
private final JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter =
new JwtGrantedAuthoritiesConverter();
// These annotations pull data from the yml file
@Value("${jwt.auth.converter.resource-id}")
private String resourceId;
@Value("${jwt.auth.converter.principal-attribute}")
private String principalAttribute = "resource-id";
@Override
public AbstractAuthenticationToken convert(@NonNull Jwt jwt) {
Collection authorities = Stream.concat(
jwtGrantedAuthoritiesConverter.convert(jwt).stream(),
extractResourceRoles(jwt).stream()
)
.collect(Collectors.toSet());
return new JwtAuthenticationToken(jwt, authorities, getPrincipalClaimName(jwt));
}
private String getPrincipalClaimName(Jwt jwt) {
String claimName = JwtClaimNames.SUB;
if (principalAttribute != null) {
claimName = principalAttribute;
}
return jwt.getClaim(claimName);
}
private Collection
Подробнее здесь: https://stackoverflow.com/questions/796 ... pring-boot