过滤器:
过滤器的概述:
什么是过滤器:
过滤器:Filter. 对客户端向服务器发送的请求进行过滤.
- Filter和Listener都属于Servlet中的高级部分.Filter是Servlet中最为实用的技术.
为什么学习过滤器: - 过滤敏感词汇.
- 统一网站的字符集编码.
- 可以控制自动登录
使用过滤器:
步骤一:编写一个类实现Filter接口.
步骤二:配置过滤器. FilterDemo1 com.juwins.filter.demo1.FilterDemo1 FilterDemo1 /*
FilterChain对象的概述:过滤器链.
什么是过滤器链:
过滤器链指的是 一组过滤器对某些WEB资源进行过滤.那么这组过滤器称为是过滤器链.
这组过滤器链执行的顺序与配置顺序有关!!!
Filter的生命周期:
什么是生命周期:
生命周期:对象从创建到销毁的过程.
- Servlet的生命周期:Servlet对象从创建到销毁过程.(*)
- 生命周期:
- 从客户端第一次访问Servlet的时候,服务器创建一个Servlet的对象.Servlet中init方法就会执行.每次访问Servlet服务器都会开启一个线程访问Servlet中的service方法.service方法内部根据请求的方式的不同调用doXXX的方法.当项目从服务器中移除或者关闭服务器的时候.服务器就会销毁Servlet对象.Servlet中的destroy方法就会执行.
- 创建:
- 第一次访问这个Servlet的时候.
- 启动的时候创建Servlet:2
- 销毁:
- 服务器关闭或者是项目移除!
Filter的生命周期:(记住、了解)
指的是Filter从创建到销毁的过程!!! - Filter何时创建和销毁:
- 创建:
- 服务器启动的时候创建Filter的对象.
- 销毁:
- 服务器关闭的时候或者是项目移除!
Filter的生命周期:
- 服务器启动的时候,服务器创建一个代表过滤器对象.过滤器中init方法就会执行了.当过滤器过滤到要进行拦截的资源的路径的时候,doFilter方法就会执行.当服务器关闭的时候.销毁过滤器对象.destroy方法就会执行.
FilterConfig:过滤器的配置对象.
方法: - 获得过滤器的名称:
- 获得过滤器的初始化参数的方法:
- 获得过滤器的所有初始化参数的名称:
- 获得ServletContext对象.
代码:
// 1.获得过滤器的名称:
String filterName = filterConfig.getFilterName();
System.out.println(“过滤器的名称:”+filterName);
// 2.获得初始化参数的值:
String username = filterConfig.getInitParameter(“username”);
String password = filterConfig.getInitParameter(“password”);
System.out.println(“过滤器的初始化参数:”+username+” “+password);
// 3.获得所有初始化参数的名称:
Enumeration e = filterConfig.getInitParameterNames();
while(e.hasMoreElements()){
String name = e.nextElement();
String value = filterConfig.getInitParameter(name);
System.out.println(name+” “+value);
}
过滤器相关的配置:
- :过滤器的名称
- :过滤器的全路径.
- :初始化参数的名称
- :初始化参数的值 ``` private FilterConfig filterConfig;
@Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; }
@Override public void doFilter(S ervletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 获得初始化参数:字符集: String encoding = filterConfig.getInitParameter(“encoding”); request.setCharacterEncoding(encoding); response.setContentType(“text/html;charset=”+encoding); chain.doFilter(request, response); }
@Override public void destroy() {
} ```
}
分IP统计网站访问次数的过滤器:
代码:
public class IPFilter implements Filter{
private FilterConfig filterConfig;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 创建一个Map集合:Map用于保存客户的IP和对应的访问次数:
Map
// 将Map集合存入到ServletContext域中.
filterConfig.getServletContext().setAttribute(“map”, map);
this.filterConfig = filterConfig;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 获得Map集合
Map
.getServletContext().getAttribute(“map”);
// 获得客户端IP地址:
String ip = request.getRemoteAddr();
// 判断IP是否已经在Map集合中.
Integer count = map.get(ip);
if(count == null){
// 没有访问过这个网站.
map.put(ip, 1);
}else{
// 之前访问过网站.
count++;
map.put(ip, count);
}
//放行:
chain.doFilter(request, response);
} @Override
public void destroy() {
}}
自动登录的过滤器:
登录功能的编写:
- 步骤一:引入jar包:
- mysql驱动:
- c3p0连接池:
- DBUtils工具类:
- BeanUtils工具类:
- JSTL包:
- 步骤二:引入配置文件
- c3p0的配置文件:
- UTILS工具类
- 步骤三:创建登录页面:
- login.jsp
- 步骤四:编写登录的业务逻辑:
- 编写LoginServlet:
- 编写UserService:
- 编写UserDao:
- 步骤五:创建成功页面:
- demo5/success.jsp
- 步骤六:在登录页面中勾选自动登录复选框:记住用户名和密码
String remember = request.getParameter(“remember”);
if(“true”.equals(remember)){
// 复选框已经勾选:
// 使用Cookie记住用户名和密码.
Cookie cookie = new Cookie(“autoLogin”, existUser.getUsername()+”#juwins#”+existUser.getPassword());
// 设置Cookie的有效访问路径:
cookie.setPath(“/“);
// 设置Cookie的有效时间:
cookie.setMaxAge(60_60_24);
// 回写到浏览器:
response.addCookie(cookie);
} - 步骤七:编写自动登录的过滤器:
public class AutoLoginFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
/*
判断Session中是否已经存在用户的登录信息:
已经存在:
放行.
不存在:
从request中获得所有Cookie的信息.
查找指定名称Cookie:
没有查询到:
直接放行.
查询到:
获得Cookie中的用户名和密码:
根据用户名和密码去数据库进行查询:
查询到用户:
将用户的信息保存到session中
放行.
没有查找到用户:
Cookie中用户名和密码有可能被篡改.
放行.
*/
HttpServletRequest req = (HttpServletRequest) request;
// 判断Ses-sion中是否有用户的信息.
User existUser = (User) req.getSession().getAttribute(“existUser”);
if(existUser != null){
// 已经存在:
chain.doFilter(req, response);
}else{
// 从Cookie中获取:
Cookie[] cookies = req.getCookies();
// 查找指定名称Cookie
Cookie cookie = CookieUtils.findCookie(cookies, “autoLogin”);
if(cookie == null){
// 没有找到指定名称的Cookie:
chain.doFilter(req, response);
}else{
// 找到了指定名称的Cookie:
// 从Cookie中获得用户名和密码的信息:
String value = cookie.getValue();
String username = value.split(“#juwins#”)[0];
String password = value.split(“#juwins#”)[1];
// 使用用户名和密码去数据库进行查询:
UserDao userDao = new UserDao();
User user = userDao.findByUsernameAndPassword(username, password);
if(user == null){
// 用户名或密码错误:
// Cookie的信息被篡改.
chain.doFilter(req, response);
}else{
// 登录成功:
req.getSession().setAttribute(“existUser”, user);
chain.doFilter(req, response);
}
}
}
} @Override
public void destroy() {
}
}