目前正在学习Java,想把一些学习过程中的点点滴滴记录下来,一个原因是方便自己以后使用,另一个原因是巩固一下自己的学习成果和大家分享!!
下面我把我做过的一个springboot配置过滤器的案例分享给大家
Filter是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
1、首先在项目启动类中添加@ServletComponentScan注解进行扫描
@SpringBootApplication
@ServletComponentScan
public class DemoProjectApplication {
//启动类逻辑省略
}
2、在包目录下创建LoginFilter文件,并且实现Filter
public class LoginFilter implements Filter {
}
3、按住ctrl+o实现Filter里面的这三个方法
public class LoginFilter implements Filter {
/**
* 容器加载时
*
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
/**
* 容器销毁时
*
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
}
4、添加过滤器的注解@WebFilter,参数配置如下(注意:urlPatterns是拦截规则,⽀持正则,在此添加需要过滤的路径)
@WebFilter(urlPatterns = "/api/v1/pri/*", filterName = "loginFilter")//路径为测试路径
public class LoginFilter implements Filter {
// 刚才实现的三个方法省略
}
5、通过控制chain.doFilter的⽅法的调⽤,来实现是否通过放⾏(可以通过判断逻辑使用)
这是一个简单的逻辑,通过判断Token是否为空来过滤掉未登录的用户,仅供参考!!!
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter LoginFilter======");
if(getToken != null){
filterChain.doFilter(servletRequest, servletResponse);
}else{
return "没有登录,请登录";
}
}
6、下面我们来测试一下过滤器是否创建成功,我们在每一个方法体内都输出对应的一句话
public class LoginFilter implements Filter {
/**
* 容器加载的时候
*
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init LoginFilter======");
}
/**
* 容器执行的时候
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter LoginFilter======");
}
/**
* 容器销毁的时候
*/
@Override
public void destroy() {
System.out.println("destroy LoginFilter======");
}
}
然后启动springboot项目,我们可以看到当容器加载的时候init方法已经执行了
当我们关闭项目时,它又会执行销毁操作
为什么这里没有执行doFilter方法呢,因为我们这里没有写代码的逻辑,如果想让容器执行并且实现doFile里面的逻辑,我们需要在第4步添加我们的拦截路径,然后在过滤器里面写自己的逻辑就OK啦。
使用场景:多用于权限控制、⽤户登录状态控制等......
如果大家还有不懂或者有疑问的地方,欢迎多多交流哇。。。