过滤器学习笔记
Filter过滤器简介
- 过滤器(Filter)是J2EE Servlet模块下的组件
Filter的作用是对URI进行统一的拦截处理
Filter通常用于应用程序层面进行请求的前置处理
开发Filter过滤器
- 任何过滤器都要实现javax.servlet.Filter接口
在Filter接口的doFilter()方法中编写过滤器的功能代码
在web.xml中对过滤器进行配置,定义拦截URI的范围
<filter>
<filter-name>firstFilter</filter-name>
<filter-class>com.imooc.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>firstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器已生效");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
Filter过滤器的生命周期
- Filter.init()在服务器应用程序启动时执行
注:Servlet是在第一次处理请求时初始化
Filter.destory()在服务器程序停止时执行
注解配置过滤器
- @WebFilter (filterName=“annotationFilter”,urlPatterns=“/*”, initParams = {
@WebInitParam(name = “encoding”, value = “UTF-8”),
@WebInitParam(name = “p1”, value = “v1”),
@WebInitParam(name = “p2”, value = “v2”)
})
过滤器处理字符集乱码问题
- GET请求-server.xml增加URlEncoding=“UTF-8”
POST请求-使用request.setCharacterEncoding(“UTF-8”)
响应-response.setContentType(“text/html; charset=UTF-8”)
过滤器参数化
过滤器为了增强灵活性,允许配置信息放在web.xml
在web.xml中配置<init-param>设置过滤器参数
public class CharacterEncodingFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
System.out.println("enconding:" + encoding);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
req.setCharacterEncoding(encoding);
resp.setContentType("text/html;charset=utf-8");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
<filter>
<filter-name>charsetEncodingFilter</filter-name>
<filter-class>com.imooc.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charsetEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-pattern常用方法
- /index.html - 执行资源精准匹配
/servlet/* - 以前缀进行模糊匹配
*.html - 以后缀进行模糊匹配 - /和/*的区别:
/应用在Servlet配置,使该Servlet替代主页
*应用在过滤器,代表对所有请求拦截
过滤链
- 每一个过滤器应具有单独职能
过滤器的执行顺序以<filter-mapping>为准
调用chain.doFilter()将请求向后传递
注解形式的过滤器链是按照过滤器的类名的字母升序的顺序依次执行
过滤器多端设备自动匹配
public class DeviceAdapterFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String uri = req.getRequestURI();
String userAgent = req.getHeader("user-agent");
System.out.println(userAgent);
String targetUri = null;
if (uri.startsWith("/desktop") || uri.startsWith("/mobile")){
filterChain.doFilter(servletRequest, servletResponse);
} else {
if (userAgent.toLowerCase().indexOf("android") != -1 || userAgent.toLowerCase().indexOf("iphone") != -1){
targetUri = "/mobile" + uri;
}else {
targetUri = "/desktop" + uri;
}
resp.setContentType("text/html;charset=utf-8");
resp.sendRedirect(targetUri);
}
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
<filter>
<filter-name>deviceAdapterFilter</filter-name>
<filter-class>com.imooc.filter.DeviceAdapterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>deviceAdapterFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
监听器Listener
- 监听器(Listener)是J2EE Servlet模块下的组件
Listener的作用对Web应用对象的行为进行监控
通过Listener监听自动触发指定的功能代码
过滤器(Filter)的职责是对URL进行过滤拦截,是主动的执行
监听器(Listener)的职责是对Web对象进行监听,是被动触发
ServletContext -对全局ServletContext及其属性进行监听
HttpSession -对用户会话及其属性操作进行监听
ServletRequest -对请求及属性操作进行监听