性能监控
如记录一下请求的处理时间,得到一些慢请求(如处理时间超过500毫秒),从而进行性能改进,一般的反向代理服务器如apache都具有这个功能,但此处我们演示一下使用拦截器怎么实现。
实现分析:
1、在进入处理器之前记录开始时间,即在拦截器的preHandle记录开始时间;
2、在结束请求处理之后记录结束时间,即在拦截器的afterCompletion记录结束实现,并用结束时间-开始时间得到这次请求的处理时间。
问题:
我们的拦截器是单例,因此不管用户请求多少次都只有一个拦截器实现,即线程不安全,那我们应该怎么记录时间呢?
解决方案是使用ThreadLocal,它是线程绑定的变量,提供线程局部变量(一个线程一个ThreadLocal,A线程的ThreadLocal只能看到A线程的ThreadLocal,不能看到B线程的ThreadLocal)。
package cn.javass.chapter5.web.interceptor; public class StopWatchHandlerInterceptor extends HandlerInterceptorAdapter { private NamedThreadLocal<Long> startTimeThreadLocal = new NamedThreadLocal<Long>("StopWatch-StartTime"); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { long beginTime = System.currentTimeMillis();//1、开始时间 startTimeThreadLocal.set(beginTime);//线程绑定变量(该数据只有当前请求的线程可见) return true;//继续流程 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { long endTime = System.currentTimeMillis();//2、结束时间 long beginTime = startTimeThreadLocal.get();//得到线程绑定的局部变量(开始时间) long consumeTime = endTime - beginTime;//3、消耗的时间 if(consumeTime > 500) {//此处认为处理时间超过500毫秒的请求为慢请求 //TODO 记录到日志文件 System.out.println( String.format("%s consume %d millis", request.getRequestURI(), consumeTime)); } } }
登录检测
在访问某些资源时(如订单页面),需要用户登录后才能查看,因此需要进行登录检测。
流程:
1、访问需要登录的资源时,由拦截器重定向到登录页面;
2、如果访问的是登录页面,拦截器不应该拦截;
3、用户登录成功后,往cookie/session添加登录成功的标识(如用户编号);
4、下次请求时,拦截器通过判断cookie/session中是否有该标识来决定继续流程还是到登录页面;
5、在此拦截器还应该允许游客访问的资源。
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //1、请求到登录页面 放行 if(request.getServletPath().startsWith(loginUrl)) { return true; } //2、TODO 比如退出、首页等页面无需登录,即此处要放行 允许游客的请求 //3、如果用户已经登录 放行 if(request.getSession().getAttribute("username") != null) { //更好的实现方式的使用cookie return true; } //4、非法请求 即这些请求需要登录后才能访问 //重定向到登录页面 response.sendRedirect(request.getContextPath() + loginUrl); return false; }
提示:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的、最先应该使用的。如登录这种拦截器最好使用Filter来实现。
from:http://jinnianshilongnian.iteye.com/blog/1670856
相关推荐
首先,我们来看看标题提到的"Interceptor",这是Spring MVC中的一个关键组件。拦截器(HandlerInterceptor)用于在请求被实际处理之前和之后执行一些额外的任务,如记录请求日志、性能监控等。在Spring Boot中,我们...
在Spring MVC框架中,拦截器(Interceptor)是一个至关重要的组件,它允许开发者在请求处理之前、之后或在处理过程中执行自定义逻辑。拦截器可以用于实现日志记录、权限检查、性能统计、事务管理等多种功能,极大地...
Interceptor框架在软件开发中起着关键作用,尤其是在Java企业级应用中,如Spring AOP(面向切面编程)和各种框架中的拦截器机制。本文将深入探讨Interceptor框架的实现,主要涉及Java代理和反射技术。 首先,理解...
本示例——"spring-method-interceptor"着重展示了如何利用Spring Boot 2.x和Spring Web MVC实现一个自定义的`HandlerInterceptor`,用于拦截带有特定注解的方法调用。 首先,`HandlerInterceptor`是Spring MVC中的...
Struts2、Spring和Hibernate是Java Web开发中的三个核心框架,它们各自负责应用程序的不同层面,协同工作能够构建出高效、可维护的Web应用程序。Struts2是一个MVC框架,主要处理用户界面和业务逻辑的交互;Spring是...
SSO(Single Sign-On)...综上所述,这个项目通过整合Spring、SpringMVC、Interceptor、JWT和Redis,构建了一个高效、安全的SSO单点登录系统,使得用户在多应用环境中只需一次登录,即可畅游各个应用,提升了用户体验。
它们各自专注于应用程序的不同方面:Struts 2 主要负责MVC(Model-View-Controller)架构的实现,而Spring则是一个全面的企业级应用框架,提供依赖注入、事务管理、AOP(面向切面编程)等功能。 **Struts 2 框架** ...
Struts 2作为MVC(模型-视图-控制器)框架,主要处理用户请求和转发响应,它通过Action和Interceptor实现业务逻辑与展示逻辑的解耦,提供了丰富的插件和定制机制,增强了应用的可扩展性和灵活性。 Spring框架则是一...
《轻量级Java_EE企业应用实战_Struts_2+Spring_3+Hibernate整合开发_第3版》这本书深入探讨了在Java EE环境下如何利用轻量级框架Struts 2、Spring 3和Hibernate进行高效的企业级应用开发。这三者结合在一起,形成了...
《精通Java EE Eclipse Struts2 Hibernate Spring整合应用案例 源代码18章 bookstore》是针对Java企业级开发的一份重要资源,旨在帮助开发者深入理解并掌握如何在Eclipse环境中集成Struts2、Hibernate和Spring框架...
**Spring MVC —— 第一个应用程序** Spring MVC 是 Spring 框架的一个模块,主要用于构建 Web 应用程序。它提供了一种模型-视图-控制器(MVC)架构,简化了开发过程,使得开发者可以专注于业务逻辑而不必过于关心...
Java高级框架应用开发案例教程,主要关注的是Struts2、Spring和Hibernate这三大经典开源框架的整合开发,也称为SSH框架。这些框架是Java企业级应用程序开发中的核心工具,能够帮助开发者实现高效的MVC(Model-View-...
Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责应用程序的不同层面:Struts2处理MVC模式中的视图和控制器,Hibernate管理数据库持久化,而Spring则提供了全面的依赖注入和面向切面编程支持。...
Struts2、Hibernate和Spring是Java企业级应用中三大核心框架,它们的整合使用能够构建出高效、可维护且松耦合的Web应用程序。本文将深入剖析这三者如何协同工作,并通过具体范例来应用这些知识。 Struts2作为MVC...
Struts2.0、Hibernate3.1 和 Spring2.0 是经典的Java企业级开发框架,它们的整合应用是构建高效、可维护的企业级Web应用程序的关键。这个实例旨在帮助那些已经有一定基础的开发者提升技能,通过结合这些技术,实现对...
7. **Spring AOP中的拦截器调用实现**:Spring AOP使用Advisor和Interceptor实现拦截器链,处理方法调用前后的逻辑。MethodBeforeAdvice、AfterReturningAdvice等接口定义了拦截器的行为。 8. **Spring 驱动...
Interceptor广泛应用于框架如Spring、MyBatis等,用于实现事务管理、日志记录、权限控制等功能。在本篇文章中,我们将探讨如何在没有现成框架支持的情况下,模拟实现一个简单的Interceptor过程。 首先,我们需要...
本项目基于Maven,采用Spring MVC和Apache CXF框架,实现了一个完整的WebService服务器,同时还涉及到了Interceptor(拦截器)和Sitemesh技术。下面我们将深入探讨这些技术及其在项目中的应用。 首先,Maven是一个...
Struts 2是一个基于MVC设计模式的Web应用程序框架,它通过提供Action、Result、Interceptor等组件,有效地组织了控制器层。Struts 2与Spring的结合,可以实现对业务对象的管理,利用Spring的DI特性,使得Struts 2的...
Struts 2 和 Spring 是两种在 Java Web 开发中广泛使用的开源框架,它们结合使用可以构建高效、可扩展的企业级应用程序。Struts 2 主要负责 MVC(模型-视图-控制器)架构的设计,而 Spring 提供了依赖注入、事务管理...