小编rma*_*how的帖子

我如何说服spring 4.2将OPTIONS请求传递给控制器

我们在控制器上使用带有@RestController注释的spring mvc,我们正在处理控制器中的授权.我们使用相同的代码来设置响应CORS飞行前请求的允许方法.为实现这一目标,我们有:

    <init-param>
        <param-name>dispatchOptionsRequest</param-name>
        <param-value>true</param-value>
    </init-param>
Run Code Online (Sandbox Code Playgroud)

在调度程序servlet的配置中,然后我们有:

    @RequestMapping(value="/some/collections", method=RequestMethod.OPTIONS)
    public void collectionOptions(
            HttpServletRequest req,
            HttpServletResponse res) {
        List<RequestMethod> methods = new ArrayList<>();
        // check actual permissions, add the appropriate methods
        CORS.setAllowedMethodHeaders(res,methods);
    }
Run Code Online (Sandbox Code Playgroud)

我们还有一个拦截器,它对CORS pre-flight进行基本检查,以查看原点是否可能具有任何权限.

我们这样做主要是因为某些请求的权限实际上取决于@RequestParams,即:

    OPTIONS /api/collections?userId=122
Run Code Online (Sandbox Code Playgroud)

如果您具有管理权限,或者您实际上是具有ID 122的用户,则可能被允许.此外,我们还有API密钥

    OPTIONS /api/collections?userId=122&apiKey=ABC
Run Code Online (Sandbox Code Playgroud)

对于一个原点可能没问题,但对另一个原点则不行.

这工作正常,但是现在,Spring 4.2决定是否处理OPTIONS请求,通过调用:

    CorsUtils.isCorsRequest(request);
Run Code Online (Sandbox Code Playgroud)

在AbstractHandlerMapping中然后返回

        HandlerInterceptor[] interceptors = chain.getInterceptors();
        chain = new HandlerExecutionChain(new PreFlightHandler(config), interceptors);
Run Code Online (Sandbox Code Playgroud)

而不是HandlerMethod ......

我们需要的是告诉spring让控制器处理OPTIONS请求的一些方法,无论预检请求处理程序是什么.

我们似乎无法找到一个点,我们可以告诉内置的CORS处理是安静的,或者在某个地方配置一些允许我们绕过新添加的代码的子类:

  AbstractHandlerMapping.getHandler(HSR request)
Run Code Online (Sandbox Code Playgroud)

这有可能吗?在我主动启用它之前(通过WebMvcConfigurerAdapter或通过@CrossOrigin注释),这样的功能是不是很安静?

--------编辑-------------

HTTP标准说明了以下关于OPTIONS方法的内容:

OPTIONS方法表示请求有关Request-URI标识的请求/响应链上可用的通信选项的信息.该方法允许客户端确定与资源相关联的选项和/或要求,或服务器的能力,而不暗示资源动作或启动资源检索.

认为beyong只是CORS,我认为拦截CORS选项调用虽然相应的方法映射到控制器上是不正确的方法.是的,CORS是你可以用OPTIONS调用做的一件事.但它绝不是唯一的一个.

如果没有映射,并且如果使用不同的请求方法和@CrossOrigin注释映射处理程序方法,我希望触发内置CORS支持的假设会很好,但我不认为任何请求原始标头集应该只自动转到CORS处理程序.

java spring spring-mvc cors

7
推荐指数
1
解决办法
1791
查看次数

spring aop - 链接多个方面

我有两个方面,一个用于获取@Around 调用的锁,另一个用于消除方法调用。这些方面看起来像这样:

@Pointcut("execution(public * * (..))")  
private void anyPublicMethod() {}

@Around("anyPublicMethod() && @annotation(lock)")
public Object all(ProceedingJoinPoint proceedingJoinPoint, Lock lock) throws Throwable {
   // acquire lock, then proceed()
}
Run Code Online (Sandbox Code Playgroud)

另一个看起来像这样:

@Pointcut("execution(public * * (..))")  
private void anyPublicMethod() {}

@Around("anyPublicMethod() && @annotation(debounce)")
public Object all(ProceedingJoinPoint proceedingJoinPoint, Debounce debounce) throws Throwable {
    // debouncing as described in 
    // http://stackoverflow.com/questions/4742210/implementing-debounce-in-java

}
Run Code Online (Sandbox Code Playgroud)

完整代码:

https://github.com/rmalchow/debouncer-aspect/blob/master/src/main/java/com/skjlls/aspects/debounce/impl/DebounceAspect.java

https://github.com/rmalchow/lock-aspect/blob/master/src/main/java/com/skjlls/aspects/lock/impl/LockAspect.java

当我将 @Debounce 和 @Lock 都放在一个方法上时,我得到了这个异常:

Required to bind 2 arguments, but only bound 1 (JoinPointMatch was NOT bound in …
Run Code Online (Sandbox Code Playgroud)

java aop spring spring-aop spring-aspects

5
推荐指数
1
解决办法
2294
查看次数

gitlab-ci 运行程序需要很长时间才能从 S3 缓存下载/上传(没有“ServerAddress”)

我们有一个 gitlab 运行器在 AWS 上的 kubernetes 集群中运行。测试工作:

test-job:
  image: centos
  stage: build
  cache:
    paths:
     - output
  script:
    - mkdir -p output
    - date +"%Y-%m-%d" > output/date.txt
  tags:
    - docker
  when: always
takes about 4 minutes to run - but only 4s if i remove the "cache" section.
Run Code Online (Sandbox Code Playgroud)

我的跑步者的 config.toml 看起来像这样

[[runners]]
  name = "gitlab-runner..."
  url = "https://gitlab...."
  token = "....."
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    Type = "s3"
    Shared = true
    [runners.cache.s3]
      AccessKey = "...."
      SecretKey = "...."
      BucketName = …
Run Code Online (Sandbox Code Playgroud)

gitlab gitlab-ci-runner gitlab-runner

5
推荐指数
1
解决办法
2219
查看次数