spring+springMVC+hibernate+druid+ehcache用到的一些过滤器、转换器、键生成器

版权声明:本篇文章由IT_CREATE整理 https://blog.csdn.net/IT_CREATE/article/details/86593310

各种涉及到的一些组件,过滤器、ehcache缓存键生成器、转换器、解决懒加载序列化的objectMapper

1、ehcache缓存键生成器(生成不重复的ehcache缓存键)

import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.Arrays;

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.stereotype.Component;
/**
 * 缓存 键 生成器
 * @author Administrator
 *
 */
@Component
public class CacheKeyGenerator implements KeyGenerator,Serializable{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -6560716503034938613L;

	@Override
    public Object generate(Object target, Method method, Object... params) {
        return new CustomKey(target.getClass(), method.getName(), params);
    }

    /**
     * Like {@link org.springframework.cache.interceptor.SimpleKey} but considers the method.
     */
    static final class CustomKey implements Serializable {

        /**
		 * 
		 */
		private static final long serialVersionUID = -1643380720996899548L;
		private final Class<?> clazz;
        private final String methodName;
        private final Object[] params;
        private final int hashCode;

        /**
         * Initialize a key.
         *
         * @param clazz the receiver class
         * @param methodName the method name
         * @param params the method parameters
         */
        CustomKey(Class<?> clazz, String methodName, Object[] params) {
            this.clazz = clazz;
            this.methodName = methodName;
            this.params = params;
            int code = Arrays.deepHashCode(params);
            code = 31 * code + clazz.hashCode();
            code = 31 * code + methodName.hashCode();
            this.hashCode = code;
        }

        @Override
        public int hashCode() {
            return this.hashCode;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (!(obj instanceof CustomKey)) {
                return false;
            }
            CustomKey other = (CustomKey) obj;
            if (this.hashCode != other.hashCode) {
                return false;
            }

            return this.clazz.equals(other.clazz)
                    && this.methodName.equals(other.methodName)
                    && Arrays.deepEquals(this.params, other.params);
        }

    }
}

2、转换器(字符串转日期,应用于SpringMVC框架接收数据)

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.core.convert.converter.Converter;
import org.springframework.util.StringUtils;
/**
 * 字符串转换为日期的转换类
 * @author Administrator
 *
 */
public class StringToDateConverter implements Converter<String, Date> {

	@Override
	public Date convert(String text) {
		// TODO Auto-generated method stub
		Date date = null;
		if (StringUtils.hasLength(text)) {
			
			SimpleDateFormat sdf = null;
			int lenth = text.length();// 获取字符串的长度
			switch (lenth) {
			case 10:
				sdf = new SimpleDateFormat("yyyy-MM-dd");
				break;
			case 19:
				sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
				break;

			default:
				String msg = text + ",参数的长度不合法!";
				throw new IllegalArgumentException(msg);
			}

			try {
				date = sdf.parse(text);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return date;
	}

}

3、解决懒加载序列化的objectMapper(只能解决单向关系)

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
/**
 * 自定义Jackson中的核心解析类
 * @author Administrator
 *
 */
public class CustomMapper extends ObjectMapper{
	/**
	 * 
	 */
	private static final long serialVersionUID = -431687360027624006L;

	public CustomMapper() {
        this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        
        // 设置 SerializationFeature.FAIL_ON_EMPTY_BEANS 为 false
        // 如果在序列化对象的空关联对象时,空的关联对象,将不会参与到对象的序列化
        this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    }

}

4、各种过滤器

1)解决druid中日志监控中的记录日志只保存相关信息的过滤器

import org.apache.log4j.Level;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

public class DruidLogAcceptFilter extends Filter {

	private String keyword;
	private Level level;

	@Override
	public int decide(LoggingEvent event) {
		// TODO Auto-generated method stub
		// 得到正在记录日志的类的类名
		String msg = event.getLocationInformation().getClassName();
		if (msg.contains(keyword) && event.getLevel() == level) {
			return Filter.ACCEPT;
		} else {
			return Filter.DENY;
		}
	}

	public String getKeyword() {
		return keyword;
	}

	public void setKeyword(String keyword) {
		this.keyword = keyword;
	}

	public Level getLevel() {
		return level;
	}

	public void setLevel(Level level) {
		this.level = level;
	}
}

2)解决前端与后端交互乱码问题过滤器

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
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;
/**
 * 中文乱码过滤器
 * 既可以处理POST乱码,又可以处理GET乱码
 * @author 
 *
 */
public class CharacterEncodingFilter implements Filter {

	private String encoding;
	private boolean forceEncoding = false;

	public CharacterEncodingFilter() {
		// TODO Auto-generated constructor stub
	}

	public void destroy() {
		// TODO Auto-generated method stub
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		String method = req.getMethod();
		
		if (forceEncoding) {
			res.setCharacterEncoding(encoding);
		}
		
		if ("POST".equals(method.toUpperCase()) || "PUT".equals(method.toUpperCase())|| "DELETE".equals(method.toUpperCase())) {
			req.setCharacterEncoding(encoding);
			chain.doFilter(req, res);
		} else if ("GET".equals(method.toUpperCase())) {
			HttpServletRequest wrapper = new EncodingHttpServletRequestWrapper(req, encoding);
			chain.doFilter(wrapper, res);
		}
	}

	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		encoding = config.getInitParameter("encoding");
		forceEncoding = Boolean.valueOf(config.getInitParameter("forceEncoding"));
	}

	private static class EncodingHttpServletRequestWrapper extends HttpServletRequestWrapper {

		private HttpServletRequest request;
		private String encoding;

		public EncodingHttpServletRequestWrapper(HttpServletRequest request, String encoding) {
			super(request);
			// TODO Auto-generated constructor stub
			this.request = request;
			this.encoding = encoding;
		}

		@Override
		public String getQueryString() {
			// TODO Auto-generated method stub
			String content = request.getQueryString();

			if (content != null) {
				try {
					content = URLDecoder.decode(content, encoding);
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return content;
		}
		
		@Override
		public Map<String, String[]> getParameterMap() {
			// TODO Auto-generated method stub
			String content = getQueryString();
			//userName=阿斯蒂芬&loginName=1223&pwd=&gender=0&income=2342342342&marry=true&birthday=&hobby=0&hobby=1
			Map<String, String[]> params = new HashMap<String, String[]>();
			// 处理多值的情况
			Map<String, List<String>> multiValues = new HashMap<String, List<String>>();
			if (content != null) {
				String[] tem = content.split("&");
				for (String str : tem) {
					String[] kvs = str.split("=");// userName=撒旦法
					// 需要处理一个提交项有多个值的情况发生
					if (params.containsKey(kvs[0])) {
						// 需要处理checkbox的多值情况,例如:ck=111&ck=222&ck=333
						List<String> valuesList;
						if (multiValues.containsKey(kvs[0])) {// 如果多值集合中已经包含某个键
							valuesList = multiValues.get(kvs[0]);
							if (kvs.length >= 2) {// ck=111
								valuesList.add(kvs[1]);
							} else {
								valuesList.add("");// ck=
							}
						} else {// 如果多值集合中尚未包含某个键
							valuesList = new ArrayList<String>();
							valuesList.add(params.get(kvs[0])[0]);// 初始加入
							if (kvs.length >= 2) {// ck=111
								valuesList.add(kvs[1]);
							} else {// ck=
								valuesList.add("");
							}
							multiValues.put(kvs[0], valuesList);
						}
					} else {
						if (kvs.length >= 2) {// userName=撒旦法
							params.put(kvs[0], new String[] { kvs[1] });
						} else {// userName=
							params.put(kvs[0], new String[] { "" });
						}
					}
				} // for循环结束

				// --------------将多值情况,同样添加到params集合中去-------------
				if (multiValues != null && !multiValues.isEmpty()) {
					Iterator<String> its = multiValues.keySet().iterator();
					while (its.hasNext()) {
						String key = (String) its.next();
						List<String> strs = multiValues.get(key);
						int size = strs.size();// 获得值的个数
						String[] arrays = new String[size];
						for (int i = 0; i < size; i++) {
							arrays[i] = strs.get(i);
						}
						params.put(key, arrays);// 将多值的情况也处理到Map集合中去
					}
				}
			}
			return params;
		}

		@Override
		public String getParameter(String name) {
			// TODO Auto-generated method stub
			Map<String, String[]> params = getParameterMap();
			String val = "";
			if (params != null && params.containsKey(name)) {
				val = params.get(name)[0];
			}
			return val;
		}

		@Override
		public Enumeration<String> getParameterNames() {
			// TODO Auto-generated method stub
			return Collections.enumeration(getParameterMap().keySet());
		}

		@Override
		public String[] getParameterValues(String name) {
			// TODO Auto-generated method stub
			return (String[]) getParameterMap().get(name);
		}
	}

}

3)PUT或DELETE请求转GET请求过滤器

import java.io.IOException;
import java.util.Locale;

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;

/**
 * 请求转发时,如果请求方法是PUT|DELETE,就将请求方法强制的转成GET
 * @author Administrator
 *
 */
public class HttpPUTOrDelete2GetFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req = (HttpServletRequest) arg0;
		String method = req.getMethod().toUpperCase();
		if("PUT".equals(method) || "DELETE".equals(method)) {
			method = "GET";
			HttpServletRequestWrapper wrapper = new HttpMethodRequestWrapper(req, method);
			chain.doFilter(wrapper, arg1);
		}
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

	
	
	private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {

		private final String method;

		public HttpMethodRequestWrapper(HttpServletRequest request, String method) {
			super(request);
			this.method = method.toUpperCase(Locale.ENGLISH);
		}

		@Override
		public String getMethod() {
			return this.method;
		}
	}
}

日期工具类

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日期工具类
 * @author Administrator
 *
 */
public class DateUtil {
	/**
	 * 
	 * @param str 字符串时间
	 * @param pattern 转 换格式,例如:yyyy-MM-dd hh:mm:ss
	 * @return
	 * @throws ParseException 
	 */
	public static Date str2Date(String str,String pattern) throws ParseException {
		if(str == null || "".equals(str)) return null;
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.parse(str);
	}
	
	/**
	 * 
	 * @param date 日期
	 * @param pattern  转 换格式,例如:yyyy-MM-dd hh:mm:ss
	 * @return
	 * @throws ParseException
	 */
	public static String date2Str(Date date,String pattern) throws ParseException {
		if(date == null) return null;
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(date);
	}	
	
}

猜你喜欢

转载自blog.csdn.net/IT_CREATE/article/details/86593310