Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在ServletAPI(SpringMVC)中限制每个用户的请求_Java_Spring_Spring Mvc_Servlet Filters - Fatal编程技术网

Java 如何在ServletAPI(SpringMVC)中限制每个用户的请求

Java 如何在ServletAPI(SpringMVC)中限制每个用户的请求,java,spring,spring-mvc,servlet-filters,Java,Spring,Spring Mvc,Servlet Filters,如何允许每个用户仅对具有特定URL@PathVariable的micorservice方法发出一个请求。 我的控制器 @RestController @RequestMapping(value = "/rest/product", produces = "application/json;charset=UTF-8") public class ProductRestController { @Autowired ProductService productService;

如何允许每个用户仅对具有特定URL
@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);
    }
@RestController
@RequestMapping(value=“/rest/product”,products=“应用程序/json;字符集=UTF-8”)
公共类ProductRestController{
@自动连线
产品服务产品服务;
@自动连线
产品ASM产品ASM;
@RequestMapping(value=“/ID/{ID}”,method=RequestMethod.GET)
公共响应属性getProductID(@PathVariable(“ID”)长ID,@AuthenticationPrincipal User){
Product Product=productService.getProduct(ID);
如果(产品==null)
返回新的ResponseEntity(未找到HttpStatus.NOT_);
返回新的响应属性(productAsm.toResource(product),HttpStatus.OK);
}
例如:

  • 用户允许的第一个请求
    /rest/product/ID/2231
    (使用login=“xaxa”)
  • 第二个请求
    /rest/product/ID/2545
    允许用户(使用login=“xaxa”)
  • 用户不允许第三次请求
    /rest/product/ID/2231
    (使用login=“xaxa”)

  • 实现此功能的最佳方法是什么?(我必须将此URL请求与用户登录保持在DB中,或者已有解决方案)

    您可以使用AOP并实现自己的方面,该方面将在Rest端点方法之前调用

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

    实现可以基于Guava的类——至少在一开始是这样

    有几个问题需要考虑:

  • 条带化可以用一些LRU缓存代替,以实现更好的内存管理
  • 当两个请求同时访问同一ID时,您当然必须提供同步
  • 它只适用于部署在单个节点上的应用程序
  • 就性能而言,这不是很好的方法。这可能是一个问题,取决于您的流量

  • 你需要支持多少个独特的ID?我有一些想法,但是它们的可用性取决于这个数字。还有,你认为一些IDS有吞吐量1的可能性吗?首先,有一些ID(大约100-500),但是将来它可以增加到5000个NO,我没有考虑这个可能性。