I’m developing a Spring Boot application and encountering intermittent 500 Internal Server Error responses for certain GET requests. The issue is inconsistent, meaning the same endpoint might work sometimes and fail other times. (I don’t know i’m so lost and just about desperate) I’ll give my code:
import org.springframework.http.HttpHeaders;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Component
public class AuthenticationFilter extends OncePerRequestFilter {
private final JwtService jwtService;
public AuthenticationFilter(JwtService jwtService) {
this.jwtService = jwtService;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, java.io.IOException {
// Get token from the Authorization header
String jws = request.getHeader(HttpHeaders.AUTHORIZATION);
if (jws != null) {
// Verify token and get user
String user = jwtService.getAuthUser(request);
// Authenticate
Authentication authentication = new UsernamePasswordAuthenticationToken(user, null,
java.util.Collections.emptyList());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
}
package com.marvi.DeliApp.Security;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import jakarta.servlet.http.HttpServletRequest;
import java.util.Date;
@Component
public class JwtService {
static final long EXPIRATIONTIME = 86400000; // 1 day
static final String PREFIX = "Bearer";
static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
// Generate signed JWT token
public String getToken(String username) {
String token = Jwts.builder().setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME)).signWith(key).compact();
return token;
}
// Get user from token
public String getAuthUser(HttpServletRequest request) {
String token = request.getHeader(HttpHeaders.AUTHORIZATION);
if (token != null) {
String user = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token.replace(PREFIX, ""))
.getBody().getSubject();
if (user != null)
return user;
}
return null;
}
}
I commented out to test but I’m struggling
import com.marvi.DeliApp.Service.UserDetailsServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import java.util.Arrays;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final UserDetailsServiceImpl userDetailsService;
private final AuthenticationFilter authenticationFilter;
private final AuthEntryPoint exceptionHandler;
public SecurityConfig(UserDetailsServiceImpl userDetailsService, AuthenticationFilter authenticationFilter,
AuthEntryPoint exceptionHandler) {
this.userDetailsService = userDetailsService;
this.authenticationFilter = authenticationFilter;
this.exceptionHandler = exceptionHandler;
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception {
return authConfig.getAuthenticationManager();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf((csrf) -> csrf.disable()).cors(withDefaults())
.authorizeHttpRequests((authorizeHttpRequests) -> authorizeHttpRequests
.anyRequest().permitAll());
/*http.csrf((csrf) -> csrf.disable()).cors(withDefaults())
.sessionManagement(
(sessionManagement) -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests
.requestMatchers(HttpMethod.POST, "/login").permitAll()
.anyRequest().authenticated())
.oauth2Login(withDefaults())
.addFilterBefore(authenticationFilter, UsernamePasswordAuthenticationFilter.class)
.exceptionHandling(exceptionHandling -> exceptionHandling.authenticationEntryPoint(exceptionHandler));*/
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowedOrigins(Arrays.asList("*"));
config.setAllowedMethods(Arrays.asList("*"));
config.setAllowedHeaders(Arrays.asList("*"));
config.setAllowCredentials(false);
config.applyPermitDefaultValues();
source.registerCorsConfiguration("/**", config);
return source;
}
}
I expected the application to handle GET requests to the /menuItems endpoint without encountering a 500 Internal Server Error.
this is the log
2024-07-03T03:38:29.497-04:00 INFO 42414 --- [myapp] [main] m.p.springdotenv.DotenvPropertySource : Initializing Dotenv with DotenvConfig{directory=null, filename=null, ignoreIfMalformed=false, ignoreIfMissing=true, systemProperties=false, prefix=null}
2024-07-03T03:38:29.512-04:00 INFO 42414 --- [myapp] [main] com.marvi.myapp.myappApplication : Starting myappApplication using Java 17.0.11 with PID 42414
2024-07-03T03:38:29.513-04:00 INFO 42414 --- [myapp] [main] com.marvi.myapp.myappApplication : No active profile set, falling back to 1 default profile: "default"
2024-07-03T03:38:30.282-04:00 INFO 42414 --- [myapp] [main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-07-03T03:38:30.318-04:00 INFO 42414 --- [myapp] [main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-07-03T03:38:30.319-04:00 INFO 42414 --- [myapp] [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 779 ms
2024-07-03T03:38:30.413-04:00 INFO 42414 --- [myapp] [main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-07-03T03:38:30.441-04:00 INFO 42414 --- [myapp] [main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.5.2.Final
2024-07-03T03:38:30.456-04:00 INFO 42414 --- [myapp] [main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled
2024-07-03T03:38:30.596-04:00 INFO 42414 --- [myapp] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-07-03T03:38:30.688-04:00 INFO 42414 --- [myapp] [main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@21a5b599
2024-07-03T03:38:30.688-04:00 INFO 42414 --- [myapp] [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-07-03T03:38:31.203-04:00 WARN 42414 --- [myapp] [main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "alter table if exists menu_item add column featured boolean not null" via JDBC [ERROR: column "featured" of relation "menu_item" contains null values]
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "alter table if exists menu_item add column featured boolean not null" via JDBC [ERROR: column "featured" of relation "menu_item" contains null values]
2024-07-03T03:39:04.219-04:00 WARN 42414 --- [myapp] [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: 42703
2024-07-03T03:39:04.219-04:00 ERROR 42414 --- [myapp] [nio-8080-exec-4] o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: column mi1_0.featured does not exist
Position: 69
2024-07-03T03:38:31.639-04:00 TRACE 42414 --- [myapp] [main] eGlobalAuthenticationAutowiredConfigurer : Eagerly initializing {securityConfig=com.marvi.myapp.Security.SecurityConfig$$SpringCGLIB$$0@39a6c7a6}
2024-07-03T03:38:31.643-04:00 INFO 42414 --- [myapp] [main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name userDetailsServiceImpl
2024-07-03T03:38:32.550-04:00 DEBUG 42414 --- [myapp] [main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with filters: DisableEncodeUrlFilter, WebAsyncManagerIntegrationFilter, SecurityContextHolderFilter, HeaderWriterFilter, CorsFilter, LogoutFilter, RequestCacheAwareFilter, SecurityContextHolderAwareRequestFilter, AnonymousAuthenticationFilter, ExceptionTranslationFilter, AuthorizationFilter
2024-07-03T03:38:51.716-04:00 TRACE 42414 --- [myapp] [nio-8080-exec-2] w.c.HttpSessionSecurityContextRepository : No HttpSession currently exists
2024-07-03T03:38:51.716-04:00 TRACE 42414 --- [myapp] [nio-8080-exec-2] .s.s.w.c.SupplierDeferredSecurityContext : Created SecurityContextImpl [Null authentication]
2024-07-03T03:38:51.716-04:00 TRACE 42414 --- [myapp] [nio-8080-exec-2] .s.s.w.c.SupplierDeferredSecurityContext : Created SecurityContextImpl [Null authentication]
2024-07-03T03:38:51.717-04:00 TRACE 42414 --- [myapp] [nio-8080-exec-2] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[ROLE_ANONYMOUS]]