最近几天我在玩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/