gpt4 book ai didi

Spring boot - 将参数从拦截器传递给 Controller ​​中的方法

转载 作者:行者123 更新时间:2023-12-03 09:34:01 28 4
gpt4 key购买 nike

出于学习目的,我制作了一个自定义身份验证系统,我通过 Authorization 将 token 从客户端传递到服务器。标题。

在服务器端,我想知道是否可以在拦截器中创建,在请求到达 Controller 中的方法之前,一个 User 对象,以来自 token 的电子邮件作为属性,然后将此用户对象传递给我需要的每一个请求。

这就是我想得到的,例如:

@RestController
public class HelloController {

@RequestMapping("/")
public String index(final User user) {
return user.getEmail();
}

}

public class User {
private String email;
}

哪里 用户 是我使用请求在预拦截器中创建的对象 Authorization标题然后我可以传递或不传递给 RestController 中的任何方法.

这可能吗?

最佳答案

推荐方案

我会创建一个 @Bean@Scope request 将持有用户,然后将适当的实体放入该持有者,然后在方法内从该持有者获取。

@Component
@Scope("request")
public class CurrentUser {
private User currentUser;

public User getCurrentUser() {
return currentUser;
}

public void setCurrentUser(User currentUser) {
this.currentUser = currentUser;
}
}

进而
@Component
public class MyInterceptor implements HandlerInterceptor {

private CurrentUser currentUser;

@Autowired
MyInterceptor(CurrentUser currentUser) {
this.currentUser = currentUser;
}

@Override
public boolean preHandle(
HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
this.currentUser.setCurrentUser(new User("whatever"));
return true;
}
}

并在 Controller 中
@RestController
public class HelloController {

private CurrentUser currentUser;

@Autowired
HelloController(CurrentUser currentUser) {
this.currentUser = currentUser;
}

@RequestMapping("/")
public String index() {
return currentUser.getCurrentUser().getEmail();
}

}

替代方案

如果您想要的对象只包含一个字段,您可以欺骗它并将该字段添加到 HttpServletRequest参数,然后就可以看到奇迹发生了。
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//TRY ONE AT THE TIME: email OR user
//BOTH SHOULD WORK BUT SEPARATELY OF COURSE
request.setAttribute("email", "login@domain.com");
request.setAttribute("user", new User("login@domain.com"));
return true;
}
}

关于Spring boot - 将参数从拦截器传递给 Controller ​​中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58942591/

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