如何在Spring MVC Controller中添加Precall方法

时间:2012-01-05 07:51:36

标签: spring java-ee spring-mvc

我有一个要求要完成。

实际上当用户登录我的应用程序时,我会将登录的用户名保存在会话属性中。

session.setAttribute("LOGIN_USER", userName);

因此,如果用户尝试直接访问我的方法链接而不是来自登录页面,我可以检查控制器方法是否该会话具有如下的特定属性值,我可以限制用户访问该页面并将其重定向到登录页面。

if(request.getSession(false).getAttribute("LOGIN_USER")==null)
 //redirect to login page

现在,我的要求是如果我在控制器中有50个方法我不能在每个方法中添加这个条件。我认为有一种方法可以在控制器类中添加某种过滤器或任何方法,如ex @preExecuteMethod首先执行此方法并在成功时继续进行实际调用。

3 个答案:

答案 0 :(得分:3)

是的,您可以使用HandlerInterceptor。请参阅文档herehere

答案 1 :(得分:1)

拦截器是解决方案。它有方法preHandler,它将在每个请求之前调用。您可以挂钩到每个HTTPServletRequest对象并执行不必要的操作。

这是一个示例代码:

@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        // set few parameters to handle ajax request from different host
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
        response.addHeader("Access-Control-Max-Age", "1000");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Cache-Control", "private");

        String reqUri = request.getRequestURI();
        String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
                reqUri.length());
        if(request.getSession(false).getAttribute("LOGIN_USER")==null) {
            //redirect to login page
        }
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        super.postHandle(request, response, handler, modelAndView);
    }
}

答案 2 :(得分:0)

也许你可以使用AOP @Before方面给出处理程序类中方法的切入点?请参阅参考here,或者您可以通过delegatingFilterProxy解释here创建常规过滤器。我认为整体@skaffman提出了一个更好的主意。