java - 如何在 Controller 方法之前获取 HttpServletRequest

标签 java spring spring-mvc spring-boot

我正在开发一个 Spring 应用程序,并且我正在 HandlerInterceptorAdapterprehandle() 方法中对用户进行身份验证,如果用户经过身份验证,我将设置如下请求属性:

@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/

相关文章:

spring - 在带有 Spring 的 JUnit 中,如何使用 Mockito (1.10.18) 在 @Service 上创建 spy ?

java - Math.pow(-27.0,1.0/3) 返回 NaN

java - 创建纹理图集错误(opengl ES 2.0,android)

java - 如何访问 arrayList 内的类的实例

java - 按java map 列表中的动态列数分组

java - 在 Spring 中向对象添加日历值

java - 返回类型为 Future 的 Spring 3.2 @Async 任务

java - org.thymeleaf.exceptions.TemplateInputException : Spring Boot

java - 过滤器在注册为 Spring bean 时调用两次

java - 使用 JUnit 运行 Spring 时出现问题