package cn.jeesoft.filter; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.springframework.web.util.NestedServletException; import cn.jeesoft.core.exception.DbException; import cn.jeesoft.core.exception.JsonException; import cn.jeesoft.core.utils.ResponseUtils; import cn.jeesoft.core.utils.StringUtils; import cn.jeesoft.mvc.model.ResultCode; import com.alibaba.fastjson.JSONObject; /** * 编码过滤器 * @author king */ public class EncodeFilter implements Filter { /** 统一编码 */ private static final String CHARACTER_ENCODING = "UTF-8"; /** * 自动修正编码的自定义请求 * @author king */ private static class EncodeServletRequest extends HttpServletRequestWrapper { public EncodeServletRequest(HttpServletRequest request) { super(request); try { setCharacterEncoding(CHARACTER_ENCODING); } catch (UnsupportedEncodingException e) { } } @Override public String getParameter(String name) { if (StringUtils.isEmpty(name)) { return null; } String param = StringUtils.trim(super.getParameter(name)); param = StringUtils.toCharset(param, CHARACTER_ENCODING); return param; } @Override public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); if (values==null || values.length==0) { return null; } for (int i = 0; i < values.length; i++) { String value = StringUtils.trim(values[i]); values[i] = StringUtils.toCharset(value, CHARACTER_ENCODING); } return values; } @Override public Map<String, String[]> getParameterMap() { Map<String, String[]> parameterMap = new LinkedHashMap<String, String[]>(); @SuppressWarnings("unchecked") Enumeration<String> names = super.getParameterNames(); while (names.hasMoreElements()) { String name = names.nextElement(); parameterMap.put(name, getParameterValues(name)); } return parameterMap; } } public void init(FilterConfig arg0) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); EncodeServletRequest request = new EncodeServletRequest((HttpServletRequest) req); try { chain.doFilter(request, response); } catch (Throwable e) { if (e != null && e.getClass().getName().contains("org.apache.jasper.JasperException")) { ResponseUtils.sendRedirect((HttpServletRequest)request, (HttpServletResponse)response, "/error/404"); return; } doException(request, response, e); } } private static void doException(ServletRequest request, ServletResponse response, Throwable exception) { ResultCode code = ResultCode.FAILURE; String message = "服务器异常"; if (exception != null) { if (exception instanceof NestedServletException) { Throwable cause = exception.getCause(); if (cause != null) { if (cause instanceof DbException) { code = ResultCode.ERROE_DB; message = cause.getMessage(); if (StringUtils.isEmpty(message)) { message = "数据库操作失败"; } } else if (cause instanceof IllegalArgumentException) { code = ResultCode.ERROE_PARAMETER; message = "参数错误"; } else if (exception instanceof JsonException || exception instanceof com.alibaba.fastjson.JSONException) { code = ResultCode.ERROE_JSON; message = "JSON格式错误"; } } } else if (exception instanceof JsonException || exception instanceof com.alibaba.fastjson.JSONException) { code = ResultCode.ERROE_JSON; message = "JSON格式错误"; } } System.err.println("["+EncodeFilter.class.getSimpleName()+"]Error: "+exception.getMessage()); if (exception instanceof NestedServletException) { Throwable cause = exception.getCause(); if (cause != null) { cause.printStackTrace(System.err); } } JSONObject jsonObject = new JSONObject(); jsonObject.put("status", code.getCode()); jsonObject.put("message", message); ResponseUtils.writer(response, jsonObject); } }