spring mvc拦截器
Spring Interceptor会按照提示说:在传入的HTTP请求到达您的Spring MVC控制器类之前对其进行拦截,或者相反,在它离开控制器之后但在将其反馈给浏览器之前,截取该发出的HTTP响应。
您可能会问这对您有什么用? 答案是,它允许您执行每个请求或一组请求通用的任务,而无需将“ n”粘贴样板代码切成每个控制器类。 例如,您可以在请求到达控制器之前执行用户身份验证,如果成功,则从数据库中检索一些其他用户详细信息,然后在调用控制器之前将其添加到HttpServletRequest对象。 然后,您的控制器可以简单地检索和使用这些值,或者将其留给JSP显示。 另一方面,如果身份验证失败,则可以将用户重定向到其他页面。
演示代码向您展示如何在传入的HttpServletRequest对象到达您的控制器之前对其进行修改。 这无非是向请求中添加一个简单的字符串,但是,正如我上面所说,您始终可以进行数据库调用以获取每个请求所需的一些数据……您甚至可以添加某种优化并做一些此时进行缓存。
public class RequestInitializeInterceptor extends HandlerInterceptorAdapter {// Obtain a suitable logger.private static Log logger = LogFactory.getLog(RequestInitializeInterceptor.class);/*** In this case intercept the request BEFORE it reaches the controller*/@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {try {logger.info("Intercepting: " + request.getRequestURI());// Do some changes to the incoming request objectupdateRequest(request);return true;} catch (SystemException e) {logger.info("request update failed");return false;}}/*** The data added to the request would most likely come from a database*/private void updateRequest(HttpServletRequest request) {logger.info("Updating request object");request.setAttribute("commonData","This string is required in every request");}/** This could be any exception */private class SystemException extends RuntimeException {private static final long serialVersionUID = 1L;// Blank}
}
在上面的代码中,我通过扩展HandlerInterceptorAdaptor类(覆盖preHandle(..)方法)选择了最简单的实现方法。 我的preHandle(...)方法执行错误处理,确定发生错误时的处理方式,如果发生错误则返回false。 返回false时,拦截器链会断开,并且不会调用您的控制器类。 处理请求对象的实际工作被委托给updateRequest(request)。
HandlerInterceptorAdaptor类具有三个方法,每个方法都被存根,如果需要,可以忽略。 这些方法是:prehandle(...),postHandle(...)和afterCompletion(...),有关这些的更多信息可以在Spring API文档中找到 。 请注意,这可能有些令人困惑,因为Handler Interceptor类文档仍通过其Spring 2处理程序名称引用MVC控制器类。 如果您查看prehandle(…)的Object类型的第三个参数(称为处理程序),就很容易说明这一点。 如果在调试器中进行检查,您将看到它是控制器类的实例。 如果您不熟悉这项技术,请记住该控制器==处理程序。
与往常一样,实现拦截器的下一步是向Spring XML配置文件中添加一些内容:
<!-- Configures Handler Interceptors -->
<mvc:interceptors> <!-- This bit of XML will intercept all URLs - which is what you want in a web app --><bean class="marin.interceptor.RequestInitializeInterceptor" /><!-- This bit of XML will apply certain URLs to certain interceptors --><!-- <mvc:interceptor><mvc:mapping path="/gb/shop/**"/><bean class="marin.interceptor.RequestInitializeInterceptor" /></mvc:interceptor>-->
</mvc:interceptors>
上面的XML演示了向所有请求URL添加拦截器的一种或一种选择,或者,如果您查看注释掉的部分,则向特定的请求URL添加拦截器,从而允许您选择将哪些URL连接到您的拦截器类。
鹰眼的读者可能已经注意到,拦截器类使用继承和XML配置作为其实现方法。 在配置方面的常规情况下,这种模式看起来有些疲惫,并且可能需要进行大修。 一种建议是使用已添加到控制器机制中的相同技术来增强整体以使用注释。 这将增加额外的灵活性,而不会导致使用所有接口和抽象基类复杂化。 作为建议,将来的拦截器类实现可能如下所示:
@Intercept(value = "/gb/en/*", method = RequestMethod.POST)public boolean myAuthenticationHandler(HttpServletRequest request,Model model) {// Put some code here}
这样就结束了对Spring拦截器的研究,应该记住,我只是展示了最基本的实现。
参考:来自Captain Debug博客的 JCG合作伙伴 Roger Hughes在MVC Webapp中使用Spring Interceptor 。
- jqGrid,REST,AJAX和Spring MVC集成
- SpringMVC 3 Tiles 2.2.2集成教程
- Spring MVC3 Hibernate CRUD示例应用程序
- Spring MVC开发–快速教程
- Spring,Quartz和JavaMail集成教程
- Spring Insight – Web应用程序分析
- Java教程和Android教程列表
翻译自: https://www.javacodegeeks.com/2011/10/spring-mvc-interceptors-example.html
spring mvc拦截器