【问题标题】:Is it possible to use AOP for web app licence validation?是否可以使用 AOP 进行 Web 应用程序许可证验证?
【发布时间】:2014-08-07 04:57:13
【问题描述】:

目前我有一个Spring MVC web应用程序,它使用ServletFilter过滤每个HTTP请求,通过检查验证用户是否真的购买了License许可文件内容。

我已经在 spring xml 文件和 web.xml 中适当地映射了过滤器。由于我可以访问过滤器中的HttpServletRequestHttpServletResponse,因此如果验证失败,我可以将用户重定向到错误页面。

那么,正如标题所示,是否可以使用 Spring AOP 做同样的事情?如何配置 Spring AOP 以访问容器创建的请求和响应对象以重定向用户?

【问题讨论】:

  • 您是否希望许可证文件在请求之间发生变化?许可证检查通常是应用程序在启动时执行一次,而不是针对每个请求一次又一次地进行。
  • @Wyzard 否。实际上我正在定期检查许可证文件。不是针对每个请求。但是我在上下文范围内有一些变量,它们的状态取决于许可证文件的状态。
  • 是的,有可能。但除非你能给我们一个好的用例,否则它通常比它的价值更麻烦。
  • @SotiriosDelimanolis 我想知道怎么做?它仅用于学习目的。使用过滤器,代码运行良好且经过良好测试。

标签: java spring spring-mvc aop


【解决方案1】:

如何配置 Spring AOP 以访问请求和 容器创建的响应对象来重定向用户?

您将无法获得与 servlet 过滤器完全相同的行为。 Filter 通过传递 in ServletRequestServletResponse 对象围绕目标 Servlet。从这个意义上说,您可以获得类似的行为,因为 AOP 建议可以围绕 连接点操作并拦截传递的参数。

但是,AOP 建议不能神奇地访问请求和响应。它要么需要建议一个接收它们的方法,要么从某个ThreadLocal 或其他容器中获取它们。例如,Spring 有RequestContextHolder,您可以使用它来获取HttpServletRequest。但它没有任何东西可以给你HttpServletResponse(技术上不正确,但它不可靠)。你可以写一些类似的东西。

一旦通知可以访问对象,它就可以简单地调用HttpServletResponse#sendRedirect(..)forward() 或其他任何东西。

【讨论】:

  • 谢谢。假设我有一个接收请求和响应的控制器类方法,我如何访问它们以在通知代码中转发或重定向?
  • @BRS 匹配建议切入点中的参数/参数。将这些链接到您的建议参数。
【解决方案2】:

实现这一点的最佳方法是使用异常。这样检查和处理可以在不同的情况下有所不同,例如。 Web 应用程序与普通应用程序。

您可以使用 aop 将您的检查添加到特定的连接点。如果它发现有问题,它会抛出一个 InvalidLicenseException(扩展 RuntimeException)。现在有几种方法可以在抛出异常时将请求重定向到错误页面。您可以将其添加到您的 web.xml 中:

InvalidLicenseException/license-error.jsp

由于您使用的是 spring,因此您也可以使用注解。阅读this

【讨论】:

    【解决方案3】:

    您可以使用 AOP Advises 来实现,

    建议:建议是针对特定连接点采取的操作。在 就编程而言,它们是当一个 在 应用。您可以将 Advices 视为 Struts2 拦截器或 Servlet 过滤器。

    所以你可以配置一个通知来处理验证。您还可以将它们配置为在需要执行的特定点(即)执行。

    但请记住,AOP 的范围仅适用于方法调用,它不像 servlet 过滤器那样提供响应。

    Learn More ..

    简单的例子here开始。

    【讨论】:

    • 感谢您的友好回复。目前,我实际上正在为每个请求提供建议,因为我必须有权访问请求和响应。我也可以在这方面发出请求。但没有回应。
    • 是的,正如@Soitirios 建议的那样,建议只能调用sendRedirect()forward() 方法。不是回应
    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2010-10-20
    • 2017-02-20
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多