目前我有一个 Spring MVC Web应用程序,它使用 ServletFilter 来过滤每个HTTP请求,并通过检查和验证用户来检查用户是否真的购买了许可证。许可文件内容。
我已经在spring xml文件和web.xml中相应地映射了过滤器。由于我可以访问过滤器中的HttpServletRequest
和HttpServletResponse
,因此如果验证失败,我可以将用户重定向到错误页面。
所以,现在正如标题所示,使用Spring AOP可以做同样的事情吗? Spring AOP如何配置为访问容器创建的请求和响应对象以重定向用户?
答案 0 :(得分:3)
如何配置Spring AOP以访问请求和 容器创建的响应对象重定向用户?
您将无法获得与servlet过滤器相同的行为。 Filter
通过在 Servlet
和ServletRequest
对象中传递来对目标ServletResponse
进行操作。从这个意义上说,你可以得到类似的行为,因为AOP建议可以在周围连接点并拦截传递的参数。
但是,AOP建议无法神奇地访问请求和响应。它要么建议接收它们的方法,要么从某个ThreadLocal
或其他容器中获取它们。例如,Spring有RequestContextHolder
可用于获取HttpServletRequest
。但它没有任何东西可以给你HttpServletResponse
(技术上不正确,但它不可靠)。你可以写一些类似的东西。
一旦建议可以访问对象,它就可以简单地调用HttpServletResponse#sendRedirect(..)
或forward()
或其他任何东西。
答案 1 :(得分:1)
实现此目的的最佳方法是使用异常。这样,检查和处理在不同情况下可以是不同的,例如, Web应用程序与正常应用程序。
您的支票可以使用aop添加到特定的联接点。如果发现某些不妥之处,它将抛出InvalidLicenseException(扩展RuntimeException)。现在有几种方法可以在抛出异常时将请求重定向到错误页面。您可以将其添加到您的web.xml:
&LT;错误页&GT;&LT;异常型&GT; InvalidLicenseException&LT; /异常型&GT;&LT;地点&gt; /license-error.jsp< /地点&gt;&LT; /错误页&GT;
由于您使用的是spring,因此您也可以使用注释。阅读this
答案 2 :(得分:0)
你可以使用AOP Advises
来完成建议:建议是针对特定连接点采取的操作。在 编程术语,它们是在a时执行的方法 在达到匹配切入点的某个连接点 应用。您可以将Advices视为Struts2拦截器或 Servlet过滤器。
因此,您可以配置建议以处理验证。您还可以将它们配置为在特定点(即)需要执行的位置执行。
但请记住,AOP的范围仅用于方法调用,并且它不会像servlet过滤器那样提供响应。
简单示例here开头。