2012-01-05 46 views
3

我有一个要求来完成。如何在Spring MVC控制器中添加Precall方法

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

session.setAttribute("LOGIN_USER", userName); 

因此,如果用户试图直接访问我的方法的联系与出从登录页面来我可以在控制器的方法检查该会话是否具有如下特定的属性值,我可以限制用户访问该页面并将他重定向到登录页面。

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

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

回答

3

是的,你可以使用HandlerInterceptor这个。请参阅文档herehere

+2

我怎样才能用这个基于注解控制器? – Ran 2012-01-05 08:44:31

+0

@Rana:通过阅读我刚刚链接的文档,然后给它一个。如果您无法正常工作,请向我们提出另一个问题,告诉我们您尝试了什么。 – skaffman 2012-01-05 09:23:18

0

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

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); 
    } 
} 
+1

尽管它的构造,'preHandle'似乎永远不会被调用,至少不使用'MockMvc'时。 – OrangeDog 2016-06-27 15:59:46