鄞州中学网站谁做的,wordpress婚礼主题公园,莲塘网站建设,wordpress小图标大全我以为是时候看看Spring的MVC拦截器机制了#xff0c;这种机制已经存在了很多年#xff0c;并且是一个非常有用的工具。 Spring Interceptor会按照提示进行操作#xff1a;在传入的HTTP请求到达您的Spring MVC控制器类之前对其进行拦截#xff0c;或者相反#xff0c;在其… 我以为是时候看看Spring的MVC拦截器机制了这种机制已经存在了很多年并且是一个非常有用的工具。 Spring Interceptor会按照提示进行操作在传入的HTTP请求到达您的Spring MVC控制器类之前对其进行拦截或者相反在其离开您的控制器之后但在将其反馈给浏览器之前对其进行拦截。 您可能会问这对您有什么用 答案是它允许您执行每个请求或一组请求共有的任务而无需将“ 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时拦截器链会断开并且不会调用您的控制器类。 与请求对象混淆的实际事务被委托给updateRequestrequest。 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 classmarin.interceptor.RequestInitializeInterceptor /!-- This bit of XML will apply certain URLs to certain interceptors --!-- mvc:interceptormvc:mapping path/gb/shop/**/bean classmarin.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 。 相关文章 jqGridRESTAJAX和Spring MVC集成 SpringMVC 3 Tiles 2.2.2集成教程 Spring MVC3 Hibernate CRUD示例应用程序 Spring MVC开发–快速教程 SpringQuartz和JavaMail集成教程 Spring Insight – Web应用程序分析 Java教程和Android教程列表 翻译自: https://www.javacodegeeks.com/2011/10/spring-mvc-interceptors-example.html