繁体   English   中英

Spring拦截器处理程序令人困惑的行为

[英]spring interceptor handler confusing behavior

最近几天,我正在使用Spring拦截器,并希望通过拦截器捕获并处理特定的请求。 我想要做的是在特定控制器处理每个请求之前先对其进行拦截,检查请求是否包含特定参数。 如果是,请执行一些操作,然后将该内容签名到映射该请求的控制器。

最后,我设法做到了,但是当我一次执行多个具有不同参数值的请求时,只有来自最后一个请求的参数值才分配给每个控制器处理程序,即使每个控制器都应具有包含在请求中的参数。

示例(同时执行):

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;
    }
}

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

您必须使用参数而不是用setter来更改控制器状态的控制器处理程序方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM