如何在Spring web mvc中设置拦截器的优先级

问题描述:

我的应用程序中有三个拦截器,我只想优先考虑它们,实际上我想通过查询参数自动从另一个应用程序登录我的应用程序。如何在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

好的。显示配置的快照以了解拦截器周围的情况 –

您可以使用标记在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> 

拦截器将为了