在控制器的方法中,我需要从会话中检索一些数据(通常是我用于用户权限和每个用户自定义网页的ID),我写这样的方法:
@RequestMapping("something")
public ModelAndView doSomething(HttpSession session) throws AuthorizationException{
PerUserModelBean bean = getSessionRelatedInfo(session);
bean.checkPermissions();
...do my stuff...
}
这很无聊,因为我必须为每个方法重复session参数,我必须将该代码放在每个方法的开头。不仅无聊,如果我想改变,我必须跨越所有方法并改变它。我希望会话信息retriavial和checkPermissions方法在我的方法之前自动调用,然后以某种方式根据会话内容自动填充bean变量(可能作为threadlocal?)。有没有办法实现这个目标?
答案 0 :(得分:0)
将以下方法放在超类中,您可以将其用作常用功能的基础。我相信你已经有了一个,所以所有的子类都会继承它。
在每次方法执行之前执行它:你可以使用过滤器/拦截器/ AOP,其他人可能会给你更准确的想法。
protected HttpSession getSession(){
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
return attr.getRequest().getSession();
}
答案 1 :(得分:0)
您应该将此类“重复”代码放在Servlet Filter
或Spring MVC Interceptor
中。这样,如果用户登录与您的应用程序相关,您将能够强制用户登录。