Struts2拦截器深度解析:内部结构与执行顺序

需积分: 9 2 下载量 124 浏览量 更新于2024-09-16 收藏 134KB DOC 举报
"拦截器详解" 拦截器是面向切面编程(AOP)中的核心概念,它允许开发者在程序运行期间动态地插入代码片段,以实现特定的功能,如日志记录、事务管理、性能监控等。在Java Web开发框架中,如Struts2,拦截器扮演着关键角色,对Action调用进行预处理和后处理。 1. **Interceptor结构** Struts2中的拦截器(Interceptor)被组织成一个堆栈结构,每个拦截器都是一个独立的类,实现了`Interceptor`接口。当一个请求到达时,这些拦截器会按照它们在堆栈中的顺序依次执行。每个拦截器都具备决定是否继续执行下一个拦截器或Action的能力。堆栈顶部的拦截器最先执行,然后逐层向下,最后执行Action,Action执行完毕后再按照相反的顺序回溯,执行每个拦截器的后处理逻辑。 2. **Interceptor执行分析** - **Before Invocation**:当请求到达时,Struts2框架会根据配置的拦截器堆栈,从上至下依次调用每个拦截器的`intercept()`方法。这个方法是拦截器的核心,可以在此实现预处理逻辑。 - **Action Execution**:如果所有前置拦截器都没有阻止执行,那么Action会被调用。Action执行后,控制权会返回到最后一个执行的拦截器。 - **After Invocation**:每个拦截器在Action执行后会有一个后处理阶段,这通常用于清理工作,或执行与Action结果相关的逻辑。 - **Result Processing**:如果Action执行后返回了一个结果,该结果会与拦截器堆栈中的每个拦截器交互,直到找到处理该结果的拦截器或到达堆栈底部。 3. **源码解析** 在Struts2框架中,`DefaultActionInvocation`类是Action调用的核心,它负责管理拦截器堆栈的执行。`InterceptorStack`类则维护了拦截器链的结构,通过`invokeNext()`方法实现拦截器之间的递归调用。`Interceptor`接口定义了`intercept()`方法,实际的拦截器类必须实现此方法来提供自己的业务逻辑。 这种设计模式使得拦截器具有很好的灵活性和可扩展性。开发者可以根据需求自定义拦截器,添加到堆栈中,实现对Action调用的定制化处理。同时,拦截器可以组合使用,以实现更复杂的业务逻辑,而无需修改Action代码,遵循了开闭原则,提高了代码的可维护性和可复用性。 总结来说,拦截器是Struts2和其他许多Java Web框架中的重要组成部分,通过它们,我们可以实现非侵入式的功能增强,让代码更加模块化,降低了系统的耦合度,同时也提高了代码的可读性和可测试性。理解和熟练运用拦截器对于提升应用程序的质量和效率至关重要。
2018-09-27 上传
拦截器类 需要两个配合使用这里只有一个 @Configuration public class ServletContextConfig extends WebMvcConfigurerAdapter { public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/"); super.addResourceHandlers(registry); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerMyInterceptorAdapter()).addPathPatterns("/**") .excludePathPatterns("/") // .excludePathPatterns("/expressions/getExpressionsList") .excludePathPatterns("/loginInfo/getCordByIsPhone") .excludePathPatterns("/loginInfo/login11") //token失效跳轉 .excludePathPatterns("/loginInfo/insertLoginInfo") //注册 .excludePathPatterns("/loginInfo/login") //登录 .excludePathPatterns("/upload") //上传文件 .excludePathPatterns("/uploadListen") //上传文件 .excludePathPatterns("/admin/user/goLogin") //后台跳转登录 .excludePathPatterns("/admin/user/login") //后台登录 .excludePathPatterns("/loginInfo/getLoginInfo") //忘记密码 .excludePathPatterns("/loginInfo/getCord") //短信验证码 .excludePathPatterns("/loginInfo/getIsLoginInfo") //判断验证码&&登录 .excludePathPatterns("/loginInfo/getIsLoginInfo1") //判断验证码 .excludePathPatterns("/loginInfo/setPassWord") //设置密码 ; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } @Component public class HandlerMyInterceptorAdapter implements HandlerInterceptor { @Autowired private HeartbeatServiceImpl heartbeatService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { String url = request.getRequestURI(); if (url.contains("admin")) { User user = (User) request.getSession().getAttribute("user"); try { if (user.equals(null)) { response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } else { return true; } }catch (Exception e){ response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } }else { String token = request.getHeader("token"); if (token != null) { Jedis jedis = new Jedis(com.sevenSteps.util.RedisConfig.HOST, RedisConfig.PORT); String s = jedis.get(token); if(token.equals(s)) { heartbeatService = SpringUtil.getBean(HeartbeatServiceImpl.class); return heartbeatService.setOutDate(token); }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }