Spring Boot学习之旅:(八)过滤器 Filter
2017-10-28 14:49
435 查看
1.Filter简介
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
2.Filter功能
在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。大致流程图如下:
3.过滤器实现
1、实现自定义的 Filter 需要满足一下条件:1)实现 javax.servlet.Filter 接口,实现其 init、doFilter、destroy 三个方法。
2)实现Filter 在spring中的配置。
2、javax.servlet.Filter 接口
1) Filter 接口有三个方法:这三个方法反应了 Filter 的生命周期。
①、init:只会在 web 程序加载的时候调用,即启动如tomcat等服务器时调用。一般负责加载配置的参数。
②、destroy :web程序卸载的时候调用。一般负责关闭某些容器等。
③、doFilter:每次客户端请求都会调用一次。Filter 的所有工作基本都集中在该方法中进行。
下面实现一个见到的过滤器代码如下
public class TimeFilter implements Filter{ /** * 销毁方法 */ public void destroy() { System.out.println("Filter destory"); } /** * 执行过滤器 */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("开始执行 doFilter"); long start =new Date().getTime(); chain.doFilter(request, response); System.out.println("执行结束 time fliter"+(new Date().getTime()-start)); System.out.println("time fliter finish"); } /** * 创建方法 */ public void init(FilterConfig arg0) throws ServletException { System.out.println("Filter init"); } }
3、 配置 Filter:
1) 可以使用 @Component
2 ) 申明一个bean
@Bean public FilterRegistrationBean TimeFilter() { FilterRegistrationBean filterRegistrationBean =new FilterRegistrationBean(); TimeFilter timeFilter=new TimeFilter(); filterRegistrationBean.setFilter(timeFilter); List<String> urls=new ArrayList<String>(); urls.add("/user/*"); filterRegistrationBean.setUrlPatterns(urls); return filterRegistrationBean; }
使用 urls.add(“/user/*”); 配置过滤的路径
下面启动一下工程
如果看到如下的日志则代表过滤器初始化成功了
下面编写一个编写一个controller 进行测试
@GetMapping("/{id}") public String getUset(@PathVariable String id) { logger.info(id); return id; }
开启工程 浏览器输入 http://localhost:8082/user/1 观察日志
4.案例
实现是一个登录检测 如果没有登录则跳转登录页面Object user=((HttpServletRequest)request).getSession().getAttribute("users"); if(user==null){ response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); StringBuilder builder = new StringBuilder(); builder.append("<script type=\"text/javascript\" charset=\"UTF-8\">"); builder.append("alert(\"登录失效请重新登录\");"); builder.append("window.location.href=\"/page/login/\";"); builder.append("</script>"); out.print(builder.toString()); out.close(); }else{ chain.doFilter(request, response); }
修改 doFilter 中的代码当用户没有登录时显示如下
文章地址:http://www.haha174.top/article/details/254683
源码地址:https://github.com/haha174/boot.git
相关文章推荐
- SpringBoot学习之路:09.Spring Boot中添加Filter应用
- SpringBoot系列<八>过滤器filter和监听器listener配置
- SpringBoot学习笔记(4):添加自定义的过滤器
- SpringBoot学习教程 - 03 - 配置Servlet、Filter、Listener
- springboot新增过滤器Filter
- 【系统学习SpringBoot】SpringBoot自定义Filter
- SpringBoot进阶学习二(自定义Filter)
- Spring Boot的filter(过滤器)简单使用实例详解
- SpringBoot之过滤器Filter
- spring boot---WebFilter注解 实现自定义登录过滤器
- SpringBoot学习-(十一)SpringBoot过滤器
- Spring boot中使用过滤器filter
- ZendFramework学习第三章(核心组件—过滤器之 Zend_Filter_Input过滤器)
- SpringBoot学习:获取yml和properties配置文件的内容(转)
- spring-boot过滤器
- spring boot学习6之mybatis+PageHelper分页插件+jta多数据源事务整合
- 深入学习微框架:Spring Boot
- 一起学习springboot[前言]
- Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)
- springboot学习三(springboot结合spring data jpa和freemarker显示)