java - spring 拦截器处理程序令人困惑的行为

标签 java spring spring-mvc interceptor

最近几天我在玩spring拦截器,想通过拦截器捕获并处理特定的请求。我想要做的是在特定 Controller 处理每个请求之前拦截每个请求,检查请求是否包含特定参数。如果是,请执行一些操作,然后将该操作签名到映射该请求的 Controller 。

最后我设法做到了这一点,但是当我使用不同的参数值一次执行多个请求时,只有最后一个请求的参数值被分配给每个 Controller 处理程序,即使每个 Controller 都应该具有包含在其中的参数的请求。

示例(同时执行):

http://domain.com/controller/method?param=xfg

http://domain.com/controller/method?param=mtc

http://domain.com/controller/method?param=abc

在每个请求的响应中,我得到 abc! (有时我会得到 xfg 和 abc,或者 mtc 和 abc,但从来不会同时得到这三个)。当我执行这些超时请求时,每个请求在调用下一个请求之前都有时间完成,它工作正常。

有人知道如何处理吗?

谢谢

更新:

public class OLMyInterceptor extends HandlerInterceptorAdapter {

    static Logger LOG = Logger.getLogger(OLAuthentificationInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
     Map<String, Object> activeParamsMap = request.getParameterMap();
         for(Entry<String, Object> param : activeParamsMap.entrySet()) {
             if(param.getKey().startsWith("aP_")) {
                  activeParams.put(param.getKey().substring(3), param.getValue());
             }
         }

         ((MainController) handler).setParams(activeParams);

         return true;
    }
}

这里有代码示例。我的每个 Controller 都扩展了 MainController,这就是为什么我将处理程序转换为 MainController,它有 setParams 方法。其他每个 Controller 都以不同的方式使用参数。

最佳答案

您必须使用参数调用 Controller 处理程序方法,而不是更改 Controller 状态的 setter 。

Controller 必须是无状态或线程安全的。当您更改状态时,您无法保证 setter 何时应用更改 - 在另一个线程中调用处理程序之前或之后。或者另一个线程使用其他参数调用 setter,而前一个线程调用新参数的处理程序方法。

关于java - spring 拦截器处理程序令人困惑的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11414772/

相关文章:

java - 如何从 drawSquare 方法中删除递归并获得完全相同的结果?

java - 创建 bean 时出错 - 注入(inject) Autowiring 依赖项失败

java - 带有 Spring MVC 的谷歌应用引擎

java - 在 Spring Boot 应用程序中配置 cors。 Bean CorsConfigurationSource 不起作用

java - 抛出 ConcurrentModificationException 系统依赖

java - Jetty maven插件和spring 4.1.6 - 类未找到异常

java - 使单例成为 Spring bean 的正确方法

java - 如何仅为 Controller 配置的路径配置 Spring 过滤器

java - Thymeleaf 模板 :data=http://www. somesite.com || org.thymeleaf.exceptions.TemplateProcessingException:无法解析为分配序列

java - Kafka消费者不消费