0

最近几天我在玩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。每个其他控制器都以不同的方式使用参数。

4

1 回答 1

1

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

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

于 2012-07-10T15:03:08.157 回答