jfinal记录操作日志,Java注解

本文介绍Java注解的使用方法及如何利用注解进行日志记录。探讨了注解保留策略、作用目标及元注解的应用。并通过示例展示了如何创建自定义注解来标记需要记录日志的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/** 类注解
 * @author jinqingmo
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface FieldTypeAnnotation {   
public String module() default "moduledesc"; 
public String value() default "classdesc";

}


/** 方法注解
 * @author jinqingmo
 *
 */
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyAnnotationMethod {
public String desc() default "methoddesc";
}


新建一个全局拦截器,在intercept(Invocation inv)方法中

HttpServletRequest request = inv.getController().getRequest();
Class clz = inv.getController().getClass();

boolean clzHasNnno = clz.isAnnotationPresent(FieldTypeAnnotation.class);
if (clzHasNnno) {
FieldTypeAnnotation annotation = (FieldTypeAnnotation) clz.getAnnotation(FieldTypeAnnotation.class);
moduleDesc = annotation.module();  //类注解
classDesc = annotation.value();//类注解
}


取方法注解值

Method[] methods = clz.getDeclaredMethods();
for (Method methodtest : methods) {
boolean methodHasAnno = methodtest.isAnnotationPresent(MyAnnotationMethod.class);
if (methodHasAnno) {
MyAnnotationMethod methodAnno = methodtest.getAnnotation(MyAnnotationMethod.class);
if (methodtest.getName().equals(methodName)) {
methodDesc = methodAnno.desc();
}
}
}


/**
* 获取客户端IP地址

* @param request
* @return
*/
public static String getIpAddr(HttpServletRequest request) {
// String ip="";
// 1.首先考虑有反向代理的情况,如果有代理,通过“x-forwarded-for”获取真实ip地址
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}


/**
* 获取浏览器版本信息

* @param request
* @return
*/
public static String getBrowser(HttpServletRequest request) {
String browserDetails = request.getHeader("User-Agent");
String userAgent = browserDetails;
if(userAgent!=null) {
String user = userAgent.toLowerCase();
String browser = "";
if (user.contains("edge")) {
browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
} else if (user.contains("msie")) {
String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1];
} else if (user.contains("safari") && user.contains("version")) {
browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0] + "-"
+ (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
} else if (user.contains("opr") || user.contains("opera")) {
if (user.contains("opera")) {
browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0] + "-"
+ (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
} else if (user.contains("opr")) {
browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
.replace("OPR", "Opera");
}


} else if (user.contains("chrome")) {
browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
} else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1)
|| (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1)
|| (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1)) {
browser = "Netscape-?";


} else if (user.contains("firefox")) {
browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
} else if (user.contains("rv")) {
String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1);
} else {
browser = "UnKnown, More-Info: " + userAgent;
}
return browser;
}
return null;

}


/**
* 获取操作系统信息

* @param request
* @return
*/
public static String getOs(HttpServletRequest request) {
String browserDetails = request.getHeader("User-Agent");
String userAgent = browserDetails;
String os = "";
if (userAgent.toLowerCase().indexOf("windows") >= 0) {
os = "Windows";
} else if (userAgent.toLowerCase().indexOf("mac") >= 0) {
os = "Mac";
} else if (userAgent.toLowerCase().indexOf("x11") >= 0) {
os = "Unix";
} else if (userAgent.toLowerCase().indexOf("android") >= 0) {
os = "Android";
} else if (userAgent.toLowerCase().indexOf("iphone") >= 0) {
os = "IPhone";
} else {
os = "UnKnown, More-Info: " + userAgent;
}
return os;
}



 

1.java中元注解有四个:@Retention @Target @Document @Inherited;

   1)@Retention:注解的保留位置(有三个值,枚举类型)

   2)@Retention(RetentionPolicy.SOURCE) 

 //注解仅存在于源码中,在class字节码档中不包含

3) @Retention(RetentionPolicy.CLASS)    

// 默认的保留策略,注解会在class字节码档中存在,但运行时无法获得。

4) @Retention(RetentionPolicy.RUNTIME)

 // 注解会在class字节码档中存在,在运行时可以通过反射获取到。

2.@Target:注解的作用目标 

        @Target(ElementType.TYPE)   //界面、类、枚举、注解

        @Target(ElementType.FIELD) //字段、枚举的常量

        @Target(ElementType.METHOD)//方法

        @Target(ElementType.PARAMETER)//方法参数

        @Target(ElementType.CONSTRUCTOR)  //构造函数

        @Target(ElementType.LOCAL_VARIABLE)//局部变量

        @Target(ElementType.ANNOTATION_TYPE)//注解

        @Target(ElementType.PACKAGE)///包  

3. @Document:说明该注解将被包含在javadoc中

4. @Inherited:说明子类可以继承父类中的该注解

Annotation []aArray=Class.forName("Test").getMethod("info").getAnnotations();   //获取Class实例的方法1

for(Annotation an : aArray){

system.out.println(an);

}

建议定一个注解,将需要记录日志的地方通过注解表示,并且配置当前操作相关信息,比如:新增用户,删除用户,更新用户。

然后做一个拦截器或者AOP,读取拦截方法的日志注解,并且读取配置的注解信息,如果你要记录请求的详细信息,可以把所有的请求参数都保存到数据库,为了确保日志记录不印象正常的业务流程或者执行效率,可以考虑采取异步执行的方式(具体可以看看jdk的Executor),这样就可以在不印象正常业务的情况下记录日志。

获得客户端真实IP地址的方法一:

1.    public String getRemortIP(HttpServletRequest request) {  

2.      if (request.getHeader("x-forwarded-for") == null) {  

3.       return request.getRemoteAddr();  

4.      }  

5.      return request.getHeader("x-forwarded-for");  

6.     }  

 

获得客户端真实IP地址的方法二:

 

1.    public String getIpAddr(HttpServletRequest request) {  

2.           String ip = request.getHeader("x-forwarded-for");  

3.           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  

4.               ip = request.getHeader("Proxy-Client-IP");  

5.           }  

6.           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  

7.               ip = request.getHeader("WL-Proxy-Client-IP");  

8.           }  

9.           if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  

10.             ip = request.getRemoteAddr();  

11.         }  

12.         return ip;  

13.     }  

 

 

 

jfinal 获取服务器的IP和端口。

String serverIp =getRequest().getServerName();

Integer serverPort =getRequest().getServerPort();

一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double 等。

然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。

所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类Number 的子类。

xxxValue() 方法用于将 Number 对象转换为 xxx 数据类型的值并返回。相关的方法有:byteValue() ,doubleValue() ,floatValue(),intValue(),longValue(),shortValue()

 

 

 


 

null和""的区别
问题一:
null和""的区别
String s=null;
string.trim()就会抛出为空的exception   
String s="";   
string.trim()就不会抛,为什么? 
答:NULL代表声明了一个空对象,根本就不是一个字符串。   
""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。
NULL代表声明了一个空对象,对空对象做任何操作都不行的,除了=和==  
""是一个字符串了,只是这个字符串里面没有内容了。

 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值