/** * Copyright © 2012-2013 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); */ package com.hongqiang.shop.common.web; import java.beans.PropertyEditorSupport; import java.math.BigDecimal; import java.util.Date; import java.util.Set; import javax.validation.Validator; import org.apache.commons.lang3.StringEscapeUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import com.hongqiang.shop.common.template.FlashMessageDirective; import com.hongqiang.shop.common.utils.DateUtils; import com.hongqiang.shop.common.utils.Message; import com.hongqiang.shop.common.utils.Setting; import com.hongqiang.shop.common.utils.SettingUtils; import com.hongqiang.shop.common.utils.SpringContextHolder; import com.hongqiang.shop.website.entity.Log; /** * 控制器支持类 * * @author ThinkGem * @version 2013-3-23 */ public abstract class BaseController { protected static final String ERROR_PAGE = "/admin/common/error"; protected static final String SHOP_ERROR_PAGE = "/shop/common/error"; protected static final Message ADMIN_ERROR = Message.error("admin.message.error", new Object[0]); protected static final Message ADMIN_SUCCESS = Message.success("admin.message.success", new Object[0]); protected static final Message SHOP_ERROR = Message.error("shop.message.error", new Object[0]); protected static final Message SHOP_SUCCESS = Message.success("shop.message.success", new Object[0]); private static final String CONSTRAINT_VIOLATIONS = "constraintViolations";// 验证失败的关键字 /** * 验证Bean实例对象 */ @Autowired protected Validator validator; /** * 服务端参数有效性验证 * * @param redirectAttributes 重定向属性 * @param object 验证的实体对象 * @param groups 验证组 * @return 验证成功:返回true;严重失败:将错误信息添加到 request中 */ protected boolean beanValidator(RedirectAttributes redirectAttributes,Object object, Class<?>[] groups) { Set<?> set = this.validator.validate(object, groups); if (set.isEmpty()) return true; RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); requestAttributes.setAttribute(CONSTRAINT_VIOLATIONS, set, 0); return false; } /** * 服务端参数有效性验证 * * @param object 验证的实体对象 * @param groups 验证组 * @return 验证成功:返回true;严重失败:将错误信息添加到 request中 */ protected boolean beanValidator(Object object, Class<?>[] groups) { Set<?> set = this.validator.validate(object, groups); if (set.isEmpty()) return true; RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); requestAttributes.setAttribute(CONSTRAINT_VIOLATIONS, set, 0); return false; } /** * 服务端参数有效性验证 * * @param beanType 验证的实体类型 * @param propertyName 验证的属性名称 * @param object 验证的实体对象 * @param groups 验证组 * @return 验证成功:返回true;严重失败:将错误信息添加到 request中 */ protected boolean beanValidator(Class<?> beanType, String propertyName, Object object, Class<?>[] groups) { Set<?> set = this.validator.validateValue(beanType, propertyName, object, groups); if (set.isEmpty()) return true; RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); requestAttributes.setAttribute(CONSTRAINT_VIOLATIONS, set, 0); return false; } /** * 添加Flash消息 * * @param redirectAttributes 重定向属性 * @param messages 消息实体类 */ protected void addMessage(RedirectAttributes redirectAttributes,Message messages) { if ((redirectAttributes != null) && (messages != null)) redirectAttributes.addFlashAttribute(FlashMessageDirective.FLASH_MESSAGE_ATTRIBUTE_NAME,messages); } /** * 把价钱转换为带前后缀的字符串形式,如amount为5,则可以输入“¥5元” * * @param amount 总价的金额 * @param hasCurrencySign 价钱的前缀,如美元的$,人民币的¥ * @param hasCurrencyUnit 价钱的单位,如美元的dollar,人民币的“元” * @return 总价金额的字符串形式,可能包含价钱的前后缀 */ protected String addMessage(BigDecimal amount,boolean hasCurrencySign, boolean hasCurrencyUnit) { Setting setting = SettingUtils.get(); String currency = setting.setScale(amount).toString(); if (hasCurrencySign) currency = setting.getCurrencySign() + currency; if (hasCurrencyUnit) currency = currency + setting.getCurrencyUnit(); return currency; } /** * 和stringUtils类中的getMessage方法相同, 获得i18n字符串,即支持多语言 * * @param code 编码类型 * @param args 参数 * @return 国家化语言 */ protected String addMessage(String code, Object[] args) { return SpringContextHolder.getMessage(code, args); } /** * 记录内容到数据库中 * * @param content 内容 */ protected void addMessage(String content) { if (content != null) { RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes(); requestAttributes.setAttribute(Log.LOG_CONTENT_ATTRIBUTE_NAME,content, 0); } } /** * 初始化数据绑定 1. 将所有传递进来的String进行HTML编码,防止XSS攻击 2. 将字段中Date类型转换为String类型 */ @InitBinder protected void initBinder(WebDataBinder binder) { // String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击 binder.registerCustomEditor(String.class, new PropertyEditorSupport() { @Override public void setAsText(String text) { setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim())); } @Override public String getAsText() { Object value = getValue(); return value != null ? value.toString() : ""; } }); // Date 类型转换 binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { @Override public void setAsText(String text) { setValue(DateUtils.parseDate(text)); } }); } }