From cfdc99f190f360686712b68af8cf449679a2ee29 Mon Sep 17 00:00:00 2001 From: thinkgem Date: Sat, 25 Aug 2018 19:11:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=8E=A5=E5=8F=A3AP?= =?UTF-8?q?I=E4=BF=A1=E6=81=AF=E8=BE=93=E5=87=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeesite/common/web/http/ServletUtils.java | 46 +++++++++++++++---- .../modules/sys/web/LoginController.java | 45 ++++++++---------- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/common/src/main/java/com/jeesite/common/web/http/ServletUtils.java b/common/src/main/java/com/jeesite/common/web/http/ServletUtils.java index 4d6041de..158a6d0d 100644 --- a/common/src/main/java/com/jeesite/common/web/http/ServletUtils.java +++ b/common/src/main/java/com/jeesite/common/web/http/ServletUtils.java @@ -78,6 +78,21 @@ public class ServletUtils { return response; } + /** + * 支持AJAX的页面跳转 + */ + public static void redirectUrl(HttpServletRequest request, HttpServletResponse response, String url){ + try { + if (ServletUtils.isAjaxRequest(request)){ + request.getRequestDispatcher(url).forward(request, response); // AJAX不支持Redirect改用Forward + }else{ + response.sendRedirect(request.getContextPath() + url); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + /** * 是否是Ajax异步请求 * @param request @@ -173,9 +188,10 @@ public class ServletUtils { resultMap.put("data", data); } } - HttpServletRequest request = ServletUtils.getRequest(); + HttpServletRequest request = getRequest(); String uri = request.getRequestURI(); - if (StringUtils.endsWithIgnoreCase(uri, ".xml")){ + if (StringUtils.endsWithIgnoreCase(uri, ".xml") || StringUtils + .equalsIgnoreCase(request.getParameter("__ajax"), "xml")){ return XmlMapper.toXml(resultMap); }else{ String functionName = request.getParameter("__callback"); @@ -202,7 +218,7 @@ public class ServletUtils { /** * 直接将结果JSON字符串渲染到客户端(支持JsonP,请求参数加:__callback=回调函数名) * @param response 渲染对象:{result:'true',message:'',data:{}} - * @param result Global.TRUE or Globle.False + * @param result 结果标识:Global.TRUE or Globle.False * @param message 执行消息 * @param data 消息数据 * @return null @@ -212,16 +228,18 @@ public class ServletUtils { } /** - * 将对象转换为JSON字符串渲染到客户端(支持JsonP,请求参数加:__callback=回调函数名) + * 将对象转换为JSON、XML、JSONP字符串渲染到客户端(JsonP,请求参数加:__callback=回调函数名) + * @param request 请求对象,用来得到输出格式的指令:JSON、XML、JSONP * @param response 渲染对象 * @param object 待转换JSON并渲染的对象 * @return null */ public static String renderObject(HttpServletResponse response, Object object) { - HttpServletRequest request = ServletUtils.getRequest(); + HttpServletRequest request = getRequest(); String uri = request.getRequestURI(); - if (StringUtils.endsWithIgnoreCase(uri, ".xml")){ - return XmlMapper.toXml(object); + if (StringUtils.endsWithIgnoreCase(uri, ".xml") || StringUtils + .equalsIgnoreCase(request.getParameter("__ajax"), "xml")){ + return renderString(response, XmlMapper.toXml(object)); }else{ String functionName = request.getParameter("__callback"); if (StringUtils.isNotBlank(functionName)){ @@ -250,8 +268,18 @@ public class ServletUtils { */ public static String renderString(HttpServletResponse response, String string, String type) { try { -// response.reset(); // 先注释掉,否则以前设置的Header会被清理掉,如ajax登录设置记住我Cookie - response.setContentType(type == null ? "application/json" : type); +// response.reset(); // 注释掉,否则以前设置的Header会被清理掉,如ajax登录设置记住我的Cookie信息 + if (type == null){ + if ((StringUtils.startsWith(string, "{") && StringUtils.endsWith(string, "}")) + || (StringUtils.startsWith(string, "[") && StringUtils.endsWith(string, "]"))){ + type = "application/json"; + }else if (StringUtils.startsWith(string, "<") && StringUtils.endsWith(string, ">")){ + type = "application/xml"; + }else{ + type = "text/html"; + } + } + response.setContentType(type); response.setCharacterEncoding("utf-8"); response.getWriter().print(string); } catch (IOException e) { diff --git a/modules/core/src/main/java/com/jeesite/modules/sys/web/LoginController.java b/modules/core/src/main/java/com/jeesite/modules/sys/web/LoginController.java index 5db60e49..36a828e0 100644 --- a/modules/core/src/main/java/com/jeesite/modules/sys/web/LoginController.java +++ b/modules/core/src/main/java/com/jeesite/modules/sys/web/LoginController.java @@ -54,7 +54,8 @@ public class LoginController extends BaseController{ if (StringUtils.containsIgnoreCase(request.getRequestURI(), ";JSESSIONID=")){ String queryString = request.getQueryString(); queryString = queryString == null ? "" : "?" + queryString; - return REDIRECT + adminPath + "/login" + queryString; + ServletUtils.redirectUrl(request, response, adminPath + "/login" + queryString); + return null; } LoginInfo loginInfo = UserUtils.getLoginInfo(); @@ -63,16 +64,8 @@ public class LoginController extends BaseController{ if(loginInfo != null){ String queryString = request.getQueryString(); queryString = queryString == null ? "" : "?" + queryString; - String indexUrl = adminPath + "/index" + queryString; - if (ServletUtils.isAjaxRequest(request)){ - try { - request.getRequestDispatcher(indexUrl).forward(request, response); // AJAX不支持Redirect改用Forward - } catch (Exception ex) { - logger.error(ex.getMessage(), ex); - } - return null; - } - return REDIRECT + indexUrl; + ServletUtils.redirectUrl(request, response, adminPath + "/index" + queryString); + return null; } // 如果是登录操作,跳转到此,则认为是登录失败(支持GET登录时传递__login=true参数) @@ -130,16 +123,8 @@ public class LoginController extends BaseController{ if(loginInfo != null){ String queryString = request.getQueryString(); queryString = queryString == null ? "" : "?" + queryString; - String indexUrl = adminPath + "/index" + queryString; - if (ServletUtils.isAjaxRequest(request)){ - try { - request.getRequestDispatcher(indexUrl).forward(request, response); // AJAX不支持Redirect改用Forward - } catch (Exception ex) { - logger.error(ex.getMessage(), ex); - } - return null; - } - return REDIRECT + indexUrl; + ServletUtils.redirectUrl(request, response, adminPath + "/index" + queryString); + return null; } String username = WebUtils.getCleanParam(request, FormAuthenticationFilter.DEFAULT_USERNAME_PARAM); @@ -202,12 +187,16 @@ public class LoginController extends BaseController{ if (StringUtils.containsIgnoreCase(request.getRequestURI(), ";JSESSIONID=")){ String queryString = request.getQueryString(); queryString = queryString == null ? "" : "?" + queryString; - return REDIRECT + adminPath + "/index" + queryString; + ServletUtils.redirectUrl(request, response, adminPath + "/index" + queryString); + return null; } // 验证下用户权限,以便调用doGetAuthorizationInfo方法,保存单点登录登出句柄 if (!SecurityUtils.getSubject().isPermitted("user")){ - return REDIRECT + adminPath + "/login"; + String queryString = request.getQueryString(); + queryString = queryString == null ? "" : "?" + queryString; + ServletUtils.redirectUrl(request, response, adminPath + "/login" + queryString); + return null; } //获取登录用户信息 @@ -216,14 +205,20 @@ public class LoginController extends BaseController{ // 未加载shiro模块时会为空,直接访问则提示操作权限不足。 if(loginInfo == null){ UserUtils.getSubject().logout(); - return REDIRECT + adminPath + "/login"; + String queryString = request.getQueryString(); + queryString = queryString == null ? "" : "?" + queryString; + ServletUtils.redirectUrl(request, response, adminPath + "/login" + queryString); + return null; } // 当前用户对象信息 User user = UserUtils.get(loginInfo.getId()); if (user == null){ UserUtils.getSubject().logout(); - return REDIRECT + adminPath + "/login"; + String queryString = request.getQueryString(); + queryString = queryString == null ? "" : "?" + queryString; + ServletUtils.redirectUrl(request, response, adminPath + "/login" + queryString); + return null; } model.addAttribute("user", user); // 设置当前用户信息