2014-03-27 82 views
0

我的應用程序中有三個攔截器,我只想優先考慮它們,實際上我想通過查詢參數自動從另一個應用程序登錄我的應用程序。如何在Spring web mvc中設置攔截器的優先級

如果用戶沒有有效的會話,這個攔截器正在驗證用戶會話,那麼它會將用戶重定向到登錄頁面,並且工作正常。

public class ValidateSessionInterceptor extends HandlerInterceptorAdapter { 

    private Logger log = Logger.getLogger(getClass()); 

    @Value("${http.port}") 
    private int httpPort; 

    @Value("${https.port}") 
    private int httpsPort; 

    @Value("${use.ssl}") 
    private boolean useSsl; 

    //before the actual handler will be executed 
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {  
     HttpSession session = request.getSession();  

     if(session.getAttribute("user")==null){   
      String forwardTo = (String) request.getAttribute("org.springframework.web.servlet.HandlerMapping.pathWithinHandlerMapping"); 
      String params = ""; 

      if(request.getQueryString()!=null){ 
       params = "?" + request.getQueryString(); 
      } 

      String url = getApplicationUrl(request,useSsl)+forwardTo+params; 
      log.info("redirect url: " + request.getContextPath()+"/login/index.mars?forwardTo="+URLEncoder.encode(url, "UTF-8")); 
      response.sendRedirect(request.getContextPath()+"/login/index.mars?forwardTo="+URLEncoder.encode(url, "UTF-8")); 
      return false;   
     }else{ 
      Map<String,String> owners = new LinkedHashMap<String,String>(); 
      owners.put("NA", "NA"); 
      owners.put("AK", "AK"); 
      request.setAttribute("ownerList", owners); 
     } 

     return true; 
    } 

    private String getApplicationUrl(HttpServletRequest request,boolean useSsl){ 
     if(useSsl){ 
      return "https://"+request.getServerName()+":"+httpsPort+request.getContextPath(); 
     }else{ 
      return "http://"+request.getServerName()+":"+httpPort+request.getContextPath(); 
     } 
    } 
} 

這是由另一個應用程序調用並將autoUsr和autoPwd參數傳遞給自動登錄的應用程序。

public class AutoLoginInterceptor extends HandlerInterceptorAdapter{ 
    private final Logger log = Logger.getLogger(getClass()); 

    @Autowired 
    public UserService userService; 

    @Autowired 
    public WebService webService; 


    public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws IOException, UserException { 
     HttpSession session = request.getSession(); 

     if(session.getAttribute("user")==null){ 
      String forwardTo = request.getParameter("forwardTo"); 
      if(forwardTo!=null && !forwardTo.equals("")){    
       User user = checkLoginCrendential(forwardTo); 
       log.info("user-> " + user); 
       this.webService.buildWebService(request); 
       if(userService.login(request, user)){ 
        session.setAttribute("user", user); 
        return true; 
       } 
      }  
     } 

     return true; 
    } 

    public User checkLoginCrendential(String url){  
     String decURL; 

     User user = new User(); 
     try 
     { 
      decURL = URLDecoder.decode(url,"utf-8"); 
      String params[] = (decURL.split("\\?")[1]).split("&"); 
      String loginParams[] = {"autoUsr","autoPwd"}; 


      for(String lgnParam : loginParams){ 
       for(int i = 0 ; i < params.length ; i++){ 
        String param[] = params[i].split("="); 
        if(lgnParam.equals(param[0])){ 
         if(param.length > 1){       
          if(lgnParam.equals("autoUsr")){ 
           user.setUsername(param[1]); 
          }else if(lgnParam.equals("autoPwd")){ 
           user.setPassword(param[1]); 
          } 
         }else{ 
          if(lgnParam.equals("autoUsr")){ 
           user.setUsername(""); 
          }else if(lgnParam.equals("autoPwd")){ 
           user.setPassword(""); 
          } 
         } 

        } 
       } 
      } 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     }  

     return user; 
    } 
} 
+0

提供更多信息,請其攔截器被稱爲? Spring Security? –

+0

不,我不使用彈簧安全 –

+0

好的。顯示配置的快照以瞭解攔截器周圍的情況 –

回答

2

您可以使用標記在XXX-servlet.xml中對攔截器進行排序。例如:

<mvc:interceptors> 
    <mvc:interceptor> 
    <mvc:mapping path="/**" /> 
    <bean class="ValidateSessionInterceptor" /> 
    </mvc:interceptor> 
    <mvc:interceptor> 
    <mvc:mapping path="/**" /> 
    <bean class="AutoLoginInterceptor" /> 
    </mvc:interceptor> 
</mvc:interceptors> 

攔截器將爲了