Spring Boot是在Spring的基础上封装而成,所以Spring的过滤器和拦截器在Spring Boot中同样可以使用。本文重点讲解Spring 中的过滤器。
在 Spring的web包中中提供有很多过滤器,这些过滤器位于org.springframework.web.filter。
- 过滤器的作用
过滤器可以再请求(dispacherServlet之前)和响应(响应给客户端)之前做一部分预处理,有效的过滤掉不需要的内容,而且过滤器可以被复用,节省了大量的复用代码,提高了java的代码执行效率。
- 过滤器的实现方式
(1) 直接实现Filter,这一类过滤器只有CompositeFilter;
(2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;
(3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;
(4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter
- 过滤器在容器中的位置
过滤器在web资源之前,可以对所有请求进行拦截,并可以在服务器端返回给客户信息前进行截取。
Filter:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。(Spring Boot中不需要通过代码配置)
Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。
- Filter的应用场景
- 用户授权的Filter(安全登录)
- 日志Filter(用户日志记录)
- 负责解码的Filter(控制编码方式)
- 检查请求内容(敏感词过来)
- Filter 有如下几个用处:
- 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
- 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
- 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
- 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。
- Filter类结构图
- 过滤器的生命周期
1.web.xml(实例化)
2.init(初始化)
3.doFilter(过滤)
4.destory(销毁)
- 以安全登录为例讲解Filter的使用
- 用户登录filter:UserLoginFilter
public class UserLoginFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse rpon = (HttpServletResponse)response;
if(req.getSession().getAttribute("status") == null) {
request.setAttribute("error", "非法进入");
request.getRequestDispatcher("/alogin.jsp").forward(request, response);;
}else {
//放行
//如果有下一个过滤器则跳到下一个过滤器
//如果没有下一个过滤器则跳到目标页面
filter.doFilter(request, response);
}
}
public void init(FilterConfig arg0) throws ServletException {
}
public void destroy() {
}
}
- 配置web.xml
<!-- 后台登录过滤 -->
<filter>
<filter-name>UserLoginFilter</filter-name>
<filter-class>cn.haoeasy.filter.AdminFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
filter-class 为过滤器Filter类(init-prama为注入的set参数)
Filter-mapping中的url-pattern为过滤的url类型