2017-01-23 119 views
0

我在我的项目中有这两个类。当我在配置中使用它们时,我无法提交项目的登录表单。在我填写我的凭证并点击登录后,我尝试调试应用程序,并意识到表单不会触发发送请求的methot。我不知道为什么,但当从配置删除拦截器我没有登录问题。请帮忙。春季拦截器不工作JAVA

SessionInterceptor.class

public class SessionInterceptor extends HandlerInterceptorAdapter { 

     @Autowired 
     private SessionManager sm; 

     @Autowired 
     private MessageSourceAccessor msa; 

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

      String return_url = request.getRequestURL().toString() + "?" + request.getQueryString(); 
      return_url = return_url.replace(msa.getMessage("config.baseurl"), ""); 
      if (!request.getRequestURI().contains("login")) { 
       if (sm.get(request) == null) { 
        response.sendRedirect(
          msa.getMessage("config.baseurl") + "/login?return=" + URLEncoder.encode(return_url)); 
        return false; 
       } 
      } 
      return true; 
     } 

    } 

SessionManager.class

@Component 
public class SessionManager { 

    public static final String ProfileUser = "profileuser"; 

    public UserModel get(HttpServletRequest request) { 
     HttpSession session = null; 
     session = request.getSession(false); 

     if (session == null) 
      return null; 
     return (UserModel) session.getAttribute(ProfileUser); 
    } 

    public void set(HttpServletRequest request, UserModel auth) { 
     HttpSession session = null; 
     session = request.getSession(false); 

     if (session == null) 
      return; 

     session.setAttribute(ProfileUser, auth); 
    } 

    public void remember(HttpServletRequest request) { 
     HttpSession session = null; 
     session = request.getSession(false); 

     if (session != null) 
      session.invalidate(); 

     session.setMaxInactiveInterval(60 * 60 * 60); 
    } 

    public void init(HttpServletRequest request, UserModel auth, Boolean remember) { 
     HttpSession session = null; 
     session = request.getSession(false); 

     if (session != null) 
      session.invalidate(); 

     session = request.getSession(true); 
     if (remember) 
      session.setMaxInactiveInterval(60 * 60 * 60 * 60); 
     else 
      session.setMaxInactiveInterval(1800); 
     session.setAttribute(ProfileUser, auth); 
    } 

    public void destroy(HttpServletRequest request) { 
     HttpSession session = null; 
     session = request.getSession(false); 

     if (session == null) 
      return; 

     session.removeAttribute(ProfileUser); 
     session.invalidate(); 
    } 
+0

你想用拦截器来完成什么? – iamiddy

+0

我决定这样做。还有什么其他的选择? – cool

+0

为什么你需要拦截器? – iamiddy

回答

0

u能提供你的整个配置。从你的代码胡乱猜测:

if (!request.getRequestURI().contains("login")) { 
    if (sm.get(request) == null) { 
     response.sendRedirect(
       msa.getMessage("config.baseurl") + "/login?return=" + URLEncoder.encode(return_url)); 
     return false; 
    } 
} 

现在,如果你sm.get(request) == null然后重定向会发生,因此调用不会去控制器。

重定向意味着再次呼叫到客户端,从那里将新的呼叫发起到所述URL。

OR

如果您@Autowire没有在这种情况下sm工作将是无效的。而sm.get(request) == null会丢NullPointerException。再次打电话不会去控制器。

但是可以肯定的是,请提供您的配置。或者在拦截器中调试你的代码。