如何在ServletAPI(Spring MVC)中限制每个USER的请求

时间:2015-09-02 06:37:03

标签: java spring spring-mvc servlet-filters

如何对每个用户使用特定网址@PathVariable的micorservice方法只允许一个请求。 我的控制器

@RestController
@RequestMapping(value = "/rest/product", produces = "application/json;charset=UTF-8")
public class ProductRestController {
    @Autowired
    ProductService productService;

    @Autowired
    ProductAsm productAsm;

    @RequestMapping(value = "/ID/{ID}", method = RequestMethod.GET)
    public ResponseEntity<ProductResource> getProductID(@PathVariable("ID") Long ID, @AuthenticationPrincipal User) {

        Product product = productService.getProduct(ID);
        if (product == null)
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);

        return new ResponseEntity<>(productAsm.toResource(product), HttpStatus.OK);
    }

例如:

  1. 允许USER(使用login =“xaxa”)
  2. 的第一个请求/rest/product/ID/2231
  3. USER允许的第二个请求/rest/product/ID/2545(使用login =“xaxa”)
  4. 第三次请求/rest/product/ID/2231不允许用户(使用login =“xaxa”)
  5. 实现此功能的最佳方法是什么?(我是否可以通过DB中的用户登录来保留此URL请求,或者已有解决方案)

1 个答案:

答案 0 :(得分:1)

您可以使用AOP并实现您自己的方面,在您的Rest Endpoint方法之前调用。

此切入点将读取请求中提供的ID,并尝试查找与此ID对应的Lock。通常 - 尝试访问资源并可能等待。

实施可以基于番石榴的Striped课程 - 至少在开始时。

有几个问题需要考虑:

  1. Striped可以替换为一些LRU Cache,以便更好地管理内存。
  2. 当两个请求同时访问相同的ID时,您当然必须提供同步。
  3. 它仅适用于部署在单个节点上的应用程序。
  4. 在性能方面,这不是一个很好的方法。根据您的流量,这可能是一个问题。