簡體   English   中英

Springboot - Httponly cookie 將請求傳遞給 controller

[英]Springboot - Httponly cookie Pass request to controller

我有 cookies 在我的前端應用程序的 httponly 中工作。

我希望能夠刷新頁面並仍然登錄。我可以這樣做,cookie 保持存在。 但是,它在正文中提供 userProfile 的登錄請求中的數據將不存在。

我有以下過濾請求的 class :

public class AuthTokenFilter extends OncePerRequestFilter {
    @Autowired
    private JwtUtils jwtUtils;

    @Autowired
    private MyUserDetailsService userDetailsService;

    private static final Logger logger = LoggerFactory.getLogger(AuthTokenFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        try {
            String jwt = parseJwt(request);
            if (jwt != null && jwtUtils.validateJwtToken(jwt)) {
                String email = jwtUtils.getEmailFromJwtToken(jwt);
                UserDetails userDetails = userDetailsService.loadUserByUsername(email);
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails,null, userDetails.getAuthorities());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
        catch (Exception e) { logger.error("Cannot set user authentication: {}", e);
            System.out.println(e);
        }
        filterChain.doFilter(request, response);
    }

    private String parseJwt(HttpServletRequest request) { return jwtUtils.getJwtFromCookies(request); }
}

但理想情況下,我想處理來自身份驗證whoAmI的 whoAmI。

 @GetMapping("/whoAmI")
    public ResponseEntity<?> whoAmI() {
...
...
...
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                var temp = Arrays.stream(cookies)
                        .map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", "));
            }
...
...
...

        return  ResponseEntity.ok().header(HttpHeaders.SET_COOKIE, jwtCookie.toString())
                .body(userService.findUserProfileUserByEmail(userDetails.getEmail()));
    }

對我來說,在 controller 而不是過濾器中處理這個更有意義。 但是如何將請求從過濾器傳遞到 controller 中?

您可以使用ServletRequest類型的參數定義 controller 方法,並且 Spring 將為您施展魔法。

@GetMapping("/whoAmI")
public ResponseEntity<?> whoAmI(HttpServletRequest httpRequest) {
}

查看參考文檔,了解可能的處理程序方法 arguments。

spring-mvc 是一個線程每個請求 model,所以(如果你不使用異步 spring-mvc 特性)你可以在任何地方使用你的代碼請求你的servlet:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
            .getRequest();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM