我正在使用RESTful服务的Spring启动应用程序,基于JWT的身份验证并作为前端做出反应。
我想构建一个计数器来监视我的RestController中某些REST端点的唯一用户请求(例如每天),并将当前值存储到数据库中的列。
具体而言,我想了解每天有多少用户点击某篇文章(api/articles/{id}
)并将该值绑定到该实体。
实体:
@Data
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
@Entity
@Table(name = "Article")
public class Article{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "message_id", unique = true, nullable = false)
private Long id;
@Column(name = "visits")
private Long visitCounter;
...
}
控制器:
@RestController
@RequestMapping("/api/articles")
public class ArticleController {
private AppUserService userService;
private ArticleService articleService ;
@Autowired
public ArticleController (AppUserService userService, ArticleService articleService ) {
this.userService = userService;
this.articleService = articleService;
}
@GetMapping(value = "/{id}")
public ResponseEntity<Article> getArticleById(@PathVariable(value = "id") Long articleId) {
Article article = articleService .getArticleById(articleId);
if(article == null) {
return ResponseEntity.notFound().build();
}
articleService.countVisit(); //???
return ResponseEntity.ok().body(article);
}
}
...
有什么想法可以实现吗?
答案 0 :(得分:1)
假设您有应用程序范围的bean ArticleCountService。该服务应该有一个地图&gt;对于柜台。
关键是文章路径(或ID或标识您文章的内容)。该值是用户集(例如,用于标识您可以从HttpServletRequest获取的唯一用户的IP地址)。在23:59:999,您将获得地图数据并创建一个新的空地图。 这是最简单的解决方案,但它可能会对内存产生影响。
模式方便的方法是在DB中存储内容。例如。 ARTICLE_ID,USER_ID(IP),VISIT_DATE
每天聚集一次数据(计算后可以删除昨天过时的行。)