【.net mvc】转【Spring boot】-【拦截器】
在.Net MVC开发中,我们经常使用过滤器来验证身份权限等,那么在Java Spring boot中又没有类似的实现呢?答案是有的!
.Net MVC实现过滤器
public class FilterAttribute : ActionFilterAttribute { public string Message { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />"); } public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />"); } public override void OnResultExecuting(ResultExecutingContext filterContext) { base.OnResultExecuting(filterContext); filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />"); } public override void OnResultExecuted(ResultExecutedContext filterContext) { base.OnResultExecuted(filterContext); filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />"); } }
Java Spring Boot 实现过滤器
/** * 自定义拦截器1 */ public class MyInterceptor implements HandlerInterceptor { /** *预处理回调方法,实现处理器的预处理(如登录检查)。 *第三个参数为响应的处理器,即controller。 *返回true,表示继续流程,调用下一个拦截器或者处理器。 *返回false,表示流程中断,通过response产生响应。 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(">>>MyInterceptor1>>>>>>>在请求处理之前进行调用(Controller方法调用之前)"); return true;// 只有返回true才会继续向下执行,返回false取消当前请求 } /** *当前请求进行处理之后,也就是Controller 方法调用之后执行, *但是它会在DispatcherServlet 进行视图返回渲染之前被调用。 *此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理。 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(">>>MyInterceptor1>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)"); } /** *方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。 *这个方法的主要作用是用于进行资源清理工作的。 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(">>>MyInterceptor1>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)"); } }
Java里需要注册拦截器
为了使自定义的拦截器生效,需要注册拦截器到spring容器中,具体的做法是继承
WebMvcConfigurerAdapter
类,覆盖其addInterceptors(InterceptorRegistry registry)
方法。最后别忘了把Bean注册到Spring容器中,可以选择@Component 或者 @Configuration。@Component public class InterceptorConfiguration extends WebMvcConfigurerAdapter{ @Override public void addInterceptors(InterceptorRegistry registry) { // 注册拦截器 InterceptorRegistration ir = registry.addInterceptor(new MyInterceptor()); // 配置拦截的路径 ir.addPathPatterns("/**"); // 配置不拦截的路径 ir.excludePathPatterns("/static/**"); // 还可以在这里注册其它的拦截器 //registry.addInterceptor(new OtherInterceptor()).addPathPatterns("/**"); } }