2012-07-10 45 views
0

我在过去几天玩弹簧拦截器,并希望通过拦截器捕获和处理特定请求。我想要做的是在每个请求被特定控制器处理之前拦截每个请求,检查请求是否包含特定参数。如果是的话,做一些东西,然后将这些东西签名到控制器,以便映射该请求。春天拦截器处理程序混淆行为

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

实施例(同时执行):

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

+0

嗯,你是否在拦截器中保存了一些状态?你能展示一些代码示例吗? – masted 2012-07-10 14:14:57

+0

好吧,我已经添加了代码示例和更多详细信息。 – jMn 2012-07-10 14:27:10

+0

这解决了吗?怎么样? – 2017-02-03 23:22:03

回答

1

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

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