监听器和过滤器
前言
声明:参考来源互联网,有任何争议可以留言。站在前人的肩上,我们才能看的更远。
本教程纯手打,致力于最实用教程,不需要什么奖励,只希望多多转发支持。 欢迎来我公号,希望可以结识你,也可以催更,搜索:JavaPub
有任何问题都可以来谈谈,等你!
监听器、过滤器、servlet是每个Java学习一定会遇到的,本篇写一写做个总结。希望对你有所帮助
- 这是一张经典的tomcat容器图,tomcat中过滤器、servlet、拦截器、控制器示意图如上所示:
- 过滤器包裹着servlet,servlet包裹住拦截器。
1,监听器
2,过滤器
2,1,过滤器介绍
过滤器顾名思义就是过滤东西的,过滤器是处于客户端和服务器资源的一道滤网,在客户端发起访问资源时,通过一系列过滤规则,把不符合的请求中途拦截。对响应也可以做过滤、拦截和修改。
2,2,应用场景
过滤器几乎在每一个Javaweb网站都有使用。
常用的应用场景:
- 登陆验证
- 统一设置编码格式
- 访问权限控制
- 敏感字符过滤
2,3,要点
- 一般过滤器我们都会写多个,建议Filter之间不要关联,各自处理各自的逻辑即可。这样,我们也无需关心执行顺序问题;
- 多个Filter是顺序执行的,在web.xml中,filter执行顺序跟<filter-mapper>顺序有关,先声明的先执行;
- 使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行;
- 如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter
2,4,实例应用
- 一般在登陆认证时,我们会获取session或cookie中的信息,然后在数据库中做验证。
2,4,1,注解方式
- MyFilter.java
package filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.*;
import java.io.IOException;
/**
* @author wangshiyu rodert JavaPub
* @date 2020/5/5 21:06
* @description urlPatterns 通配符(*)表示对所有的web资源进行拦截,下面是拦截(。jsp)结尾的。
*/
@WebFilter(filterName = "MyFilter", urlPatterns = "*.jsp", dispatcherTypes = {})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化,过滤器是在服务器启动时就会创建的,只会创建一个实例,常驻内存,也就是说服务器一启动就会执行Filter的init(FilterConfig config)方法。
System.out.println("过滤器初始化成功");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("开始过滤");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = ((HttpServletRequest) servletRequest).getSession();//获取到session信息
Cookie[] cookies = request.getCookies();//获取到cookie
String requestURI = request.getRequestURI();//请求地址
if (!requestURI.contains("login.jsp")) {
boolean boo = session.getAttribute("userName").equals("小明");
if (boo){
System.out.println("是用户【小明】,进入下一环节");
filterChain.doFilter(request, response); //交给下一个过滤器,或servlet处理
}else {
System.out.println("否则不是小明,跳转到登陆页面");
response.sendRedirect("login.jsp");
}
} else {
System.out.println("登陆页面,不进行拦截");
filterChain.doFilter(request, response);
}
}
@Override
public void destroy() {
//销毁时调用,当Filter被移除或服务器正常关闭时,会执行destroy方法。
System.out.println("已销毁");
}
}
2,4,2,传统方式
3,拦截器
4,区别与联系
拦截器是基于java的反射机制的,而过滤器是基于函数回调。 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。 拦截器可以获取IOC容器中的各个bean,而过滤器不行,在拦截器里面注入一个service可以调用业务逻辑。 过滤器是在请求进入容器后、请求进入servlet之前进行预处理的。请求结束返回也是在servlet处理完后返回给前端之前。 SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。 拦截器是spring容器的,是spring支持的。SpringMVC加上过滤器、拦截器大致执行流程如下图: