/** * 先从从前台隐藏字段取;取不到,再从request取(当使用nginx等进行https->http代理转发时,直接使用request.getRequestUrl()可能取不到客户想要的地址 * <br> * 尤其在需求将url以明文提供给用户使用,如密码修改链接等场景) * * @param request * @return */ public static String getRequestUrl(HttpServletRequest request) { String baseUrl = request.getParameter(RequestKey.PARA_CLIENT_BASE_URL.key()); if (StringUtils.isNotBlank( baseUrl)) { // 从前台隐藏字段取,取不到再从request取(在使用nignx等进行https->http代理转发时可能取不到客户想要的地址) return baseUrl + request.getRequestURI(); } return request.getRequestURL().toString(); }
/** * 判断是否应该从https到http重定向 * * @param request * @return */ public static boolean isRedirectHttp(HttpServletRequest request) { String baseUrl = request.getParameter(RequestKey.PARA_CLIENT_BASE_URL.key()); String actionBaseUrl = request.getParameter(RequestKey.PARA_CLIENT_ACTION_BASE_URL.key()); if (StringUtils.isNotBlank(baseUrl) && !baseUrl.equals( actionBaseUrl)) { // && redirectHttpFlag){//TODO 全程SSL支持只在这里处理即可,可放到shiro的session中 return true; } return false; }
/** * 执行post之后的重定向(主要用于https转为http) * * @param request * @param redirectAttributes * @param result 使用spring freemarker错误结果 * @param bindingEntity * @param bindingEntityName * @param origPage * @return 重定向后的URL地址 */ public static String issueRedirectHttp( HttpServletRequest request, RedirectAttributes redirectAttributes, BindingResult result, Object bindingEntity, String bindingEntityName, String origPage) { if (result != null) { redirectAttributes.addFlashAttribute(bindingEntityName, bindingEntity); redirectAttributes.addFlashAttribute( BindingResult.MODEL_KEY_PREFIX + bindingEntityName, result); } if (!isRedirectHttp(request)) { return origPage; } String baseUrl = request.getParameter(RequestKey.PARA_CLIENT_BASE_URL.key()); if (origPage.startsWith(UrlBasedViewResolver.REDIRECT_URL_PREFIX)) { return origPage.replaceFirst( UrlBasedViewResolver.REDIRECT_URL_PREFIX, UrlBasedViewResolver.REDIRECT_URL_PREFIX + baseUrl + request.getContextPath()); } else { return baseUrl + request.getContextPath() + origPage; } }