/** * 处理待跳转的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; } }