当前位置: 首页 > 知识库问答 >
问题:

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

卢英范
2023-03-14

我最近几天在玩Spring拦截器,想通过拦截器捕捉和处理特定的请求。我要做的是在每个请求被特定的控制器处理之前拦截它,检查请求是否包含特定的参数。如果是,做一些事情,然后将这些事情签名到映射请求的控制器。

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

示例(同时执行):

html" target="_blank">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;
    }
}

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

共有1个答案

祁默
2023-03-14

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

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

 类似资料:
  • 我试图执行一些适用于代码中所有的通用逻辑。我知道我可以编写一个来拦截快乐路径。但是,我想连接到异常处理生命周期中,以便在呈现错误响应之前执行一些常见的逻辑,比如日志记录。 在Spring Boot/Spring MVC中有这样做的方法吗?如果可能的话,我希望避免为此编写servlet过滤器。

  • 现在,当我到达spring-boot应用程序的endpoint时,它工作得很好 基本上,它根本不调用preandle。我错过了什么????

  • 问题内容: 应该很容易: 但是这样就不会调用拦截器。 问题答案: 默认情况下,Spring将注册,和,而无需任何显式配置。 如果您定义自己的bean,那么默认的bean将不会被注册,而您只会得到显式声明的bean。 到目前为止,一切都很好。 当您添加到混合中时,问题就来了。这 也 声明了自己的,它取代了默认值。但是,如果您也声明自己的一个,那么最终您将声明两个。由于按照声明的顺序进行查询,因此通常

  • 问题内容: 什么是JAX WS拦截器?在哪里可以找到相同的信息! 问题答案: JAX- WS拦截器(也称为处理程序)用于以透明方式编织请求的各个方面。例如,日志记录或请求/响应,向消息添加安全标头,加密,压缩等。单个拦截器可以操纵消息的逻辑有效载荷(内容)或消息的协议,但不能同时进行。 有关它们的入门文档,请参见此处。

  • 我知道我们可以将不同的url映射到不同的拦截器,或者我们也可以将多个url映射到单个拦截器。我只是想知道我们是否也有排除选项。例如,如果我在应用程序中有50个url映射,除了1个映射之外,我想为所有这些调用拦截器,而不是为49个映射编写配置,那么我可以只提到*和一个排除到第50个url吗?

  • 主要内容:定义拦截器,配置拦截器,拦截器的执行流程,多个拦截器的执行流程。拦截器(Interceptor)是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截,并在请求进入控制器(Controller)之前、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作。 在 Spring MVC 中,拦截器的作用与 Servlet 中的过滤器类似,它主要用于拦截用户请求并做相应的处理,例如通过拦截器,我们可以执行权限验证、记录请求信息日志、判断用户是