走进SpringBoot之过滤器、监听器、拦截器

走进SpringBoot之过滤器、监听器、拦截器

 该篇主要记录SpringBoot项目中如何使用 过滤器、监听器、拦截器。关于 过滤器、监听器和拦截器有过web开发经验的 同志们都知道,在web.xml中做相对应的配置,指定实现类即可。过滤器只能再web项目中使用,拦截器则都可以。过滤器和拦截器主要可以实现请求过滤,例如我们web项目判断一个请求之前要先拦截判断,是都有权限来访问,session中是否有登录过的标志等等功能。

过滤器

1.首先创建一个SpringBoot项目。创建一个MyFilter  实现接口Filter

@WebFilter(filterName = "myFilter",urlPatterns = {"/*"})
public class MyFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("MyFilter init ");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req = (HttpServletRequest) request;
		System.out.println("MyFilter doFilter"+req.getParameter("name"));
		chain.doFilter(request, response);
		return ;
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("MyFilter destroy");
	}

}

在该类上添加注解

@WebFilter(filterName = "myFilter",urlPatterns = {"/*"})

 指定过滤器的名称和要过滤的地址。

2.在入口的启动类上添加注解

@SpringBootApplication
@ServletComponentScan
public class FilterSpringBootApplication {

	public static void main(String[] args) {
		SpringApplication.run(FilterSpringBootApplication.class, args);
	}
}

  启动项目可以在启动的日志中看见 

 过滤器已经初始化了。

3.编写controller: FilterController

@Controller
public class FilterController {

	@RequestMapping("/testMyFilter")
	public String testMyFilter() {
		return "Hello Filter";
	}
}

 重启项目,访问http://127.0.0.1:8080/testMyFilter?name=ccl

控制台输出正确。

至此,一个过滤器就可以使用了,但是在我们平常的工作中一般有多个过滤器,并且要指定每个过滤器的顺序等等,那么用这种方式是没有办法 实现的,可以使用FilterRegistrationBean 来实现 

1.将上面项目的 过滤器上的@WebFilter(filterName = "myFilter",urlPatterns = {"/*"}) 去掉,将入口类的@ServletComponentScan去掉。

2.根据之前 的做饭做法再编写一个过滤器: MyFilterTwo

public class MyFilterTwo implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("MyFilterTwo init ");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req = (HttpServletRequest) request;
		System.out.println("MyFilterTwo doFilter"+req.getParameter("name"));
		chain.doFilter(request, response);
		return ;
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("MyFilterTwo destroy");
	}

}

 

3. 编写java配置文件FilterConfig

 @Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
    	FilterRegistrationBean filterRegistrationBean = 
    			new FilterRegistrationBean();
    	filterRegistrationBean.setFilter(new MyFilter());
    	//指定过滤器的执行顺序
    	filterRegistrationBean.setOrder(2);
    	filterRegistrationBean.addUrlPatterns("/*");
    	return filterRegistrationBean;
    }
    @Bean
    public FilterRegistrationBean filterRegistrationBean2() {
    	FilterRegistrationBean filterRegistrationBean = 
    			new FilterRegistrationBean();
    	filterRegistrationBean.setFilter(new MyFilterTwo());
    	filterRegistrationBean.setOrder(1);
    	filterRegistrationBean.addUrlPatterns("/*");
    	return filterRegistrationBean;
    }
}

 然后启动项目

过滤器初始化成功 

访问http://127.0.0.1:8080/testMyFilter?name=ccl

执行成功,且顺序和设置的一致。

 

监听器 

监听器主要是对对象自身的创建和销毁进行监听 

主要有ServletContextListener、HttpSessionListener、ServletRequestListener,用法基本一致

下面以HttpSessionListener为例,用来监听 统计当前访问人数。

1.首先创建一个CountListener实现HttpSessionListener

public class CountListener implements HttpSessionListener  {
    private int count = 0;
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		count++;
		se.getSession().getServletContext().setAttribute("count", count);
		System.out.println("新增在线人数,当前在线人数:"+count);
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		count--;
		se.getSession().getServletContext().setAttribute("count", count);
		System.out.println("删减在线人数,当前在线人数:"+count);
	}

	 
	 

}

2.创建配置文件类,注册该监听器

@Configuration
public class ListenerConfig {

	@Bean
	public ServletListenerRegistrationBean<CountListener>
		countListenerServletRegistrationBean(){
		return new ServletListenerRegistrationBean<CountListener>(
				new CountListener());
	}
}

3.创建controller

@RestController
public class ListenerConterller {

	@RequestMapping("/testListenerLogin")
	public String testListenerLogin(HttpServletRequest req) {
		System.out.println("当前在线人数"+req.getSession().getId()+":"
				+req.getSession().getServletContext().getAttribute("count"));
		return "Hello testListenerLogin";
	}
	 
}

启动项目 访问http://127.0.0.1:8080/testListenerLogin 可以看见

 

再 开启一个浏览器访问上述地址

得到我们想要的效果,  当然HttpSessionListener除了创建和销毁方法还有一些其他的方法可以实现。

上面使用java配置文件注册的方式注册监听器,当然还有更简单的,直接使用注解

1.在CountListener类上添加@WebListener注解,标记为监听器 

@WebListener
public class CountListener implements HttpSessionListener  {
    private int count = 0;
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		count++;
		se.getSession().getServletContext().setAttribute("count", count);
		System.out.println("新增在线人数,当前在线人数:"+count);
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		count--;
		se.getSession().getServletContext().setAttribute("count", count);
		System.out.println("删减在线人数,当前在线人数:"+count);
	}

	 
	 

}

 2.在项目的启动类上添加注解@ServletComponentScan扫描

@SpringBootApplication
@ServletComponentScan

public class ListenerSpringBootApplication {

	public static void main(String[] args) {
		SpringApplication.run(ListenerSpringBootApplication.class, args);
	}
}

一样启动项目,用两个浏览器访问 http://127.0.0.1:8080/testListenerLogin  可以看见和之前是一样的效果

 

拦截器

 拦截器和过滤器的功能类似,但是是不同的东西

过滤器只能在web项目中使用, 拦截器可以在非web项目中使用。

过滤器是servlet容器支持的,拦截器是spring支持的,所以拦截器可以使用spring的资源,例如数据源,可以注入的对象等等,而过滤器是不行的。

过滤器只在servlet前后起作用,但是拦截器可以深入 到方法前后等等,功能更强大,所以再spring中要优先使用拦截器

.1.首先创建一个项目,创建一个类MyInterceptor 实现HandlerInterceptor 

@Component
public class MyInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("preHandle....");
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("postHandle....");
		
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println("postHandle....");
		
	}

}

 2.创建java配置类InterceptorConfig 继承WebMvcConfigurerAdapter

@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter{

	@Autowired
	MyInterceptor myInterceptor;
	@Override
	 public void addInterceptors(InterceptorRegistry registry) {
		 //注册拦截器 拦截规则
		//多个拦截器时 以此添加 执行顺序按添加顺序
		registry.addInterceptor(myInterceptor).addPathPatterns("/*");
	 }
}

3.创建controller .

@Controller
public class InterceptorCotroller {
	@RequestMapping("/testinterceptor")
	public ModelAndView testInterceptor() {
		System.out.println("进入controller");
		ModelAndView mv = new ModelAndView();
		
		mv.setViewName("aaa");
		System.out.println("即将返回modelandview");
		return mv;
	}
}

4.启动项目访问http://127.0.0.1:8080/testinterceptor

至此,过滤器、拦截器、监听器的基本使用完成,在实际项目中主要是考虑编写拦截业务等。例如在拦截器上判断session中是否存在某个值,或者判断redis中token是否过期来判断是否可以 访问请求。

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值