Как отслеживать время входа в систему и время выхода из системы и сохранять в базе данных mysql с помощью java API - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь, когда пользователь входит в систему, это конкретное имя пользователя и текущее время будут записаны и сохранены в базе данных MySQL. И имена моих таблиц базы данных - userName, systemLoginTime, systemLogoffTime. Я много раз пробовал, но когда пользователь входит в систему, это не происходит в базе данных

This is my code java API:

import java.io.*;
import java.net.*;

public class Test
 {
    public static void main(String[] args) throws IOException {
        String userName = "";
        String systemLoginTime = "";
        URL url = new URL("http://localhost:8080/insert/{userName}/{systemLoginTime}");
        //Insert your JSON query request
        String query = "{'userName':USERNAME,'systemLoginTime':'TODAY'}";
        //It change the apostrophe char to double colon char, to form a correct JSON string
        query=query.replace("'", "\"");

        try{
            System.getenv().get("USERNAME");
        java.util.Date today = new java.util.Date();
        return new java.sql.Timestamp(today.getTime());
        //com.sun.security.auth.module.NTSystem().getName;
    String username = System.getProperty("user.name");
    System.out.println("username = " + username);
    //make connections
            URLConnection urlc = url.openConnection();
            //It Content Type is so importan to support JSON call
            urlc.setRequestProperty("Content-Type", "application/json");
            printMessage("Your URL: " + url.toString());
            //use post mode
            urlc.setDoOutput(true);
            urlc.setAllowUserInteraction(false);

            //send query
            PrintStream ps = new PrintStream(urlc.getOutputStream());
            ps.print(query);
            printMessage("Your Query: " + query);
            ps.close();

            //get result
            BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
            String l = null;
            while ((l=br.readLine())!=null) {
               printMessage(l);
            }
            br.close();
        } catch (Exception e){
            printMessage("Error ocurred");
            printMessage(e.toString());
        }

    }

    private static void printMessage(String s){
        System.out.println(s);
    }

 }

================ =====================

This is my Spring Boot Repository class

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class MyCopRepo
{
    @Autowired
    JdbcTemplate jdbt;

    public String add(String userName, String systemLoginTime)
    {
        String userName1= userName;
    String systemLoginTime1=systemLoginTime; 
        //String systemLogoffTime1= systemLogoffTime;
        String query = "insert into mycopinsert(userName, systemLoginTime) values(?,?)";
        int i = jdbt.update(query, userName1, systemLoginTime1);
        if(i>0)
        {
            return "Inserted Successfully";
        }
        return "Not Inserted";
    }
}

==================== =========================

This is my Controller class:
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyCopController
{
    @Autowired
    MyCopRepo ar;

    @PostMapping("/insert/{userName}/{systemLoginTime}")
    public String myCop(@PathVariable("userName") String userName, @PathVariable("systemLoginTime") String systemLoginTime)
    {
        return ar.add(userName, systemLoginTime);
    }
}

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Сконфигурируйте свой проект для использования Hibernate и Springboot, и ваше решение станет:

@postmapping("/login")
public String login(@RequestBody LoginEventRequestBody request) {

   LoginEvent event = new LoginEvent();

   event.setUsername(request.getUserName);
   event.setTimeStamp(new Timestamp(new Date().getTime()));
   loginEventService.save(event);
   return "successfully logged login event";

}

По сути, вы захотите отделить ваш логин входа c от вашего логина входа c. После того, как пользователь успешно войдет в систему, зарегистрируйте событие входа. вы по-прежнему можете использовать переменные пути. Я лично нашел этот очиститель

Как это настроить
LoginEventRequestBody
LoginEvent
LoginEventController
LoginEventService
LoginEventRepository
application.properties

LoginEventRequestBody. java

package org.app.loginEvent;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import org.immutables.value.Value;

@Value.Immutable
@JsonDeserialize(builder = LoginEventRequestBody.Builder.class)
@Value.Style(
    visibility = Value.Style.ImplementationVisibility.PACKAGE,
    builderVisibility = Value.Style.BuilderVisibility.PUBLIC
)
public interface LoginEventRequestBody {

    String getUserName();

    class Builder extends ImmutableLoginEventRequestBody.Builder {
    }

    static LoginEventRequestBody.Builder builder() {
        return new LoginEventRequestBody.Builder();
    }

}

LoginEvent. java

package org.app.loginEvent;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.sql.Timestamp;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "login_event")
public class LoginEvent {

    @Id
    @GeneratedValue
    @JsonProperty("id")
    private Long id;

    @JsonProperty("userName")
    private String userName;

    @JsonProperty("timestamp")
    private Timestamp timestamp;  

    public LoginEvent() {
    }

    public LoginEvent(String userName, Timestamp timestamp) {
        this.userName = userName;
        this.timestamp = timestamp;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Timestamp getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Timestamp timestamp) {
        this.timestamp = timestamp;
    }
}

LoginEventController

package org.app.loginEvent;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("events")
public class LoginEventController {

    private final LoginEventService loginEventService;

    public LoginEventController(LoginEventService loginEventService) {
        this.loginEventService = loginEventService;
    }

    @postmapping("/login")
    public String login(@RequestBody LoginRequestBody request) {

       LoginEvent event = new LoginEvent();

       event.setUsername(request.getUserName);
       event.setTimeStamp(new Timestamp(new Date().getTime()));
       loginEventService.save(event);
       return "successfully logged login event";

    }
}

LoginEventService

package org.app.loginEvent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class LoginEventService {

    @Autowired
    private LoginEventRepository loginEventRepository;

    public void save(LoginEventloginEvent) {
        loginEventRepository.save(loginEvent);
    }
}

LoginEventRepository

package org.app.loginEvent;

import org.springframework.data.jpa.repository.JpaRepository;

public interface LoginEventRepository extends JpaRepository<LoginEvent, Long> {
}

application.properties

#--------------------------------------------------
#mysql
#--------------------------------------------------
spring.datasource.username              =root
spring.datasource.password              =root
spring.datasource.url                   =jdbc:mysql://localhost:3306/mydb
spring.datasource.driverClassName       =com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto           =update

Когда ваш пользователь входит в систему, сделайте запрос к системе отслеживания событий

HTTP МЕТОД

POST

Конечная точка URL

http://localhost:8080/events/login

Тело запроса

{
  userName:"userNameOfThePersonTryingToLogIn"
}


#now check your database and you will find the event has logged
#repeat this process for your logout event
0 голосов
/ 19 июня 2020

Вы можете попробовать что-то вроде этого, вместо передачи в качестве параметра просто получите время входа в систему, прежде чем делать запрос в базу данных.

    public String add(String userName)
    {
        String userName1= userName;
        String systemLoginTime=java.sql.Timestamp(new Date().getTime());
        //String systemLogoffTime1= systemLogoffTime;
        String query = "insert into mycopinsert(userName, systemLoginTime) values(?,?)";
        int i = jdbt.update(query, userName1, systemLoginTime1);
        if(i>0)
        {
            return "Inserted Successfully";
        }
        return "Not Inserted";
    }
}

Вы также должны инкапсулировать код в основном, создав методы для групповое содержимое (вместо комментариев перед каждой частью), оно более понятно и легко поддается отладке.

...