首先写个注解类,用来标识方法满足切入点
package com.enation.framework.database;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 表示对标记有xxx注解的类,做代理 注解@Retention可以用来修饰注解,是注解的注解,称为元注解。
* Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,
* 这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配
* RententionPolicy使用。RetentionPolicy有3个值:CLASS RUNTIME SOURCE
* 用@Retention(RetentionPolicy
* .CLASS)修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候;
* 用@Retention(RetentionPolicy.SOURCE
* )修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中;
* 用@Retention(RetentionPolicy.RUNTIME
* )修饰的注解,表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,
* 所以他们可以用反射的方式读取。RetentionPolicy.RUNTIME
* 可以让你从JVM中读取Annotation注解的信息,以便在分析程序的时候使用.
*
* 类和方法的annotation缺省情况下是不出现在javadoc中的,为了加入这个性质我们用@Documented
* java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类。
* @interface是一个关键字,在设计annotations的时候必须把一个类型定义为@interface,而不能用class或interface关键字
*
* @author daizequn
*
*/
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MethodLog {
String remark() default "";
String operType() default "0";
// String desc() default "";
}
用户日志实体
package com.enation.app.shop.core.model;
import com.enation.framework.database.DynamicField;
import com.enation.framework.database.PrimaryKeyField;
/**
* 用户日志实体
* @author daizequn
* 2015-12-2
*/
public class Log extends DynamicField {
private Integer log_id;//主键ID
private Integer member_id;//用户id
private String member_uname;//用户账号
private String member_name;//用户昵称
private String method;//操作方法
private String methodargs;//方法参数(暂时不用到)
private String allmethod;//完整操作方法
private String html;//操作页面
private String des;//操作描述
private String ipaddr;//操作ip
private String pointkey;//搜索关键词
private Long staytime;//停留时间
private String opentime;//打开页面时间
private String closetime;//关闭页面时间
@PrimaryKeyField
public Integer getLog_id() {
return log_id;
}
public void setLog_id(Integer log_id) {
this.log_id = log_id;
}
public Integer getMember_id() {
return member_id;
}
public void setMember_id(Integer member_id) {
this.member_id = member_id;
}
public String getMember_uname() {
return member_uname;
}
public void setMember_uname(String member_uname) {
this.member_uname = member_uname;
}
public String getMember_name() {
return member_name;
}
public void setMember_name(String member_name) {
this.member_name = member_name;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public String getMethodargs() {
return methodargs;
}
public void setMethodargs(String methodargs) {
this.methodargs = methodargs;
}
public String getHtml() {
return html;
}
public void setHtml(String html) {
this.html = html;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public String getIpaddr() {
return ipaddr;
}
public void setIpaddr(String ipaddr) {
this.ipaddr = ipaddr;
}
public String getPointkey() {
return pointkey;
}
public void setPointkey(String pointkey) {
this.pointkey = pointkey;
}
public Long getStaytime() {
return staytime;
}
public void setStaytime(Long staytime) {
this.staytime = staytime;
}
public String getOpentime() {
return opentime;
}
public void setOpentime(String opentime) {
this.opentime = opentime;
}
public String getAllmethod() {
return allmethod;
}
public void setAllmethod(String allmethod) {
this.allmethod = allmethod;
}
public String getClosetime() {
return closetime;
}
public void setClosetime(String closetime) {
this.closetime = closetime;
}
}
在spring的xml文件上加上
<!-- 用户日志 -->
<bean id="logManager" class="com.enation.app.shop.core.service.impl.LogManager" parent="baseSupport" />
用户日志接口
package com.enation.app.shop.core.service;
import com.enation.app.shop.core.model.Log;
import com.enation.framework.database.Page;
/**
* 用户日志接口
* 2015-12-2
*/
public interface ILogManager {
/**
* 添加一个用户日志
* @param log
* @return
*/
public int add(Log log);
/**
* 用户行为日志数据
* daizequn 2015-12-6
*/
Page memberBehaviorLogList(int page, int pageSize, String startDate,
String endDate, String sortType);
}
用户日志实现类
package com.enation.app.shop.core.service.impl;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.enation.app.shop.core.model.Log;
import com.enation.app.shop.core.service.ILogManager;
import com.enation.eop.sdk.database.BaseSupport;
import com.enation.framework.database.Page;
/**
* 用户日志操作业务实现
* @author daizequn
* 2015-12-2
*/
public class LogManager extends BaseSupport implements ILogManager {
/**
* 添加用户日志记录
*/
@Transactional(propagation = Propagation.REQUIRED)
public int add(Log log) {
this.baseDaoSupport.insert("log", log);
Integer logid = this.baseDaoSupport.getLastId("log");
log.setLog_id(logid);
return logid;
}
/**
* 用户行为日志数据
* daizequn 2015-12-6
*/
@Override
public Page memberBehaviorLogList(int page, int pageSize, String startDate, String endDate, String sortType) {
// 返回打开页面的时间段内的用户行为日志
StringBuffer sql = new StringBuffer();
sql.append("SELECT g.* FROM es_log g WHERE 1=1 ");
if(startDate!=null&&!"".equals(startDate)){
sql.append(" and g.opentime>= '"+startDate+"'");
}
if(endDate!=null&&!"".equals(endDate)){
sql.append(" and g.closetime<= '"+endDate+"'");
}
if(sortType != null && ("ASC".equals(sortType) || "DESC".equals(sortType))){
sql.append(" ORDER BY g.opentime " + sortType + " ");
}else{
sql.append(" ORDER BY g.opentime DESC ");
}
return this.baseDaoSupport.queryForPage(sql.toString(), page, pageSize, Log.class);
}
}
在spring的xml文件上加上
<bean id="logAction" class="com.enation.app.shop.core.action.api.LogAction" scope="prototype"/>
package com.enation.app.shop.core.action.api;
import java.lang.reflect.Method;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.enation.app.base.core.model.Member;
import com.enation.app.shop.core.model.Log;
import com.enation.app.shop.core.service.impl.LogManager;
import com.enation.app.shop.core.utils.DateUtils;
import com.enation.app.shop.core.utils.IpUtils;
import com.enation.eop.sdk.context.UserConext;
import com.enation.framework.context.spring.SpringContextHolder;
import com.enation.framework.context.webcontext.ThreadContextHolder;
import com.enation.framework.database.MethodLog;
/**
* \
*
* @Aspect 实现spring aop 切面(Aspect):
* 一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring
* AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现。
*
* AOP代理(AOP Proxy): AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。
* 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring
* 2.0最新引入的基于模式(schema-based
* )风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
* @author q
*
*/
@Component
@Aspect
public class LogAction {
/*@Autowired
private ILogManager manager; */
public LogAction() {
System.out.println("Aop");
}
/**
* 在Spring
* 2.0中,Pointcut的定义包括两个部分:Pointcut表示式(expression)和Pointcut签名(signature
* )。让我们先看看execution表示式的格式:
* 括号中各个pattern分别表示修饰符匹配(modifier-pattern?)、返回值匹配(ret
* -type-pattern)、类路径匹配(declaring
* -type-pattern?)、方法名匹配(name-pattern)、参数匹配((param
* -pattern))、异常类型匹配(throws-pattern?),其中后面跟着“?”的是可选项。
*
* @param point
* @throws Throwable
*/
@Pointcut("@annotation(com.enation.framework.database.MethodLog)")
public void methodCachePointcut() {
}
// // @Before("execution(* com.wssys.controller.*(..))")
// public void logAll(JoinPoint point) throws Throwable {
// System.out.println("打印========================");
// }
//
// // @After("execution(* com.wssys.controller.*(..))")
// public void after() {
// System.out.println("after");
// }
// 方法执行的前后调用
// @Around("execution(* com.wssys.controller.*(..))||execution(* com.bpm.*.web.account.*.*(..))")
// @Around("execution(* com.wssys.controller.*(..))")
// @Around("execution(* org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(..))")
//@Around("methodCachePointcut()")
//@Around("execution(* com.enation.app.shop.core.action.api.*(..))")
@Around("methodCachePointcut()")
public Object commit(ProceedingJoinPoint point) throws Throwable {
Member member = UserConext.getCurrentMember();
Object object = null;
if(member!=null){
HttpServletRequest request = ThreadContextHolder.getInstance().getHttpRequest();
String opentime=DateUtils.date2Str(new Date(), "yyyy-MM-dd HH:mm:ss");//操作时间
String ipaddr = IpUtils.getRemoteAddr(request);//操作ip
Integer memberid;//用户id
String memberuname;//用户账号
String membername; //用户账号
memberid=member.getMember_id();
memberuname = member.getUname();
membername = member.getName();
String monthRemark = getMthodRemark(point);
String monthName = point.getSignature().getName();
String packages = point.getThis().getClass().getName();
if (packages.indexOf("$$EnhancerBySpringCGLIB$$") > -1) { // 如果是CGLIB动态生成的类
try {
packages = packages.substring(0, packages.indexOf("$$"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
// Object[] method_param = null;
//
// Object object;
// try {
// method_param = point.getArgs(); //获取方法参数
// // String param=(String) point.proceed(point.getArgs());
object = point.proceed();
// } catch (Exception e) {
// // 异常处理记录日志..log.error(e);
// throw e;
// }
Log log = new Log();
log.setIpaddr(ipaddr);//操作ip
log.setMember_id(memberid);//用户id
log.setMember_uname(memberuname);//用户账号
log.setMember_name(membername);//用户昵称
log.setMethod(packages + "." + monthName); //操作方法
log.setDes(monthRemark); //操作描述
log.setOpentime(opentime);//操作时间
HttpServletRequest httpRequest=(HttpServletRequest)request;
String strBackUrl = "http://" + request.getServerName() //服务器地址
+ ":"
+ request.getServerPort() //端口号
+ httpRequest.getContextPath() //项目名称
+ httpRequest.getServletPath() //请求页面或其他地址
+ "?" + (httpRequest.getQueryString()); //参数
log.setAllmethod(strBackUrl);//完整操作方法
//这里有点纠结 就是不好判断第一个object元素的类型 只好通过 方法描述来 做一一 转型感觉 这里 有点麻烦 可能是我对 aop不太了解 希望懂的高手给予我指点
//有没有更好的办法来记录操作参数 因为参数会有 实体类 或者javabean这种参数怎么把它里面的数据都解析出来?
// if ("删除商品".equals(monthRemark)) {
Member member2 = (Member) method_param[0];
// String method_paramArr="";
// if(method_param.length!=0){
// for(int i=0;i<=method_param.length;i++){
// method_paramArr=method_paramArr+method_param[i];
// }
// log.setMethodargs(method_paramArr);
// }else{
// log.setMethodargs("方法无参(不代表前台没传参数过来)");
// }
// } else {
log.setMethodargs("操作参数:" + method_param[0]);
// }
LogManager manager = SpringContextHolder.getBean("logManager");
manager.add(log);
return object;
}
return point.proceed();
}
// 方法运行出现异常时调用
// @AfterThrowing(pointcut = "execution(* com.wssys.controller.*(..))",
// throwing = "ex")
public void afterThrowing(Exception ex) {
System.out.println("afterThrowing");
System.out.println(ex);
}
// 获取方法的中文备注____用于记录用户的操作日志描述
public static String getMthodRemark(ProceedingJoinPoint joinPoint)
throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] method = targetClass.getMethods();
String methode = "";
for (Method m : method) {
if (m.getName().equals(methodName)) {
Class[] tmpCs = m.getParameterTypes();
if (tmpCs.length == arguments.length) {
MethodLog methodCache = m.getAnnotation(MethodLog.class);
if (methodCache != null) {
methode = methodCache.remark();
}
break;
}
}
}
return methode;
}
}
LogtimeAction
package com.enation.app.shop.core.action.api;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import com.enation.app.base.core.model.Member;
import com.enation.app.shop.core.model.Log;
import com.enation.app.shop.core.service.impl.LogManager;
import com.enation.app.shop.core.utils.DateUtils;
import com.enation.app.shop.core.utils.IpUtils;
import com.enation.eop.sdk.context.UserConext;
import com.enation.framework.action.WWAction;
import com.enation.framework.context.spring.SpringContextHolder;
import com.enation.framework.context.webcontext.ThreadContextHolder;
/**
*
*
* @author Daizequn
*/
@Component
@Scope("prototype")
@ParentPackage("eop_default")
@Namespace("/api/shop")
@Action("logtime")
@SuppressWarnings({ "rawtypes", "unchecked", "serial", "static-access" })
public class LogtimeAction extends WWAction {
private String html;
private String opentime;
private String closetime;
public String addLogtime() {
Member member=UserConext.getCurrentMember();
if(member!=null&&opentime!=null&&closetime!=null&&!closetime.equals(opentime)){
this.showSuccessJson("成功关闭");
Integer memberid;
String memberuname;
String membername;
String pointkey;
HttpServletRequest request = ThreadContextHolder.getInstance().getHttpRequest();
HttpServletRequest httpRequest=(HttpServletRequest)request;
String strBackUrl = "http://" + request.getServerName() //服务器地址
+ ":"
+ request.getServerPort() //端口号
+ httpRequest.getContextPath() //项目名称
+ httpRequest.getServletPath() //请求页面或其他地址
+ "?" + (httpRequest.getQueryString()); //参数
try {
strBackUrl=URLDecoder.decode(strBackUrl,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
memberid=member.getMember_id();
memberuname = member.getUname();
membername = member.getName();
String ipaddr = IpUtils.getRemoteAddr(request);//操作IP
Log log = new Log();
log.setIpaddr(ipaddr);//操作IP
log.setMember_id(memberid);//用户id
log.setMember_uname(memberuname);//用户账号
log.setMember_name(membername);//用户昵称
html=html.replace("//www.ZhUiChaGuOji.org/cn/=**://", "");
try {
html=URLDecoder.decode(html,"utf-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
if(html.contains("search-keyword-")){
pointkey=html.substring(html.indexOf("-")+9);
pointkey=pointkey.replace(".html", "");
log.setPointkey(pointkey);
}
log.setHtml(html);//操作页面
log.setAllmethod(strBackUrl);//完整操作方法
log.setClosetime(closetime);//保存关闭时间
try {
String createtime=DateUtils.getDateStrTime();
log.setOpentime(opentime);//保存打开页面时间
log.setStaytime(DateUtils.getIntervalSecond(opentime, createtime));//停留时间
} catch (Exception e) {
e.printStackTrace();
}
LogManager manager = SpringContextHolder.getBean("logManager");
manager.add(log);
}
return this.JSON_MESSAGE;
}
public String getHtml() {
return html;
}
public void setHtml(String html) {
this.html = html;
}
public String getOpentime() {
return opentime;
}
public void setOpentime(String opentime) {
this.opentime = opentime;
}
public String getClosetime() {
return closetime;
}
public void setClosetime(String closetime) {
this.closetime = closetime;
}
}
@MethodLog(remark = "删除商品")
/**
* 删除购物车一项
*
* @param cartid
* :要删除的购物车id,int型,即 CartItem.item_id
*
* @return 返回json字串 result 为1表示调用成功0表示失败 message 为提示信息
*
* {@link CartItem }
*/
@MethodLog(remark = "删除商品")
public String delete() {
try {
HttpServletRequest request = ThreadContextHolder.getInstance().getHttpRequest();
String cartid = request.getParameter("cartid");
cartManager.delete(request.getSession().getId(), Integer.valueOf(cartid));
this.showSuccessJson("删除成功");
} catch (RuntimeException e) {
this.logger.error("删除购物项失败", e);
this.showErrorJson("删除购物项失败");
}
return this.JSON_MESSAGE;
}
工具类
package com.enation.app.shop.core.utils;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* @author HuangGenFa
* @create-Date:2008-3-25
* @desc:用于转换日期,和获得当前日期
*
*/
public class DateUtils {
public DateUtils() {
}
/**
* 日期时间,去掉时间
*
* @param date
* 2008-05-05 12:00:00.0
* @return String 如:2008-05-05
*/
public static String getDateToString(Date date) {
String datetime = "";
if (date != null) {
datetime = date.toString();
String writedate[] = datetime.split(" ");
datetime = writedate[0];
}
return datetime;
}
public static String date2Str(Date date, String fmtDate) {
String strRtn = null;
if (date == null) {
return "";
}
if (fmtDate.length() == 0) {
fmtDate = "yyyy/MM/dd";
}
Format fmt = new SimpleDateFormat(fmtDate);
try {
strRtn = fmt.format(date);
} catch (Exception e) {
// e.printStackTrace();
}
return strRtn;
}
/**
* 转换日期,格式化形式为yyyy-MM-dd hh:mm:ss的字符串 例如:2008-8-8 8:08:08
*
* @return Date
* @throws Exception
* @author CaiMingXi
*/
public static Date str2Date2mmss(String dateStr) throws Exception {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = sdf.parse(dateStr);
return date;
}
/**
* dateStr字符串日期转为date
* @param dateStr
* @return
* @throws Exception
*/
public static Date st2Date(String dateStr) throws Exception {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(dateStr);
return date;
}
/**
* 根据日期字符串和转换形式,转换为日期
*
* @return Date
* @throws Exception
*/
public static Date str2Date(String dateStr, String fmtDate)
throws Exception {
Date date = new Date();
if (fmtDate.length() == 0) {
fmtDate = "yyyy-MM-dd";
}
SimpleDateFormat sdf = new SimpleDateFormat(fmtDate);
date = sdf.parse(dateStr);
return date;
}
/**
* 得到当前日期,格式化形式为yyyy-MM-dd的字符串
*
* @throws Exception
* @return String
*/
public static String getDateStr() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date now = new Date();
String today = sdf.format(now).toString();
return today;
}
/**
* 得到当前日期,格式化形式为yyyy-MM-dd的字符串
*
* @throws Exception
* @return String
*/
public static String getDateStrZ() throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date now = new Date();
String today = sdf.format(now).toString();
return today;
}
/**
* 得到当前日期,格式化形式为yyyy-MM-dd hh:mm:ss的字符串 例如:2008-8-8 8:08:08
*
* @throws Exception
* @author CaiMingXi
* @return String
*/
public static String getDateStrTime() throws Exception {
String today = "";
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date now = new Date();
today = sdf.format(now).toString();
return today;
}catch(Exception ec){
ec.printStackTrace();
}
return today;
}
/**
* ==============================================================================================================================
* 将数字日期转换为中文 HuangGenFa 2008-7-12
*/
private static final String[] NUMBERS = { "O", "一", "二", "三", "四", "五",
"六", "七", "八", "九" };
/** 通过 yyyy-MM-dd 得到中文大写格式 yyyy MM dd 日期 */
public static synchronized String toChinese(String str) {
StringBuffer sb = new StringBuffer();
sb.append(getSplitDateStr(str, 0)).append("年").append(
getSplitDateStr(str, 1)).append("月").append(
getSplitDateStr(str, 2)).append("日");
return sb.toString();
}
/** 分别得到年月日的大写 默认分割符 "-" */
public static String getSplitDateStr(String str, int unit) {
// unit是单位 0=年 1=月 2日
String[] DateStr = str.split("-");
if (unit > DateStr.length)
unit = 0;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < DateStr[unit].length(); i++) {
if ((unit == 1 || unit == 2) && Integer.valueOf(DateStr[unit]) > 9) {
sb.append(convertNum(DateStr[unit].substring(0, 1)))
.append("十").append(
convertNum(DateStr[unit].substring(1, 2)));
break;
} else {
sb.append(convertNum(DateStr[unit].substring(i, i + 1)));
}
}
if (unit == 1 || unit == 2) {
return sb.toString().replaceAll("^一", "").replace("O", "");
}
return sb.toString();
}
/** 转换数字为大写 */
private static String convertNum(String str) {
return NUMBERS[Integer.valueOf(str)];
}
/** 判断是否是零或正整数 */
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
return true;
}
/**
* @author CaiMingXi 将一个日期字符串转化成Calendar
* @return Calendar
*/
public static Calendar switchStringToCalendar(String sDate) {
Date date = switchStringToDate(sDate);
Calendar c = Calendar.getInstance();
c.setTime(date);
return c;
}
/**
* @author CaiMingXi 自定义日期返回相差天数的日期 例 第一个参数 2008-9-6 第二个参数为 7 那么返回值为
* 2008-8-30
* @param sDate
* 日期字符串
* @param n
* 相差的天数
* @return String
*/
public static String switchStringToDate(String sDate, int n) {
Calendar c = switchStringToCalendar(sDate);
c.add(Calendar.DAY_OF_MONTH, -n);
return "" + c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-"
+ c.get(Calendar.DATE);
}
/**
* @author CaiMingXi 自定义日期返回相差天数的日期 例 第一个参数 2008-9-6 第二个参数为 7 那么返回值为
* 2008-9-13
* @param sDate
* 日期字符串
* @param n
* 相差的天数
* @return String
*/
public static String switchStringHToDate(String sDate, int n) {
Calendar c = switchStringToCalendar(sDate);
c.add(Calendar.DAY_OF_MONTH, +n);
return "" + c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-"
+ c.get(Calendar.DATE);
}
/**
* 返回相差天数的日期
* @param date 日期
* @param days 天数
* @return
*/
public static Date switchToDate(Date date,int days) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DAY_OF_MONTH,+days);
return c.getTime();
}
/**
* 返回相差月数的日期
* @param date 日期
* @param month 月数
* @return
*/
public static Date switchToMonth(Date date,int month) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.MONTH, 1);
return c.getTime();
}
/**
* @author CaiMingXi 取得系统当前时间前n天,格式为yyyy-mm-dd
* @param n
* 相差的天数
* @return String
*/
public static String getNDayBeforeCurrentDate(int n) {
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -n);
return "" + c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-"
+ c.get(Calendar.DATE);
}
/**
* @author CaiMingXi 取得系统当前时间后n天,格式为yyyy-mm-dd
* @param n
* 相差的天数
* @return String
*/
public static String getHDayBeforeCurrentDate(int n) {
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, +n);
return "" + c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-"
+ c.get(Calendar.DATE);
}
/**
* @author CaiMingXi 输入两个字符串型的日期,比较两者的大小
* @return boolean
*/
public static boolean compareTwoDateBigOrSmall(String fromDate,
String toDate) {
Date dateFrom = switchStringToDate(fromDate);
Date dateTo = switchStringToDate(toDate);
if (dateFrom.before(dateTo)) {
return true;
} else {
return false;
}
}
/**
* @author CaiMingXi 将一个日期字符串转化成日期
* @return Date
*/
public static Date switchStringToDate(String sDate) {
Date date = null;
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
date = df.parse(sDate);
} catch (Exception e) {
// System.out.println("日期转换失败:" + e.getMessage());
}
return date;
}
/**
* @author CaiMingXi 比较日期返回天数
* @return int
*/
public static int getDifferDays(String strBegin, String strEnd) {
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = null, date2 = null;
int days = 0;
try {
date1 = f.parse(strBegin);
date2 = f.parse(strEnd);
days = (int) ((date2.getTime() - date1.getTime()) / 86400000);
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
return days;
}
/**
* @author ZhaiZhengqiang 比较日期返回天数
* @return int
*/
public static int getDifferDays(Date begin, Date end) {
int days = (int)((end.getTime() - begin.getTime()) / 86400000);
return days;
}
public static int getDifferDays2(Date begin, Date end) {
SimpleDateFormat smdf = new SimpleDateFormat("yyyy-MM-dd");
String start = smdf.format(begin);
String end2 = smdf.format(end);
int days=getDifferDays(start, end2);
return days;
}
/**
* 计算两个日期之间相差的月数
* @param date1
* @param date2
* @return
*/
public static int getMonths(Date date1, Date date2){
int iMonth = 0;
int flag = 0;
try{
Calendar objCalendarDate1 = Calendar.getInstance();
objCalendarDate1.setTime(date1);
Calendar objCalendarDate2 = Calendar.getInstance();
objCalendarDate2.setTime(date2);
if (objCalendarDate2.equals(objCalendarDate1))
return 0;
if (objCalendarDate1.after(objCalendarDate2)){
Calendar temp = objCalendarDate1;
objCalendarDate1 = objCalendarDate2;
objCalendarDate2 = temp;
}
if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1.get(Calendar.DAY_OF_MONTH))
flag = 1;
if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1.get(Calendar.YEAR))
iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1.get(Calendar.YEAR))
* 12 + objCalendarDate2.get(Calendar.MONTH) - flag)
- objCalendarDate1.get(Calendar.MONTH);
else
iMonth = objCalendarDate2.get(Calendar.MONTH)
- objCalendarDate1.get(Calendar.MONTH) - flag;
} catch (Exception e){
e.printStackTrace();
}
return iMonth;
}
private static String HanDigiStr[] = new String[] { "零", "壹", "贰", "叁",
"肆", "伍", "陆", "柒", "捌", "玖" };
private static String HanDiviStr[] = new String[] { "", "拾", "佰", "仟", "万",
"拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾",
"佰", "仟", "万", "拾", "佰", "仟" };
/**
* 输入字符串必须正整数,只允许前导空格(必须右对齐),不宜有前导零
* @param NumStr
* @return
* @author CaiMingXi
*/
private static String PositiveIntegerToHanStr(String NumStr) {
String RMBStr = "";
boolean lastzero = false;
boolean hasvalue = false; // 亿、万进位前有数值标记
int len, n;
len = NumStr.length();
if (len > 15)
return "数值过大!";
for (int i = len - 1; i >= 0; i--) {
if (NumStr.charAt(len - i - 1) == ' ')
continue;
n = NumStr.charAt(len - i - 1) - '0';
if (n < 0 || n > 9)
return "输入含非数字字符!";
if (n != 0) {
if (lastzero)
RMBStr += HanDigiStr[0]; // 若干零后若跟非零值,只显示一个零
// 除了亿万前的零不带到后面
// if( !( n==1 && (i%4)==1 && (lastzero || i==len-1) ) ) //
// 如十进位前有零也不发壹音用此行
if (!(n == 1 && (i % 4) == 1 && i == len - 1)) // 十进位处于第一位不发壹音
RMBStr += HanDigiStr[n];
RMBStr += HanDiviStr[i]; // 非零值后加进位,个位为空
hasvalue = true; // 置万进位前有值标记
} else {
if ((i % 8) == 0 || ((i % 8) == 4 && hasvalue)) // 亿万之间必须有非零值方显示万
RMBStr += HanDiviStr[i]; // “亿”或“万”
}
if (i % 8 == 0)
hasvalue = false; // 万进位前有值标记逢亿复位
lastzero = (n == 0) && (i % 4 != 0);
}
if (RMBStr.length() == 0)
return HanDigiStr[0]; // 输入空字符或"0",返回"零"
return RMBStr;
}
/** 数字转换大写
* @param val
* @return 字符串 返回大写字符串
* @createDate 2009-4-17
*/
public static String NumToRMBStr(double val) {
String SignStr = "";
String TailStr = "";
long fraction, integer;
int jiao, fen;
if (val < 0) {
val = -val;
SignStr = "负";
}
if (val > 99999999999999.999 || val < -99999999999999.999)
return "数值位数过大!";
// 四舍五入到分
long temp = Math.round(val * 100);
integer = temp / 100;
fraction = temp % 100;
jiao = (int) fraction / 10;
fen = (int) fraction % 10;
if (jiao == 0 && fen == 0) {
TailStr = "整";
} else {
TailStr = HanDigiStr[jiao];
if (jiao != 0)
TailStr += "角";
if (integer == 0 && jiao == 0) // 零元后不写零几分
TailStr = "";
if (fen != 0)
TailStr += HanDigiStr[fen] + "分";
}
// 下一行可用于非正规金融场合,0.03只显示“叁分”而不是“零元叁分”
// if( !integer ) return SignStr+TailStr;
return "¥" + SignStr + PositiveIntegerToHanStr(String.valueOf(integer))
+ "元" + TailStr;
}
/**
* 返回乘以10000以后的值
* @param val
* @return
* @author CaiMingXi
*/
public static String NumToRMBStrW(double val) {
String SignStr = "";
String TailStr = "";
long fraction, integer;
int jiao, fen;
if (val < 0) {
val = -val;
SignStr = "负";
}
if (val > 99999999999999.999 || val < -99999999999999.999)
return "数值位数过大!";
// 四舍五入到分
long temp = Math.round(val * 100);
integer = temp / 100;
fraction = temp % 100;
jiao = (int) fraction / 10;
fen = (int) fraction % 10;
if (jiao == 0 && fen == 0) {
TailStr = "整";
} else {
TailStr = HanDigiStr[jiao];
if (jiao != 0)
TailStr += "角";
if (integer == 0 && jiao == 0) // 零元后不写零几分
TailStr = "";
if (fen != 0)
TailStr += HanDigiStr[fen] + "分";
}
// 下一行可用于非正规金融场合,0.03只显示“叁分”而不是“零元叁分”
// if( !integer ) return SignStr+TailStr;
// 返回乘以10000以后的值
return SignStr + PositiveIntegerToHanStr(String.valueOf(integer)) + "元"
+ TailStr;
}
/**
* @author dzq 比较日期返回分钟
* @return Long
*/
public static Long getIntervalMini(String strSmall, String strBig) {
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long date1=0L;
long date2=0L;
long mini=0L;
try {
date1 = f.parse(strSmall).getTime();
date2=f.parse(strBig).getTime();
mini=((date2-date1)/1000);
} catch (ParseException e) {
e.printStackTrace();
}
return (mini/60);
}
/**
* @author dzq 比较日期返回分钟
* @return Long
*/
public static Long getIntervalSecond(String strSmall, String strBig) {
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long date1=0L;
long date2=0L;
long second=0L;
try {
date1 = f.parse(strSmall).getTime();
date2=f.parse(strBig).getTime();
second=((date2-date1)/1000);
} catch (ParseException e) {
e.printStackTrace();
}
return (second);
}
/**
* 返回 增加月份后的日期=日期+加上期限(月份数)
* @author dzq
* @param date 日期
* @param expires 期限
* @return String
*/
public static String addExpires(Date date, Integer expires) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, expires);
Date nDate = calendar.getTime();
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String newDate=f.format(nDate);
return newDate;
}
/**
* 返回 增加月份后的日期=日期+加上期限(月份数)
* @author dzq
* @param date 日期
* @param expires 期限
* @return Date
*/
public static Date addExpiresDate(Date date, Integer expires) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, expires);
Date nDate = calendar.getTime();
return nDate;
}
/**
* ==============================================================================================================================
*/
public static void main(String[] args) {
// String fromDate = "2008-10-6";
// String toDate = "2008-10-9";
// Date dateFrom = switchStringToDate(fromDate);
// Date dateTo = switchStringToDate(toDate);
try {
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
// int d = getDifferDays2(new Date(),DateUtil.getMonthLastDate(new Date()));
// System.out.println(getDateStrTime());
System.out.println(getIntervalSecond("2015-12-04 10:12:10", "2015-12-05 10:13:10"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println(DateUtils.getIntervalMini("2011-06-11 08:17:15", "2011-06-13 08:17:15"));
}
}
package com.enation.app.shop.core.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
public class DateUtil {
private static final String PATTERN_DATE = "yyyy-MM-dd";
private static final String PATTERN_TIME = "HH:mm:ss";
private static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
private static final String PATTERN_FULL = "yyyy-MM-dd HH:mm:ss.SSS";
public static final Date parse(String pattern, String source) {
try {
return new SimpleDateFormat(pattern, Locale.US).parse(source);
} catch (ParseException e) {
throw new RuntimeException("parse date error : ", e);
}
}
public static final Date parseDateTime(String source) {
try {
return new SimpleDateFormat(PATTERN_DATETIME).parse(source);
} catch (ParseException e) {
throw new RuntimeException("parse date error : ", e);
}
}
public static final Date parseDate(String source) {
try {
return new SimpleDateFormat(PATTERN_DATE).parse(source);
} catch (ParseException e) {
throw new RuntimeException("parse date error : ", e);
}
}
public static final Date parseTime(String source) {
try {
return new SimpleDateFormat(PATTERN_TIME).parse(source);
} catch (ParseException e) {
throw new RuntimeException("parse date error : ", e);
}
}
public static final Date parseFull(String source) {
try {
return new SimpleDateFormat(PATTERN_FULL).parse(source);
} catch (ParseException e) {
throw new RuntimeException("parse date error : ", e);
}
}
public static final String format(String pattern, Date date) {
return new SimpleDateFormat(pattern, Locale.US).format(date);
}
public static final String formatDateTime(Date date) {
return new SimpleDateFormat(PATTERN_DATETIME).format(date);
}
public static final String formatDate(Date date) {
return new SimpleDateFormat(PATTERN_DATE).format(date);
}
public static final String formatTime(Date date) {
return new SimpleDateFormat(PATTERN_TIME).format(date);
}
public static final String formatFull(Date date) {
return new SimpleDateFormat(PATTERN_FULL).format(date);
}
public static final String format(String outPatt, String inPatt, String source) {
return format(outPatt, parse(inPatt, source));
}
public static final String getTimestamp(String pattern) {
return format(pattern, new Date());
}
public static final int calDValueOfYear(Date fromDate, Date toDate) {
Calendar sCal = Calendar.getInstance();
Calendar eCal = Calendar.getInstance();
sCal.setTime(fromDate);
eCal.setTime(toDate);
return eCal.get(Calendar.YEAR) - sCal.get(Calendar.YEAR);
}
public static final int calDValueOfMonth(Date fromDate, Date toDate) {
Calendar sCal = Calendar.getInstance();
Calendar eCal = Calendar.getInstance();
sCal.setTime(fromDate);
eCal.setTime(toDate);
return 12 * (eCal.get(Calendar.YEAR) - sCal.get(Calendar.YEAR)) + (eCal.get(Calendar.MONTH) - sCal.get(Calendar.MONTH));
}
public static final int calDValueOfDay(Date fromDate, Date toDate) {
return (int) ((toDate.getTime() - fromDate.getTime()) / (1000 * 60 * 60 * 24));
}
public static final Date getFirstDayOfMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
public static final Date getFirstDayOfWeek(Date date) {
return getFirstDayOfWeek(date, Calendar.MONDAY);
}
public static final Date getLastDayOfWeek(Date date) {
return getLastDayOfWeek(date, Calendar.MONDAY);
}
public static final Date getFirstDayOfWeek(Date date, int firstDayOfWeek) {
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(firstDayOfWeek);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
public static final Date getLastDayOfWeek(Date date, int firstDayOfWeek) {
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(firstDayOfWeek);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.add(Calendar.DAY_OF_YEAR, 7);
calendar.add(Calendar.MILLISECOND, -1);
return calendar.getTime();
}
public static final Date[] getWeek(Date date) {
return getWeek(date, Calendar.MONDAY);
}
public static final Date[] getWeek(Date date, int firstDayOfWeek) {
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(firstDayOfWeek);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date firstDate = calendar.getTime();
calendar.add(Calendar.DAY_OF_YEAR, 7);
calendar.add(Calendar.MILLISECOND, -1);
Date lastDate = calendar.getTime();
return new Date[] { firstDate, lastDate };
}
public static java.sql.Date toSQLDate(Date date) {
return new java.sql.Date(date.getTime());
}
public static java.sql.Date getSQLDate() {
return new java.sql.Date(System.currentTimeMillis());
}
public static java.sql.Timestamp getSQLTimestamp() {
return new java.sql.Timestamp(System.currentTimeMillis());
}
public static java.sql.Timestamp getTimestamp(int day) {
return new java.sql.Timestamp(System.currentTimeMillis()+24*60*60*1000*day);
}
public static Date add(Date date, int field, int increment) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(field, increment);
return cal.getTime();
}
public static Date set(Date date, int field, int value) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(field, value);
return cal.getTime();
}
/**
* 当月第一天
* @return
*/
public static Date getMonthFirstDate(){
Calendar curCal = Calendar.getInstance();
curCal.set(Calendar.DAY_OF_MONTH, 1);
return curCal.getTime();
}
/**
* 当月最后一天
* @return
*/
public static Date getMonthLastDate(){
Calendar curCal = Calendar.getInstance();
curCal.set(Calendar.DATE, 1);
curCal.roll(Calendar.DATE, - 1);
return curCal.getTime();
}
/**
* 当月最后一天
* @return
*/
public static Date getMonthLastDate(Date date){
Calendar curCal = Calendar.getInstance();
curCal.setTime(date);
curCal.set(Calendar.DATE, 1);
curCal.roll(Calendar.DATE, - 1);
return curCal.getTime();
}
/**
* 当月最后一天
* @return
*/
public static Date getSqMonthLastDate(Date date, Integer sq){
Calendar curCal = Calendar.getInstance();
curCal.setTime(date);
curCal.add(Calendar.MONTH, sq);
curCal.set(Calendar.DATE, 1);
curCal.roll(Calendar.DATE, - 1);
return curCal.getTime();
}
/**
* 获取一个月以前
* @return
*/
public static Date getMonthBefore(){
return DateUtil.getNDatesBefore(-30);
}
/**
* 获取多少天之前
* n为正数是,表示多少天后
* 负数时,表示多少天前
* @param n
* @return
*/
public static Date getNDatesBefore(Integer n){
Calendar curCal = Calendar.getInstance();
curCal.add(Calendar.DATE, n);
return curCal.getTime();
}
public Integer getMonthWeekCount(Date date){
Calendar c = Calendar.getInstance();
int week = c.get(Calendar.WEEK_OF_MONTH);//获取是本月的第几周
return week;
}
/**
* 给任意一个日期,输出当周的周一
* 周日要回退几天
* @return
*/
public static Date getMonday(Date date) {
Calendar curCal = Calendar.getInstance();
curCal.setTime(date);
int week = curCal.get(Calendar.DAY_OF_WEEK);
//周日的话回退几天,找周一
if(week == Calendar.SUNDAY)
curCal.add(Calendar.DATE, -3);
curCal.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);
return curCal.getTime();
}
public static void main(String[] args) {
System.out.println(DateUtil.getTimestamp("yyyyMMdd"));
String str=DateUtil.formatDate(DateUtil.add(new Date(), Calendar.DAY_OF_YEAR, -30));
System.out.println(str);
}
}
package com.enation.app.shop.core.utils;
import java.io.Serializable;
public class IpInfo implements Serializable {
private static final long serialVersionUID = 1L;
private String region;// 省
private String city;// 市
private String county;// 区
private String isp;// ISP公司
private String citySimpleName;// 市级简称
public IpInfo() {
super();
}
public IpInfo(String region, String city) {
super();
this.region = region;
this.city = city;
}
public IpInfo(String region, String city, String county) {
super();
this.region = region;
this.city = city;
this.county = county;
}
public String getRegion() {
return region;
}
public void setRegion(String region) {
this.region = region;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCounty() {
return county;
}
public void setCounty(String county) {
this.county = county;
}
public String getIsp() {
return isp;
}
public void setIsp(String isp) {
this.isp = isp;
}
public String getCitySimpleName() {
if (city != null) {
citySimpleName = city.replace("市", "").replace("地区", "");
}
return citySimpleName;
}
public void setCitySimpleName(String citySimpleName) {
this.citySimpleName = citySimpleName;
}
}
package com.enation.app.shop.core.utils;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class IpUtils {
/**
* 获得用户远程地址
*/
public static String getRemoteAddr(HttpServletRequest request) {
String remoteAddr = request.getHeader("X-Real-IP");
if (StringUtils.isNotBlank(remoteAddr)) {
remoteAddr = request.getHeader("X-Forwarded-For");
} else if (StringUtils.isNotBlank(remoteAddr)) {
remoteAddr = request.getHeader("Proxy-Client-IP");
} else if (StringUtils.isNotBlank(remoteAddr)) {
remoteAddr = request.getHeader("WL-Proxy-Client-IP");
}
return remoteAddr != null ? remoteAddr : request.getRemoteAddr();
}
public static void main(String[] args) {
String ip = "183.58.24.176";
try {
IpInfo ipInfo = IpUtils.getIpInfo(ip);
// System.out.println(ipInfo.getRegion() + ipInfo.getCity()
// + ipInfo.getCounty() + " " + ipInfo.getIsp());
System.out.println(ipInfo.getCity()
+ ipInfo.getCounty() );
} catch (Exception e) {
e.printStackTrace();
}
}
public static IpInfo getIpInfo(HttpServletRequest request) {
String ip = getRemoteAddr(request);
IpInfo ipInfo = getIpInfo(ip);
if (ipInfo == null || StringUtils.isBlank(ipInfo.getCity())) {
ipInfo = new IpInfo();
}
System.out.println("访问ip:" + ip + " " + ipInfo.getRegion()
+ ipInfo.getCity() + ipInfo.getCounty() + " "
+ ipInfo.getIsp());
return ipInfo;
}
/**
* 获取地址
*
* @param ip
* @param encoding
* @return
* @throws Exception
*/
public static IpInfo getIpInfo(String ip) {
String path = "http://ip.taobao.com/service/getIpInfo.php";
String params = "ip=" + ip;
String returnStr = doGet(path, params, "utf-8");
if (returnStr != null) {
Gson gson = new Gson();
JsonParser parser = new JsonParser();
JsonObject json = parser.parse(returnStr).getAsJsonObject();
if ("0".equals(json.get("code").toString())) {
return gson.fromJson(json.get("data"), IpInfo.class);
}
}
return null;
}
/**
* 从url获取结果
*
* @param path
* @param params
* @param encoding
* @return
*/
public static String doGet(String path, String params, String encoding) {
URL url = null;
HttpURLConnection connection = null;
try {
url = new URL(path);
connection = (HttpURLConnection) url.openConnection();// 新建连接实例
connection.setConnectTimeout(2000);// 设置连接超时时间,单位毫秒
connection.setReadTimeout(2000);// 设置读取数据超时时间,单位毫秒
connection.setDoInput(true);// 是否打开输入流true|false
connection.setDoOutput(true);// 是否打开输出流true|false
connection.setRequestMethod("GET");// 提交方法POST|GET
connection.setUseCaches(false);// 是否缓存true|false
connection.connect();// 打开连接端口
DataOutputStream out = new DataOutputStream(
connection.getOutputStream());
out.writeBytes(params);
out.flush();
out.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream(), encoding));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
reader.close();
return buffer.toString();
} catch (SocketTimeoutException socketTimeoutException) {
return null;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();// 关闭连接
}
}
return null;
}
}
html页面
var opentime;//打开页面的时间
var closetime;//关闭页面的时间
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
function checkLeave(){
closetime = new Date().Format("yyyy-MM-dd hh:mm:ss");
var html=window.location.href;
/* event.returnValue="确定离开当前页面吗?"+html; */
$.ajax({
url:"${ctx}/api/shop/logtime!addLogtime.do?ajax=yes",
dataType:"json",
cache: true,
data:{
opentime:opentime,
closetime:closetime,
html:html
},
success:function(result){
if(result.result==1){
}else{
/* layer.msg("出错了", { icon: 7,time: 2000 }, function(){}); */
}
/* layer.close(index); */
},
error:function(){
/* layer.close(index); */
/* layer.msg("出错了:(", { icon: 7,time: 2000 }, function(){}); */
}
});
}
$(function(){
opentime = new Date().Format("yyyy-MM-dd hh:mm:ss");
});