如何避免将HttpSession放在Spring控制器的每个方法中?

时间:2012-01-18 14:16:40

标签: spring-mvc

在控制器的方法中,我需要从会话中检索一些数据(通常是我用于用户权限和每个用户自定义网页的ID),我写这样的方法:

@RequestMapping("something")
public ModelAndView doSomething(HttpSession session) throws AuthorizationException{

PerUserModelBean bean = getSessionRelatedInfo(session);

bean.checkPermissions();



...do my stuff...

}

这很无聊,因为我必须为每个方法重复session参数,我必须将该代码放在每个方法的开头。不仅无聊,如果我想改变,我必须跨越所有方法并改变它。我希望会话信息retriavial和checkPermissions方法在我的方法之前自动调用,然后以某种方式根据会话内容自动填充bean变量(可能作为threadlocal?)。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:0)

将以下方法放在超类中,您可以将其用作常用功能的基础。我相信你已经有了一个,所以所有的子类都会继承它。

在每次方法执行之前执行它:你可以使用过滤器/拦截器/ AOP,其他人可能会给你更准确的想法。

protected HttpSession getSession(){
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        return attr.getRequest().getSession();
    }

答案 1 :(得分:0)

您应该将此类“重复”代码放在Servlet FilterSpring MVC Interceptor中。这样,如果用户登录与您的应用程序相关,您将能够强制用户登录。