前言
博主github
博主个人博客http://blog.healerjean.com
1、过滤器和拦截器
1.1、区别
①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
1.2、忽略URL配置
1.2.1、过滤器
public class Filter_1 implements Filter {
private FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws
IOException, ServletException {
//添加url进行判断忽略下面的方法
filterChain.doFilter(servletRequest, servletResponse);
}
}
1.2.2、拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor_1)
.addPathPatterns("/**")
.excludePathPatterns("/develop/swagger/**");//忽略的
}
1.3、启动顺序
谁先配置,谁先启动,DispatcherServlet之后那就顺序反过来执行了,具体看测试结果
1.3、过滤器和拦截器
1.3.1、过滤器1
package com.hlj.proj.config.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author HealerJean
* @version 1.0v
* @ClassName SpaceParamsFilter
* @Date 2019/9/29 14:33.
* @Description
*/
public class Filter_1 implements Filter {
private FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws
IOException, ServletException {
System.out.println("############ Filter_1 在DispatcherServlet之前执行############");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("############ Filter_1 在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后############");
}
@Override
public void destroy() {
this.filterConfig = null;
}
}
1.3.2、过滤器2
package com.hlj.proj.config.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author HealerJean
* @version 1.0v
* @ClassName SpaceParamsFilter
* @Date 2019/9/29 14:33.
* @Description 空格过滤
*/
public class Filter_2 implements Filter {
private FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws
IOException, ServletException {
System.out.println("############ Filter_2 在DispatcherServlet之前执行############");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("############ Filter_2 在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后############");
}
@Override
public void destroy() {
this.filterConfig = null;
}
}
1.3.3、拦截器1
package com.hlj.proj.config.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author HealerJean
* @ClassName Interceptor_1
* @date 2019/11/21 22:08.
* @Description
*/
@Component
@Slf4j
public class Interceptor_1 implements HandlerInterceptor {
/**
* 在DispatcherServlet之前执行
* */
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("************ Interceptor_1 在DispatcherServlet之前执行**********");
return true;
}
/**
* 在controller执行之后的DispatcherServlet之后执行
* */
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
System.out.println("************ Interceptor_1 在controller执行之后的DispatcherServlet之后执行**********");
}
/**
* 在页面渲染完成返回给客户端之前执行
* */
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("************ Interceptor_1 在页面渲染完成返回给客户端之前执行**********");
}
}
1.3.4、拦截器2
package com.hlj.proj.config.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author HealerJean
* @ClassName Interceptor_1
* @date 2019/11/21 22:08.
* @Description
*/
@Component
@Slf4j
public class Interceptor_2 implements HandlerInterceptor {
/**
* 在DispatcherServlet之前执行
* */
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
System.out.println("************ Interceptor_2 在DispatcherServlet之前执行**********");
return true;
}
/**
* 在controller执行之后的DispatcherServlet之后执行
* */
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception {
System.out.println("************ Interceptor_2 在controller执行之后的DispatcherServlet之后执行**********");
}
/**
* 在页面渲染完成返回给客户端之前执行
* */
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out