实现一个用户登录时记录登录IP、地址、登陆人、登录时间的日志功能

实现一个用户登录时记录登录IP、地址、登陆人、登录时间的日志功能

1. 首先在beans包下写一个实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class LoginLog implements Serializable {
    private static final long serialVersionUID = -7440711887634642686L;
    private int id;      
    private String ip;    //登陆的ip
    private String no;       //登陆用户名账号
    private Date createtime;   //登陆的时间
    private String location;    //登陆的地址
    
    public LoginLog(String ip, String no, Date createtime, String location) {
        this.ip = ip;
        this.no = no;
        this.createtime = createtime;
        this.location = location;
    }
}

2. 在dao包下写接口需要方法和.xml文件

public interface LoginLogDAO {
    //添加日志
    int addLoginLog(LoginLog loginLog);
    //查询全部日志
    List<LoginLog> queryAllLoginLog();
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- dtd:document type definition 配置文件规范 -->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kfr.www.dao.LoginLogDAO">
    <select id="queryAllLoginLog" resultType="LoginLog">
    select * from `loginlog`
    </select>
    <insert id="addLoginLog">
        insert into `loginlog` (ip,`no`,createtime,location )
        value (#{ip},#{no},#{createtime},#{location})
    </insert>
</mapper>

3. 业务逻辑层service包接口写相应的方法及接口的实现

public interface LoginLogService {
    //添加日志
    int addLoginLog(LoginLog loginLog);
    //查询全部日志
    List<LoginLog> queryAllLoginLog();
}

@Service
public class LoginLogImpl implements LoginLogService {
    @Autowired
    private LoginLogDAO loginLogDAO;
    @Override
    @Transactional
    public int addLoginLog(LoginLog loginLog) {
        return loginLogDAO.addLoginLog(loginLog);
    }

    @Override
    public List<LoginLog> queryAllLoginLog() {
        return loginLogDAO.queryAllLoginLog();
    }
}

4. 在controller包写相应的handler

//登陆
@RequestMapping("/userlogin")
public String findUser(HttpServletResponse response, HttpSession session, HttpServletRequest request,String ip,String city){
    String username=request.getParameter("username");
    String password=request.getParameter("password");
    String auto = request.getParameter("auto");
    User user=null;
    try {
         user = userService.findUser(username, password);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (user!=null){
        //加入日志信息
        Date date=new Date();
        LoginLog loginLog=new LoginLog(ip,username,date,city);
        int i = loginLogService.addLoginLog(loginLog);
        if (auto!=null) {
            //将用户名和密码存在cookie里
            Cookie cookie = new Cookie("userinfo", username + "#" + password);
           // Cookie cookie1 = new Cookie("userlog", ip + "#" + city);
            //设置上下面路径
            cookie.setPath("/");
            //设置cookie过期时间
            cookie.setMaxAge(60 * 60 * 24 * 14);
            //放入
            response.addCookie(cookie);
            //response.addCookie(cookie1);
            session.setAttribute("User", user);
            return "index";
        }
        else {
            session.setAttribute("User", user);
            return "index";
        }
    }else {
        return "redirect:/login";
    }
}
  1. 前端登录界面
<!--下面一个开放的JS中有一个方法可以获取当前IP地址-->
   <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>

<script type="text/javascript">
   var ip=""; //所属的IP
   var cityAndAddress=""; //登录的地区
   $(function () {
      //获取IP,页面加载的时候自动执行
      //如果失效用这个 https://ipapi.co/json/ ,或者自己找第三方接口
      ip=returnCitySN["cip"];
      $.ajax({
         url: 'http://api.map.baidu.com/location/ip?ak=ia6HfFL660Bvh43exmH9LrI6',
         type: 'POST',
         dataType: 'jsonp',
         success:function(data) {
            //获取城市
            cityAndAddress=data.content.address_detail.province + "," + data.content.address_detail.city;

            //alert("IP:"+ip);
            //alert("cityAndAddress:"+cityAndAddress);
            $("#ip1").val(ip);
            $("#cy1").val(cityAndAddress);
         }
      });
   });

登陆时需要在界面上隐藏IP和位置信息进行提交到后台

<input type="hidden" name="ip" id="ip1">
<input type="hidden" name="city" id="cy1">

之后每次用户登录时都可以进行记录用户的日志信息了

第二种方式

1.在springboot项目中引入包

		<dependency>
			<groupId>com.squareup.okhttp3</groupId>
			<artifactId>okhttp</artifactId>
<!--			<version>4.9.0</version>-->
		</dependency>
		
		<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-all</artifactId>
			<version>5.6.3</version>
		</dependency>

2.写个工具类调用https://api.xygeng.cn/openapi/ip/getInfo这个接口

     private static JSONObject api2(){
        HashMap<String, String> params = new HashMap<>();
        params.put("ip","117.133.51.5");
        try {

            String s =doPost("https://api.xygeng.cn/openapi/ip/getInfo",params);
            if (s != null && !s.isEmpty()){
                JSONObject jsonObject = JSONObject.parseObject(s);
                logger.info("获取信息:{}",jsonObject.toJSONString());
                return jsonObject;
            }
        }catch (Exception e){
            logger.info("获取信息异常:",e);
        }
        return new JSONObject();
    }

    public static String doPost(String url, Map<String, String> bodyParams) throws IOException {
        FormBody.Builder formBuilder = new FormBody.Builder();
        if (bodyParams != null && !bodyParams.isEmpty()) {
            for (Map.Entry<String, String> entity : bodyParams.entrySet()) {
                formBuilder.add(entity.getKey(), entity.getValue());
            }
        }
        RequestBody body = formBuilder.build();
        Request request = new Request.Builder().url(url).post(body).build();
        try(Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                return response.body().string();
            }
            logger.info("okhttp调用接口错误,响应码为:{}", response.code());
            return "";
        }
    }

3.在接口处获取ip,之后作为参数传入上述接口中获取IP信息

//糊涂工具包下的获取请求ip的方式
String clientIP = ServletUtil.getClientIP(request);

4.返回结果,按照需要进行处理数据
在这里插入图片描述

  • 9
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 。 您好!您可以使用以下代码来实现您的需求: ``` #!/usr/bin/tclsh set timeout 10 spawn telnet $argv expect "Username:" send "admin\r" expect "Password:" send "password\r" interact ``` 请注意,您需要将 $argv 替换为您要登录的设备的 IP 地址。此外,您还需要替换用户名和密码。 ### 回答2: 可以使用Tcl的expect库编写一个telnet脚本来实现通过IP地址登录网络设备。 首先,需要导入expect库,并创建一个telnet会话对象。接下来,可以使用该会话对象连接到指定的IP地址。使用send命令发送telnet命令到网络设备,例如用户名、密码等。使用expect命令等待设备响应,并根据响应情况作出相应的操作。 以下是一个简单的示例代码: ```tcl #!/usr/bin/expect -f set ip "192.168.0.1" ;# 设置目标设备的IP地址 set username "admin" ;# 设置登录用户名 set password "password" ;# 设置登录密码 spawn telnet $ip ;# 创建telnet会话对象 expect { "Username:" {send "$username\r"; exp_continue} "Password:" {send "$password\r"; exp_continue} ">" {send "enable\r"; exp_continue} "#" {send "show running-config\r"; exp_continue} "exit" {send "exit\r"} } expect eof ;# 等待会话结束 exit ;# 退出脚本 ``` 备注:上述代码仅仅是一个示例,具体的telnet命令和交互细节需要根据目标设备的具体情况进行调整。 在脚本中,我们使用了spawn命令创建了一个telnet会话对象,然后使用expect命令根据不同的提示信息作出相应的操作,例如输入用户名、密码、启用特权模式,以及发送一些命令并等待结果。 当脚本完成后,我们使用expect eof命令等待会话结束,并使用exit命令退出脚本。 这样,我们就可以通过该脚本实现通过IP地址登录网络设备的功能。当然,根据实际情况,我们还可以对代码进行进一步优化,增加错误处理、异常情况等。 ### 回答3: TCL是一种脚本语言,可以用于编写自动化任务和网络操作。编写一个TCL脚本实现通过Telnet协议登录网络设备的功能需要以下步骤: 1. 引入TCL的telnet库,用以支持Telnet连接。 ``` package require telnet ``` 2. 创建一个Telnet连接对象,并指定要连接的设备的IP地址和端口号。 ``` set ip "设备的IP地址" set port "设备的Telnet端口号" set telnet [telnet::open $ip $port] ``` 3. 设置登录设备所需的用户名和密码。 ``` set username "用户名" set password "密码" ``` 4. 发送Telnet命令登录设备。 ``` telnet::login $telnet $username $password ``` 5. 可以通过发送其他命令来配置设备或获取设备信息。 ``` telnet::puts $telnet "配置命令" ``` 6. 接收并处理设备返回的信息。 ``` set result [telnet::read $telnet] ``` 7. 断开Telnet连接。 ``` telnet::close $telnet ``` 上述代码片段提供了一个基本的框架,你可以根据实际需要进行适当的修改和扩展。例如,可以增加异常处理来处理连接失败或登录失败的情况,或者添加循环结构以实现多次连接和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值