版权声明:本篇文章由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);
}
}