流程图
![在这里插入图片描述](https://img-blog.csdnimg.cn/70e1987f727c44b8bd6a763f65f413ab.png#pic_center)
SQL
CREATE TABLE `login_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ip_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`login_time` datetime NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
Maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
实体类
用户
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private String username;
private String password;
}
登录信息
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginLog implements Serializable {
private String username;
private String ipAddress;
private Date loginTime;
}
IP工具
public class IpUtils {
public static String getIpAddress(HttpServletRequest request) {
String Xip = request.getHeader("X-Real-IP");
String XFor = request.getHeader("X-Forwarded-For");
if (StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
int index = XFor.indexOf(",");
if (index != -1) {
return "0:0:0:0:0:0:0:1".equals(XFor.substring(0, index)) ? "127.0.0.1" : XFor.substring(0, index);
} else {
return "0:0:0:0:0:0:0:1".equals(XFor) ? "127.0.0.1" : XFor;
}
}
XFor = Xip;
if (StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) {
return XFor;
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getRemoteAddr();
}
return "0:0:0:0:0:0:0:1".equals(XFor) ? "127.0.0.1" : XFor;
}
}
配置
@Configuration
public class RabbitmqConfig {
public final static String EXCHANGE_NAME = "loginLogExchange";
public final static String QUEUE_NAME = "loginLogQueue";
public final static String ROUT_KEY = "loginLog";
@Bean
public Queue loginLogQueue() {
return new Queue(QUEUE_NAME, true);
}
@Bean
DirectExchange loginLogExchange() {
return new DirectExchange(EXCHANGE_NAME,true,false);
}
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(loginLogQueue()).to(loginLogExchange()).with(ROUT_KEY);
}
}
用户登录 Controller
@RestController
public class UserController {
@Autowired
private RabbitTemplate rabbitTemplate;
private final static String USERNAME = "admin";
private final static String PASSWORD = "admin";
@RequestMapping("/login")
public Object login (User user, HttpServletRequest request) {
if (USERNAME.equals(user.getUsername())) {
if (PASSWORD.equals(user.getPassword())) {
LoginLog logLoginInfo = new LoginLog();
logLoginInfo.setUsername(user.getUsername());
logLoginInfo.setIpAddress(IpUtils.getIpAddress(request));
logLoginInfo.setLoginTime(new Date());
rabbitTemplate.convertAndSend(RabbitmqConfig.EXCHANGE_NAME, RabbitmqConfig.ROUT_KEY, JSON.toJSONString(logLoginInfo));
return "登录成功";
}
return "密码错误";
} else {
return "账号不存在";
}
}
}
消费者 监听队列
@Component
@RabbitListener(queues = RabbitmqConfig.QUEUE_NAME)
public class LoginLogListener {
@Autowired
private LoginLogService loginLogService;
@RabbitHandler
public void handler(Object object) {
Message message = (Message) object;
LoginLog loginLog = JSON.parseObject(message.getBody(), LoginLog.class);
loginLogService.addLoginLog(loginLog);
}
}
测试结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/b7b12f0a78c848f08e6d5cc81d60500d.png)