【问题标题】:How to run some code before executing Spring web service如何在执行 Spring Web 服务之前运行一些代码
【发布时间】:2017-09-07 22:53:33
【问题描述】:

我使用 spring 实现了一些其余的 web 服务。 我有一些公共代码需要在每个 Web 服务之前执行。 目前,我在每个 Web 服务的启动时明确调用此公共代码。

有没有办法让 spring 在调用 web 服务之前“自动”调用这个公共代码?

【问题讨论】:

  • 你能定义“在调用 Web 服务之前”吗?您是指一些配置步骤(初始化池、加载/准备资源和地图、构建参考表等),还是指在每次调用服务之前应该处理的事情(身份验证、审计日志记录、会话初始化、等)?
  • 你有没有试过任何代码?!您可以发布它们以获得更清晰的场景吗?!
  • 我需要保存请求信息,(浏览器、IP 和操作系统版本)我需要访问 httpRequest 对象来执行此操作,而不是对每个 Web 服务手动执行此操作,我询问是否有任何支持到春天这样做。

标签: java spring spring-mvc spring-ws


【解决方案1】:

你应该使用spring aop拦截每一个web服务,并在上面执行通用代码。如下代码:

<bean id="aspect" class="com.zhuyiren.Aspect"/>

<aop:config>
    <aop:aspect ref="aspect">
        <aop:before method="before" pointcut="execution(* com.zhuyiren.service..*.*(..))"/>
    </aop:aspect>
</aop:config>

上述代码表示调用com.zhuyiren.service封装的某个bean的每个方法总是执行com.zhuyiren.Aspect中的common方法。您可以在common方法中编写通用代码。像:

public void common(){
    System.out.println("execute some common code");
}

测试用例:

public static void main(String[] args) throws Exception {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
    UserService service = context.getBean(UserService.class);
    System.out.println(service.getUser(3));
}

打印的是:

execute some common code
UserInfo{id=3, name='zhuyiren', password='123456', testString=[]}

【讨论】:

    【解决方案2】:

    答案取决于您要执行的代码。

    一种技术是使用 AOP(如@dabaicai 回答中所述)。

    另一种技术是添加一个 JEE 过滤器以在请求到达您的处理程序方法之前对其进行处理。

    这里有一些链接:

    1. JEE6 Tutorial Filtering Requests and Responses
    2. Oracle's Essentials of filters
    3. Mkyong's Spring JEE filters - 对此持保留态度,Mkyong 解释得很清楚。

    另一种选择:谷歌搜索“spring jee 过滤器”

    【讨论】:

      【解决方案3】:

      Spring 有拦截器的概念 - 一段“包装”传入请求的代码 最简单的就是实现HandlerInterceptor接口:

      import org.springframework.web.servlet.HandlerInterceptor;
      import org.springframework.web.servlet.ModelAndView;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.util.Enumeration;
      
      public class LetterzInterceptor implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
              Enumeration<String> headerNames = request.getHeaderNames();
              return true;
          }
      
          @Override
          public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      
          }
      
          @Override
          public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      
          }
      }
      

      下一步是向 Spring 注册拦截器:

          @Configuration
          public class MyConfig implements WebMvcConfigurer {
      
             @Override
             public void addInterceptors(InterceptorRegistry registry) {
                 registry.addInterceptor(new MyInterceptor());
             }
         }
      

      【讨论】:

        猜你喜欢
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        • 2021-08-06
        • 2018-08-28
        相关资源
        最近更新 更多