您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: