Пример #1
0
  /**
   * 处理待跳转的url
   *
   * @param request
   * @param response
   * @param filterChain
   * @throws IOException
   */
  public static boolean doRedirectUrl(
      ServletRequest request, ServletResponse response, FilterChain filterChain, String pUrl) {
    try {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse res = (HttpServletResponse) response;
      Element thisNode = null;
      for (Object nodeObj :
          RmLoadConfig.getRmClusterDoc()
              .selectNodes(
                  "/rm/org.quickbundle.project.login.RmSsoLogin/redirectGroup[@enable='true']/redirectUrls/url")) {
        Element node = (Element) nodeObj;
        if (node.getText().equals(pUrl)) {
          thisNode = node;
          break;
        }
      }
      if (thisNode == null) {
        throw new RmRuntimeException("配置文件读取错误");
      }
      String targetUrlPrefix = null;
      for (Object baseUrlObj : thisNode.selectNodes("../../redirectTargets/baseUrl")) {
        // TODO 可扩展为负载均衡算法
        Element eleUrlPrefix = (Element) baseUrlObj;
        targetUrlPrefix = eleUrlPrefix.getText();
        break;
      }

      if (targetUrlPrefix.length() == 0) {
        throw new RmRuntimeException("未配置跳转到的目标地址");
      }
      // 带着sso信息跳转到目标服务器
      if (RmClusterConfig.getLocalhostInfo() != null
          && targetUrlPrefix.startsWith(RmClusterConfig.getLocalhostInfo().getLocalhostUrlPath())) {
        // throw new RmRuntimeException("不能跳转到自身,可能导致循环跳转");
        // 如果判断为跳到本机,忽略跳转
        filterChain.doFilter(request, response);
        return true;
      }
      res.sendRedirect(rebuildUri(req, targetUrlPrefix));
      return true;
    } catch (Exception e) {
      log.error("doRedirectUrl():" + e.toString() + " cause:" + e.getCause());
      // save error
      request.setAttribute("org.apache.struts.action.EXCEPTION", e);
      return false;
    }
  }