深入理解Struts2拦截器实现原理与代码示例

4星 · 超过85%的资源 需积分: 36 22 下载量 31 浏览量 更新于2024-09-18 收藏 59KB DOC 举报
拦截器在Struts2等框架中的应用至关重要,它允许我们在不修改原有业务逻辑的前提下,对业务流程进行增强或修改。拦截器的实现原理主要涉及以下几个关键步骤: 1. **拦截器类与被拦截类关联**: 拦截器是一个普通的Java对象,通过Java的动态代理技术,拦截器类能够与被拦截的业务逻辑类(如`ExecuteFunction`)关联起来。这种关联并非静态的,而是动态创建的代理对象,确保了拦截器能够访问到被拦截类的方法。 2. **反射机制的使用**: 利用Java的反射API,拦截器可以在运行时检查被拦截类的类型和方法,从而决定何时执行何种操作。例如,`beforeDoing()`方法会在执行`ExecuteFunction`的方法之前被调用,而`afterDoing()`则在方法执行后执行。 3. **拦截器处理策略**: 开发者可以通过配置文件(如XML或注解)来指定拦截器何时介入执行过程。例如,可以设置拦截器在特定的生命周期阶段(如请求开始、动作前后等)执行,控制拦截器的执行顺序,通常是基于它们在配置文件中的声明顺序。 4. **代理对象的创建**: 创建代理对象是实现拦截器的关键部分。拦截器类会生成一个代理类,该代理类包含了被拦截类的所有方法,但在调用这些方法时,会先执行拦截器定义的`beforeDoing()`和`afterDoing()`方法。这样,无论何时调用被拦截类的方法,拦截器的行为都会插入到方法调用链中。 5. **测试验证**: 为了确保拦截器功能正常,开发人员会编写测试用例,比如`ExecuteFunction`类,这个类实现了`ExecuteFunctionInterface`接口。测试程序运行时,可以看到拦截器的`beforeDoing()`方法在`execute()`方法执行前被调用,`afterDoing()`方法在执行后调用,证明拦截器的预期效果得以实现。 通过以上步骤,拦截器实现了对业务流程的透明化扩展,增强了系统的灵活性和可维护性。在实际开发中,可以根据需求定制不同的拦截器行为,为复杂的应用场景提供强大的扩展能力。
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 { } }