【问题标题】:Passing a JWT token and JSP page together to browser, Springboot将JWT令牌和JSP页面一起传递给浏览器,Springboot
【发布时间】:2021-01-19 07:11:58
【问题描述】:

这里是新手,我正在尝试将响应上的 jwt 令牌以及新的 jsp 页面传递给浏览器,但由于方法数据类型,似乎无法同时返回两者(它要么是用于传递的字符串JSP 或 ResponseEntity 用于传递令牌)。我应该如何处理这件事?有没有其他方法可以做到这一点?

public String createAuthenticationToken(@RequestParam("userName") String username, @RequestParam("Password") 
String password, Model model) throws Exception {
    
    authenticate(username, password);
    
    final UserDetails userDetails = userDetailsService.loadUserByUsername(username);
    final String token = jwtTokenUtil.generateToken(userDetails);
    

/这仅在方法类型为 ResponseEntity 时有效,但我也需要传递它/ return ResponseEntity.ok(new JwtResponse(token));

    model.addAttribute("UserName",username);
    model.addAttribute("token",token);
    return "homepage";
}

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    您的用例不清楚。我看到您已经使用 model.addAttribute("token", token) 将令牌添加到模型中,但是您是否从 homepage 模板中使用了它?模型就像一个键值存储,用于与视图模板共享信息,模板负责提取相关信息并将它们包含在发送回客户端的响应中。

    附带说明,您似乎还使用password 作为请求参数,这是不推荐的。对于此类敏感信息,请始终使用 HTTP 帖子正文。

    【讨论】:

    • 感谢您回复 Nilesh,我正在尝试在 http 响应中传递一个令牌,并返回页面。不要介意我使用模型在其上设置令牌。我只想分别发送令牌和页面,以便我可以显示“您已登录页面”,但也可以单独显示令牌,以便客​​户端稍后可以使用它来验证自己。但是,如果有另一种方法可以做到这一点,请也推荐一下。我对此很陌生。谢谢
    【解决方案2】:

    因此,据我了解,您正在尝试验证用户的凭据作为登录的一部分,然后显示主页以防凭据有效。另外,返回一个 jwt 令牌。

    如果是这种情况,您可以考虑在安全 cookie 中返回令牌。这是我编写的一个简单示例,用于展示如何使用虚拟用户完成此操作:https://github.com/nkumashi/springboot-webmvc-demo

    项目的关键是 UserController.java 类中的这段代码:

    @RequestMapping(value = "/showUser", method = RequestMethod.POST)
    public String showUser(@ModelAttribute("user") User user, Model model, HttpServletResponse response) {
        // extract user details and verify provided credentials
        // using a dummy user to keep things simple
        if(user.getFirstName().equals(dummyUser)) {
            // user login success
            Cookie cookie = new Cookie("token", "dummy-token");
            cookie.setMaxAge(COOKIE_EXPIRY_IN_SECONDS);
            cookie.setSecure(false);
            cookie.setHttpOnly(true);
            
            response.addCookie(cookie);
            model.addAttribute("User", user);
            // show the home page / user details
            return "showUser";
        } 
        // login failure
        model.addAttribute("message", "Invalid user!");
        return "error";
    }
    

    【讨论】:

    • 感谢您的回复,您能告诉我如何处理他从客户端获取的 cookie 吗?我正在使用 JSP 和 springboot。
    • 嗨阿迈勒!好吧,客户不必明确地做任何事情。下次客户端向同一域发出请求时,浏览器会自动添加服务器端 cookie。每个 cookie 都应该有一个有效期。浏览器会在 cookie 过期时自动删除。而且,当客户端在没有 cookie 的情况下发出下一个请求时,请求会失败并显示 401。我认为客户端不需要知道 JWT 令牌。只要客户端附加了安全 cookie(包含令牌),请求就会被处理,否则会被拒绝。如果被拒绝,客户端必须获得一个新的令牌。
    • 谢谢,我设法实现了。你很有帮助。
    【解决方案3】:
    public String createAuthenticationToken(@RequestParam("userName") String username, @RequestParam("Password") 
    String password, Model model, HttpServletResponse response) throws Exception {
        
        authenticate(username, password);
        
        final UserDetails userDetails = userDetailsService.loadUserByUsername(username);
        
        final String token = jwtTokenUtil.generateToken(userDetails);
        
        response.addHeader("token", token);
        model.addAttribute("UserName",username);
        model.addAttribute("token",token);
        return "homepage";
    }
    

    这是我想出来的,添加标题

    【讨论】:

      猜你喜欢
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2020-01-06
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多