栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

注解、Python和获取操作人IP记录日志

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

注解、Python和获取操作人IP记录日志

自定义注解 @EpEnableSetNull
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EpEnableSetNull {
}

自定义注解关注点:注解的作用域和注解类型保留的生命周期

@ElementType 作用域
public enum ElementType {
    
    
    TYPE,

    
    
    FIELD,

    
    
    METHOD,

    
    
    PARAMETER,

    
    
    CONSTRUCTOR,

    
    
    LOCAL_VARIABLE,

    
    
    ANNOTATION_TYPE,

    
    
    PACKAGE,

    
    TYPE_PARAMETER,

    
    TYPE_USE
}
@Retention生命周期

@Retention定义了改Annotation被保留的时间长短:

1、某些Annotation仅出现在源代码中,而被编译器丢弃;
2、一些却被编译在class文件中,注解保留在class文件中,在加载到JVM虚拟机时丢弃,这是默认行为,所以没有用Retention注解的注解,都会采用这种策略;
3、而另一些在class被装载时被读取,注解保留在查询运行期间,此时可以通过反射获取定义在某各类上的所有注解。

作用:表示需要在什么级别保存在该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

取值有:
	1、SOURCE:在源文件中有效(即源文件保留)
	2、CLASS:在class文件中有效(即class保留)
	3、RUNTIME:在运行时有效(即运行时保留) 
@Documented

表示该注解是否可以生成到 API文档中。

在该注解使用后,如果导出API文档,会将该注解相关的信息可以被例如javadoc此类的工具文档化。 注意:Documented是一个标记注解,没有成员。

@Inherited

使用@Inherited定义的注解具备继承性。

假设一个注解在定义时,使用了@Inherited,然后该注解在一个类上使用,如果这个类有子类,那么通过反射我们可以从类的子类上获取到同样的注解。

一个类A被注解了,那么另外一个类B,继承了A类,B类能够继承到A类中,的注解 (即被@Inherited注解过的注解) 。

Python

import os
import os
import os.path as op
import os.system as ost

#os库是Python标准库,包含几百个函数,常用路径操作、进程管理、环境参数等几类。os.path子库以path为入口,用于操作和处理文件路径。

# 路径操作:os.path子库,处理文件路径及信息
# 进程管理:启动系统中其他程序
# 环境参数:获得系统软硬件信息等环境参数

op.abspath(path)                # 返回path在当前系统中的绝对路径
op.normpath(path)            # 归一化path的表示形式,统一用\分隔路径
op.relpath(path)                # 返回当前程序与文件之间的相对路径 (relative path)
op.dirname(path)               # 返回path中的目录名称
op.basename(path)            # 返回path中最后的文件名称
op.join(path, *paths)          # 组合path与paths,返回一个路径字符串
op.exists(path)                   # 判断path对应文件或目录是否存在,返回True或False
op.isfile(path)                      # 判断path所对应是否为已存在的文件,返回True或False
op.isdir(path)                      # 判断path所对应是否为已存在的目录,返回True或False
op.getatime(path)              # 返回path对应文件或目录上一次的访问时间
op.getmtime(path)            # 返回path对应文件或目录最近一次的修改时间
op.getctime(path)             # 返回path对应文件或目录的创建时间
op.getsize(path)                # 返回path对应文件的大小,以字节为单位

ost(command)               # 执行程序或命令command,在Windows系统中,返回值为cmd的调用返回信息 

os.chdir(path)                   # 修改当前程序操作的路径
os.getcwd()                      # 返回程序的当前路径
os.getlogin()                     # 获得当前系统登录用户名称
os.cpu_count()                 # 获得当前系统的CPU数量
os.urandom(n)                 # 获得n个字节长度的随机字符串,通常用于加解密运算
import time time.gmtime([secs])

将以自 epoch 开始的秒数表示的时间转换为 UTC 的 struct_time ,其中 dst 标志始终为零。 如果未提供 secs 或为 None ,则使用 time() 所返回的当前时间。 一秒以内的小数将被忽略

time.gmtime()				#未传入任何参数时,返回当前UTC时间。
time.gmtime(1)				#传入secs,以自 epoch 开始的秒数表示的时间转换为 UTC 的 struct_time
							#epoch是时间开始的时间,这取决于平台。对于Unix,epoch是1970年1月1日00:00:00(UTC)
time.localtime([secs])

获取当地时间 。如果未提供 secs 或为 None ,则使用由 time() 返回的当前时间。当 DST 适用于给定时间时,dst标志设置为 1 。

time.localtime()			#未传入任何参数时,返回当前本地时间
time.localtime(1)			#传入secs,以自 epoch 开始的秒数表示的时间转换为当地的 struct_time
time.strftime(format[, t])

转换一个元组或 struct_time 表示的由 gmtime() 或 localtime() 返回的时间到由 format 参数指定的字符串。如果未提供 t ,则使用由 localtime() 返回的当前时间。 format 必须是一个字符串。如果 t 中的任何字段超出允许范围,则引发 ValueError 。

python中时间日期格式化符号
以下指令可以嵌入 format 字符串中,被 strftime() 结果中的指示字符替换:

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(0-12)
%M 分钟数(0-59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示(e.g Thu Dec 10 09:54:27 2020)
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示(e.g 12/10/20)
%X 本地相应的时间表示(e.g 09:58:15)
%Z 当前时区的名称(e.g 中国标准时间)
%% %号本身
import time

print(time.strftime("1. %Y-%m-%d %H:%M:%S",time.localtime()))
print(time.strftime("2. %Y-%m-%d is %A",time.localtime()))
print(time.strftime("3. 十二小时制时间是:%Y-%m-%d %I:%M:%S%p",time.localtime()))
print(time.strftime("4. 现在是: %Z %c",time.localtime()))
print(time.strftime("5. 现在是: %Z %a %b %d %I:%M:%S%p",time.localtime()))
print(time.strftime("6. %Y-%m-%d是%B,这是%Y一年的第%j天",time.localtime()))
# %U 一年中的星期数(00-53)星期天为星期的开始
print(time.strftime("7. %Y-%m-%d是%A,这是%Y一年的第%U周",time.localtime(1607221844)))
# %W 一年中的星期数(00-53)星期一为星期的开始
print(time.strftime("8. %x是是%A,这是%Y一年的第%W周",time.localtime(1607221844)))
print(time.strftime("9. 现在是:%Z %X%p",time.localtime()))


输出结果:
1. 2020-12-10 10:45:00
2. 2020-12-10 is Thursday
3. 十二小时制时间是:2020-12-10 10:45:00AM
4. 现在是: 中国标准时间 Thu Dec 10 10:45:00 2020
5. 现在是: 中国标准时间 Thu Dec 10 10:45:00AM
6. 2020-12-10是December,这是2020一年的第345天
7. 2020-12-06是Sunday,这是2020一年的第49周
8. 12/06/20是是Sunday,这是2020一年的第48周
9. 现在是:中国标准时间 10:45:00AM
日志 设置操作人的IP
import javax.servlet.http.HttpServletRequest;

public class IPUtils {
    private IPUtils() {

    }
    public static final String UNKNOWN = "unknown";
    
    public static String getIpAddr(HttpServletRequest request) {

        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 "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
    }

}
{
"Content-Type": "application/json;charset=UTF-8",
"X-AUTH-TOKEN": "06216:1b17f849a64d4a2696f46654dbc13c0b"
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948382.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号