package com.jspxcms.core.support; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.util.CollectionUtils; import org.apache.shiro.web.util.WebUtils; import org.springframework.ui.Model; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.servlet.support.RequestContextUtils; import com.jspxcms.common.util.JsonMapper; import com.jspxcms.common.web.Servlets; import com.jspxcms.core.domain.Site; /** * ForeUtils * * @author liufang * */ public class Response { public static final String NEXT_URL = "nextUrl"; public static final String REDIRECT_URL = "redirectUrl"; public static final String MESSAGE_PREFIX = "status_"; public static final String TIMEOUT = "timeout"; public static final String MESSAGES = "messages"; public static final String STATUS = "status"; public static final String AJAX_RESPONSE = "ajax"; public static final String PAGE_RESPONSE = "page"; public static final String OPERATION_SUCCESS = "sys_operation_success.html"; public static final String OPERATION_WARNING = "sys_operation_warning.html"; public static final String OPERATION_ERROR = "sys_operation_error.html"; public String warning(String code, String[] args, String defaultMessage) { addMessage(code, args, defaultMessage); return warning(); } public String warning(String code, String[] args) { addMessage(code, args); return warning(); } public String warning(String code) { addMessage(code); return warning(); } public String warning() { if (getStatus() == 0) { setStatus(200); } modelMap.addAttribute(STATUS, getStatus()); modelMap.addAttribute(MESSAGES, getMessages()); Site site = Context.getCurrentSite(request); String template = site.getTemplate(OPERATION_WARNING); Map<String, Object> map = modelMap.asMap(); ForeContext.setData(map, request); return template; } /** * 请求参数有误。 */ public String badRequest(String code, String[] args, String defaultMessage) { addMessage(code, args, defaultMessage); return badRequest(); } /** * 请求参数有误。 */ public String badRequest(String code, String[] args) { addMessage(code, args); return badRequest(); } /** * 请求参数有误。 */ public String badRequest(String code) { addMessage(code); return badRequest(); } /** * 请求参数有误。 */ public String badRequest() { if (getStatus() == 0) { setStatus(400); } response.setStatus(HttpServletResponse.SC_BAD_REQUEST); modelMap.addAttribute(STATUS, getStatus()); modelMap.addAttribute(MESSAGES, getMessages()); Site site = Context.getCurrentSite(request); String template = site.getTemplate(OPERATION_ERROR); Map<String, Object> map = modelMap.asMap(); ForeContext.setData(map, request); return template; } /** * 未找到 */ public String notFound(String code, String[] args, String defaultMessage) { addMessage(code, args, defaultMessage); return notFound(); } /** * 未找到 */ public String notFound(String code, String[] args) { addMessage(code, args); return notFound(); } /** * 未找到 */ public String notFound(String code) { addMessage(code); return notFound(); } /** * 未找到 * * @return */ public String notFound() { if (getStatus() == 0) { setStatus(404); } response.setStatus(HttpServletResponse.SC_NOT_FOUND); modelMap.addAttribute(STATUS, getStatus()); modelMap.addAttribute(MESSAGES, getMessages()); Site site = Context.getCurrentSite(request); String template = site.getTemplate(OPERATION_ERROR); Map<String, Object> map = modelMap.asMap(); ForeContext.setData(map, request); return template; } /** * 禁止访问 */ public String forbidden(String code, String[] args, String defaultMessage) { addMessage(code, args, defaultMessage); return forbidden(); } /** * 禁止访问 */ public String forbidden(String code, String[] args) { addMessage(code, args); return forbidden(); } /** * 禁止访问 */ public String forbidden(String code) { addMessage(code); return forbidden(); } /** * 禁止访问 */ public String forbidden() { if (getStatus() == 0) { setStatus(403); } if (CollectionUtils.isEmpty(getMessages())) { addMessage("error.forbidden"); } response.setStatus(HttpServletResponse.SC_FORBIDDEN); modelMap.addAttribute(STATUS, getStatus()); modelMap.addAttribute(MESSAGES, getMessages()); Site site = Context.getCurrentSite(request); String template = site.getTemplate(OPERATION_ERROR); Map<String, Object> map = modelMap.asMap(); ForeContext.setData(map, request); return template; } /** * 未登录 * * @return */ public String unauthorized() { setStatus(401); WebUtils.saveRequest(request); try { WebUtils.issueRedirect(request, response, Constants.LOGIN_URL); } catch (IOException e) { throw new IllegalArgumentException("redirect to login error: " + Constants.LOGIN_URL, e); } return null; } private int status = 0; private List<String> messages = new ArrayList<String>(); private Map<String, Object> data = new HashMap<String, Object>(); private HttpServletRequest request; private HttpServletResponse response; private Model modelMap; private WebApplicationContext wac; private Locale locale; public Response(HttpServletRequest request, HttpServletResponse response, Model modelMap) { this.request = request; this.response = response; this.modelMap = modelMap; this.locale = RequestContextUtils.getLocale(request); this.wac = RequestContextUtils.getWebApplicationContext(request); } public String post(int status, String code, String[] args) { setStatus(status); addMessage(code, args); return post(); } public String post(int status, String code) { setStatus(status); addMessage(code); return post(); } public String post(int status) { setStatus(status); return post(); } public String post() { Site site = Context.getCurrentSite(request); String responseType = Servlets.getParameter(request, "responseType"); if (AJAX_RESPONSE.equals(responseType)) { JsonMapper mapper = new JsonMapper(); getData().put(STATUS, getStatus()); getData().put(MESSAGES, getMessages()); String json = mapper.toJson(getData()); Servlets.writeHtml(response, json); return null; } else { // 过滤所有的状态提示,nextUrl,redirectUrl String redirectUrl = Servlets.getParameter(request, REDIRECT_URL); String nextUrl = Servlets.getParameter(request, NEXT_URL); Map<String, String> sms = Servlets.getParameterMap(request, MESSAGE_PREFIX, true); Map<String, String> newsms = new HashMap<String, String>(sms.size()); String search, replacement, value; getData().put(STATUS, getStatus()); for (Entry<String, Object> entry : getData().entrySet()) { search = "{" + entry.getKey() + "}"; replacement = entry.getValue().toString(); nextUrl = StringUtils.replace(nextUrl, search, replacement); redirectUrl = StringUtils.replace(redirectUrl, search, replacement); for (Entry<String, String> smEntry : sms.entrySet()) { value = smEntry.getValue(); value = StringUtils.replace(value, search, replacement); newsms.put(smEntry.getKey(), value); } } // URL编码 nextUrl = response.encodeRedirectURL(nextUrl); redirectUrl = response.encodeRedirectURL(redirectUrl); // 如果成功且是重定向 if (isSuccess() && StringUtils.isNotBlank(redirectUrl)) { try { response.sendRedirect(redirectUrl); return null; } catch (IOException e) { throw new IllegalArgumentException("redirect error: " + redirectUrl, e); } } modelMap.addAttribute(MESSAGES, getMessages()); modelMap.addAttribute(NEXT_URL, nextUrl); modelMap.addAllAttributes(getData()); modelMap.addAllAttributes(newsms); String timeout = request.getParameter(TIMEOUT); if (StringUtils.isNotBlank(timeout)) { modelMap.addAttribute(TIMEOUT, timeout); } String template; if (isSuccess()) { template = site.getTemplate(OPERATION_SUCCESS); } else { template = site.getTemplate(OPERATION_ERROR); } Map<String, Object> map = modelMap.asMap(); ForeContext.setData(map, request); return template; } } public boolean hasErrors() { return getStatus() >= 100; } public boolean isSuccess() { return !hasErrors(); } public void addMessageRaw(String message) { getMessages().add(message); } public void addMessage(String code) { getMessages().add(wac.getMessage(code, null, code, locale)); } public void addMessage(String code, String[] args) { getMessages().add(wac.getMessage(code, args, code, locale)); } public void addMessage(String code, String[] args, String defaultMessage) { getMessages().add(wac.getMessage(code, args, defaultMessage, locale)); } public void addData(String key, Object value) { getData().put(key, value); } /** * <ul> * <li>0-99为成功。 * <li>100-199为通用错误,其中100为验证码错误。 * <li>400-449为请求参数错误。 * <li>450-499为找不到请求参数所对应的数据。 * <li>500以上为逻辑错误。 * </ul> * * @return */ public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public List<String> getMessages() { return messages; } public void setMessages(List<String> messages) { this.messages = messages; } public Map<String, Object> getData() { return data; } public void setData(Map<String, Object> data) { this.data = data; } }