我正在开发一个 Spring 应用程序,并且我正在 HandlerInterceptorAdapter
的 prehandle()
方法中对用户进行身份验证,如果用户经过身份验证,我将设置如下请求属性:
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
request.setAttribute("isAuthenticated",true);
request.setAttribute("user",user);
}
如果用户未经过身份验证,我将这样设置
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
request.setAttribute("isAuthenticated",false);
request.setAttribute("user",null);
}
然后在 Controller 方法中,我使用 HttpServletRequest
检索用户,如下所示:
@GetMapping(value = "/user", produces = "application/json")
public Object getUserByToken(HttpServletRequest request) {
if((Boolean) request.getAttribute("isAuthenticated")) {
return request.getAttribute("user");
}
return ResponseEntity.status(UNAUTHORIZED).body("unauthorized");
}
问题是我需要在每个 Controller 方法中接收HttpServletRequest
来检查用户是否经过身份验证。
我想要的是在 Controller 方法之前和 Controller 类内部调用的方法,以便我可以在一个地方设置用户并从所有其他 Controller 方法获取
最佳答案
这样编写基本 Controller :
public class BaseController {
@ModelAttribute("user")
public User getUser(HttpServletRequest request) {
return (User)request.getAttribute("user");
}
}
从BaseController
扩展所有 Controller 。
@RequestMapping(value = "/user", produces = "application/json")
public Object getUserByToken(@ModelAttribute("user") User user) {
// play with user object
}
我已经向您展示了用户的示例,对于身份验证标志也是如此。
关于java - 如何在 Controller 方法之前获取 HttpServletRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44944722/