【问题标题】:How can I run common code for most requests in my Spring MVC Web App?如何为 Spring MVC Web App 中的大多数请求运行通用代码?
【发布时间】:2012-01-19 15:11:29
【问题描述】:

我有各种使用 Spring MVC RequestMapping 映射的 URL

@RequestMapping(value = "/mystuff", method = RequestMethod.GET) 
@RequestMapping(value = "/mystuff/dsf", method = RequestMethod.GET) 
@RequestMapping(value = "/mystuff/eee", method = RequestMethod.GET) 

我想在大约 90% 的请求之前执行一些常见操作。这些跨多个控制器。

在不深入研究 AOP 的情况下有没有办法做到这一点?如果我必须使用方面,有什么关于如何做到这一点的指导吗?!

谢谢!

更多信息:

这是为了运行一些特定于应用程序的安全性——我们被链接到一个父安全性设置,我们需要读取和调用它,然后需要在我们的大多数调用之前访问一个 cookie,但不是全部。

【问题讨论】:

  • 出于好奇,在所有请求之前您想做什么?根据它是什么,堆栈中可能已经有一个合适的位置来放置它。另外,您使用的是 Spring Security 吗?这也有很多好的钩子。
  • 谢谢,我已经更新了我的问题 :)

标签: java spring spring-mvc spring-aop


【解决方案1】:

【讨论】:

  • 谢谢,这看起来真的很有用。如何从拦截器中排除某些 URL?我们正在使用注释配置。 (文档有一个提到命名空间的断开链接)
  • 好吧,就像这里的例子:vaannila.com/spring/spring-interceptor.html 显示,你在拦截器中有一个方法可以让你检查 HttpRequest 对象并决定它是否是你想要拦截的请求 uri
  • 这是否意味着我们必须在此方法中列出我们的排除项?我想理想情况下,我们希望能够使用控制器中的注释来指定要拦截的 URL。
【解决方案2】:

拦截器是解决方案。它有 preHandler 和 postHandler 方法,分别在每次请求之前和之后调用。您可以连接到每个 HTTPServletRequest 对象,也可以通过挖掘它来传递一些。

这是一个示例代码:

@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        // set few parameters to handle ajax request from different host
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
        response.addHeader("Access-Control-Max-Age", "1000");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Cache-Control", "private");

        String reqUri = request.getRequestURI();
        String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
                reqUri.length());
                if (serviceName.equals("SOMETHING")) {

                }
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        super.postHandle(request, response, handler, modelAndView);
    }
}

【讨论】:

    【解决方案3】:

    HandlerInterceptor.preHandle() 方法使您可以访问请求和响应以及目标处理程序。在 Spring 3.1 中,它将是 HandlerMethod 类型,它使您可以访问目标控制器类和方法。如果它有帮助,您可以尝试按类型名称排除整个控制器类,这将是强类型的并且无需指定显式 URL。

    另一个选项是创建一个映射到一组 URL 模式的拦截器。请参阅参考文档中有关配置 Spring MVC 的部分。

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 2021-09-28
      • 2022-01-04
      相关资源
      最近更新 更多