gpt4 book ai didi

spring-boot - 使用 JWT 进行 Spring Boot session 管理

转载 作者:行者123 更新时间:2023-12-05 06:18:39 26 4
gpt4 key购买 nike

在这种情况下你能协助我吗?我正在开发一个移动应用程序,其中 session 不在 spring boot 服务器端维护。因此,我使用客户端随每个请求发送的 JWT。

客户端应用程序将数据连同 token 逐页(逐个请求)发送到服务器。服务器需要暂时存储这些数据并等待响应数据到达。它必须在数据库中存储所有数据或不存储任何数据。

通常,对于传统的 Web 应用程序,这可以通过 session 实现。我在 session 中尝试过,但没有维护。但是,当请求来自 Postman 时, session 会被维护。客户端应用程序在端口 8000 上运行,而服务器在 SSL 端口 8443 上运行。有一点很清楚,服务器将来自同一客户端的每个请求视为匿名,尽管它确实会为每个请求接收一个 token 。

SecurityConfigurer.java

@EnableWebSecurity
public class SecurityConfigurer extends WebSecurityConfigurerAdapter{

@Autowired
private MyUserDetailsService userDetailsService;

@Autowired
private JwtRequestFilter jwtRequestFilter;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.cors().and()
.authorizeRequests().antMatchers("/authenticate").permitAll()
.anyRequest().authenticated()
.and().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
}



@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}

@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
// TODO Auto-generated method stub
return super.authenticationManagerBean();
}

}



JwtRequestFilter.java

@Component
public class JwtRequestFilter extends OncePerRequestFilter {

@Autowired
private MyUserDetailsService userDetailsService;

@Autowired
private JwtUtil jwtUtil;

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
final String authorizationHeader = request.getHeader("Authorization");
String username = null;
String jwt = null;

if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
jwt = authorizationHeader.substring(7);
username = jwtUtil.extractUsername(jwt);
}

if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
if (jwtUtil.validateToken(jwt, userDetails)) {
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
usernamePasswordAuthenticationToken
.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
}
}

response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age",
"3600");


filterChain.doFilter(request, response);
}

}

QuizController.java

@CrossOrigin("*")
@RestController
public class QuizController {

@Autowired
private QuizRepository service;

@Autowired
private QuizSummaryRespository summaryService;

@Autowired
private AuthenticationManager authenticationManager;

@Autowired
private MyUserDetailsService userDetailsService;

@Autowired
private JwtUtil jwtTokenUtil;

@SuppressWarnings("unchecked")
@ResponseBody
@PostMapping("/quiz")
public ResponseEntity<?> saveQuiz(Quiz quiz, @RequestParam String status, @RequestParam long time,
HttpServletRequest request, HttpServletResponse response, @RequestHeader Map<String, String> headers) {


Map<String, String> map = new HashMap<>();
List<Quiz> myQuizzes = (List<Quiz>) request.getSession().getAttribute("code"); //This line always return null list

if (quiz.getCode().equals("")) {
quiz.setCode(Utility.generateCode());
myQuizzes = new ArrayList<>();
}

myQuizzes.add(quiz);
request.getSession().setAttribute("code", myQuizzes);

map.put("code", quiz.getCode());

return ResponseEntity.ok(map);
}
}

最佳答案

好的,我可以想到几种方法来解决这个问题。

第一种方法

在前端将所有先前的响应存储在 sessionStorage 或 localStorage 中,并在完成时立即发送。

第二种方法

在第一个请求期间在后端存储具有唯一 ID 的响应,并将唯一 ID 发送给客户端。在每个后续请求中,客户端需要将唯一 ID 与订单和响应一起发送。完成后获取所有响应并按顺序合并它们。您可以在此处使用任何类型的存储,无论是数据库、缓存还是普通数组。满足您的需求。

关于spring-boot - 使用 JWT 进行 Spring Boot session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61179106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com