在Controller中声明HttpSession对象

时间:2017-05-16 02:23:18

标签: spring spring-mvc spring-boot

我们已经定义了一个控制器,需要声明HttpSession对象。我可以自动装配它或作为对象传递给方法。这两个选项有什么区别,哪个更好?

选项1

@Controller
public class UserController {

    @Autowired
    HttpSession session;
    ..
    ..
}

选项2

@Controller
public class UserController {

    @RequestMapping(value="/user", method=RequestMethod.GET)
    public @ResponseBody User getUser(HttpSession session) {
    ..
    ..
    }
}

2 个答案:

答案 0 :(得分:3)

在Controller中,您应该使用Option2。

会话从http请求开始,结束直到请求停止,但控制器可用,直到应用程序停止。所以你不应该在Controller中自动连接HttpSession。

您可以像这样自动装配http会话的情况之一:

@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION)
public class CurrentUserHolder{

    @Autowired
    private HttpSession session;

    public User currentUser() {
        return this.get();
    }

    @Override
    public  User get() {
        return (User)session.getAttribute("currentUser");
    }
}

因此,您可以在无法获得会话的服务中获取当前用户:

@Service
public class UserService{
    private @Autowired CurrentUserHolder currentUserHolder;
    ......
}

答案 1 :(得分:0)

如果您的控制器中有多个方法需要HttpSession,则选项1 是首选。否则,您可以选择'选项2'而不是在每个方法中对其进行参数化。