过滤器: 定义在服务器端的一段程序, 可以截获客户端发来的请求, 并根据一定规则进行过滤和拦截
过滤器的生命周期:
服务器启动 先通过web.xml加载过滤器进行实例化(这个过程是调用过滤器中init()方法, 同样也是只执行一次) 客户端发送请求: 执行过滤器中的doFilter()方法, 这个方法会执行N次, 每次有请求发送过来, 都会执行这个方法进行过滤 销毁过程 同servlet, 关闭或者停止服务器的时候会执行destory()方法过滤器链:
不同的请求互不影响 过滤器链主要是针对多个过滤器过滤同一个url请求 过滤器的先后顺序是按照在web.xml的配置顺序来的 运行顺序: 请求--->过滤器1过滤--->过滤器2过滤--->后台处理层--->过滤器2过滤--->过滤器1过滤--->客户端接收3.0新特性的过滤器:
使用注解的方式: @WebFilter(filterName="", value={"",""}...等其他配置)
login.jsp
用户名: 密码:
register.jsp
用户名: 密码: 姓名:
LoginServler.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username); System.out.println(password); if("admin".equals(username) && "123456".equals(password)){ request.getSession().setAttribute("currentUser","admin"); response.sendRedirect("index.jsp"); }else{ response.sendRedirect("fail.jsp"); } }
RegisterServler.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username); System.out.println(password); if("admin".equals(username) && "123456".equals(password)){ request.getSession().setAttribute("currentUser","admin"); response.sendRedirect("index.jsp"); }else{ response.sendRedirect("fail.jsp"); } }
SessionFilterTest.java
import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SessionFilterTest implements Filter { private String pages; private HttpServletRequest request; @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; //获取当前的请求 String uri = request.getRequestURI(); System.out.println("当前发送的请求"+uri); //获取不需要判断session的请求 String[] _pages = pages.split(";"); //判断当前请求是否在不需要判断的请求里 if(checkString(_pages,uri)){ //放行 chain.doFilter(req,resp); }else{ //先判断session在放行 Object obj = request.getSession().getAttribute("currentUser"); if(obj==null){ response.sendRedirect("login.jsp"); }else{ chain.doFilter(req,resp); } } } public static boolean checkString(String[] pages,String uri){ for(String s:pages){ if(uri.contains(s)){ return true; } } return false; } @Override public void init(FilterConfig config) throws ServletException { String str = config.getInitParameter("page"); this.setPages(str); System.out.println(str); } public String getPages(){ return pages; } public void setPages(String pages){ this.pages = pages; }}
TestFilter.java
import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class TestFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); arg2.doFilter(request, response); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub }}