如何在控制器方法之前获取HttpServletRequest

时间:2017-07-06 09:18:40

标签: java spring spring-mvc spring-boot

我正在开发一个Spring应用程序,我正在使用HandlerInterceptorAdapter的{​​{1}}方法对用户进行身份验证,如果用户已经过身份验证,我正在设置这样的请求属性:

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); } 这样的用户:

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"); } 以检查用户是否经过身份验证。

我想要的是一个在控制器方法之前和控制器类内部调用的方法,这样我就可以在一个地方设置用户并从所有其他控制器方法中获取

1 个答案:

答案 0 :(得分:2)

以这种方式编写基本控制器:

public class BaseController {

    @ModelAttribute("user")
    public User getUser(HttpServletRequest request) {
        return (User)request.getAttribute("user");
    }
}

BaseController扩展所有控制器。

@RequestMapping(value = "/user", produces = "application/json")
public Object getUserByToken(@ModelAttribute("user") User user) {
   // play with user object
}

我向您展示了用户的示例,同样也为身份验证标志做了。