spring拦截器处理程序混乱行为

时间:2012-07-10 13:48:48

标签: java spring spring-mvc interceptor

我在最近几天玩弹簧拦截器,并希望通过拦截器捕捉和处理特定请求。我想要做的是在特定控制器处理每个请求之前拦截每个请求,检查请求是否包含特定参数。如果是的话,做一些事情,然后将那些东西签名给控制器,该控制器映射该请求。

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

示例(同时执行):

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的原因。每个其他控制器都以不同的方式使用params。

1 个答案:

答案 0 :(得分:1)

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

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