Filter过滤器
过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理。在中间就可以过滤,起到的是拦截的作用。
不仅仅作用于客户端请求,而且过滤服务器响应
作用:
- 对一些敏感词汇进行过滤
- 统一设置编码
- 自动登录
如何使用Filter?
- 新建一个类,实现Filter接口
- 注册过滤器,在web.xml中配置filter,url建议为/*
- chain.doFilter(request, response);//是否连接下一个过滤器,也就是说,过滤器3是否放行,让后续过滤器执行拦截功能
- init方法的参数FilterConfig可用于获取filter在注册的名字以及初始化参数(在web.xml配置),这里的功能设计的初衷与ServletConfig是一样的
- 如果想放行,在doFilter方法里面操作,让请求到达下一个目标
- url-pattern写法格式:
-
- 全路径匹配 /LoginServlet
- 目录匹配 (/目录开始 , /* 结束) /jsp/*
- 以后缀名匹配,以*开始,以后缀名结束 *.jsp *.html等
- 针对dispatch设置:<dispatcher></dispatcher>
-
-
-
- REQUEST 只要请求过来都拦截,默认是REQUEST
- FORWARD 只要是转发都拦截
- ERROR 页面出错跳转
- INCLUDE 包含页面则拦截
-
-
-
Filter的生命周期:
创建:部署到服务器,则初始化,创建
销毁:服务器停止则销毁
Filter的执行顺序:
- 客户端发送请求,先经过过滤器,如果过滤器放行,那么才到Servlet。不仅仅作用域客户端请求,而且过滤服务器响应
- 如果有多个过滤器,那么他们会按照注册的映射顺序来
Filter实现自动登录功能:
- 1.获取信息
- 2.校验失败,原页面
- 3.校验成功,跳转index.jsp
- 1存储账号密码到cookie
- 2发送Cookie给客户端
- 3使用Session存起来储用户信息,session在关闭服务器或者超过默认时间才销毁
- 4.过滤器:
- 获取Cookie
- 没有Cookie则表明没有登录,放行。
- 有Cookie,找出曾经放的用户名和密码,执行登录的操作。
- 使用Session存起来这个用户值,放行。
一、Servlet校验登录信息,保存Cookie
思路:
- 拿到用户名和密码进行校验,失败则重新返回登录页面
- 校验成功则用session存储用户信息跳转到首页,并判断是否勾选了自动登录
- 如果勾选了自动登录,那么将用户名和密码封装成Bean添加到Cookie保存,后续用于过滤器实现自动登录功能
public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String username = request.getParameter("username"); String password = request.getParameter("password"); String autologin = request.getParameter("autologin");//on System.out.println(username+":"+password+":"+autologin); //校验用户名密码 UserBean user = new UserBean(); user.setUsername(username); user.setPassword(password); UserDao dao = new UserDaoImpl(); UserBean userBean = dao.Login(user); if(userBean!=null){ //页面提交上来的时候是否选择了自动登录 if("on".equals(autologin)){ Cookie cookie = new Cookie("auto_login", username+"#"+password ); cookie.setMaxAge(60*60*24*7);//7天有效期 cookie.setPath(request.getContextPath());//应用名字 response.addCookie(cookie); } //成功了,进入首页 request.getSession().setAttribute("userBean", userBean); response.sendRedirect("index.jsp"); }else{ //登录失败 request.getRequestDispatcher("login.jsp").forward(request, response); } } catch (SQLException e) { e.printStackTrace(); } }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
二、过滤器实现自动登录功能:
思路:
- 先判断本次请求中session是否有效,如果有效,则放行
- 如果session失效,则拿到cookie判断是否第一次登录
- cookie是空,第一次登录,放行,让用户先登录,登录时Servlet会添加Cookie保存此次登录的信息
- 如果cookie不为空,不是第一次登录,那么拿到cookie中的值,封装成Bean对象,保存到session中,方便下次未过期之前还能用
- 如果出现异常,也放行,防止用户页面空白
public class AutoLoginFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { HttpServletRequest request = (HttpServletRequest) req; //先判断session中是否还有userBean,如果有,当前会话还是有效的 UserBean userBean = (UserBean) request.getSession().getAttribute("userBean"); if(userBean!=null){ //如果session有效,放行,此时页面有session信息,登录成功显示欢迎您,${userBean.username } chain.doFilter(request, response); }else{ //此时session失效,比如说关闭浏览器,第二次打开,此时看Cookie //1 取出Cookie, Cookie[] cookies = request.getCookies(); //2 找出需要的cookie Cookie cookie = CookieUtil.findCookie(cookies, "auto_login"); if(cookie==null){ //表明第一次登录,放行 chain.doFilter(request, response); }else{ //表明不是第一次,取出Cookie中的值,完成登录 String value = cookie.getValue(); String username = value.split("#")[0]; String password = value.split("#")[1]; System.out.println(username+":"+password); UserBean user = new UserBean(); user.setUsername(username); user.setPassword(password); UserDao dao = new UserDaoImpl(); userBean = dao.Login(user); //使用Session存一下这个值,方便下一次未过期前还可以用 request.getSession().setAttribute("userBean", userBean); chain.doFilter(request, response); } } } catch (Exception e) { e.printStackTrace(); //出现异常,也放行 chain.doFilter(req, response); } } public void init(FilterConfig fConfig) throws ServletException { System.out.println("Filter初始化了"); } }
三、登录成功页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 这是首页, <c:if test="${not empty userBean }"> 欢迎您,${userBean.username } </c:if> <c:if test="${ empty userBean }"> 您好,请登录! </c:if> </body> </html>
一、