- Filter:过滤器
- filter是一个执行过滤任务的组件,它可以过滤客户端的请求和从服务端返回的响应;
- 每一个filter都可以在请求前和响应后增加额外的功能;
- 可以对字符集的统一设置
- 完成对用户的身份验证
- 统一的图片压缩
- 日志处理
- 使用Filter的好处;
- 避免了一些重复的代码,大大减少了代码量
- 实现了一些操作的统一管理
- 更有利于项目的开发与维护
- Filter接口:javax.servlet Interface Filter
- 提供的方法
- void destroy();//销毁Filter(由web容器决定)
- void doFilter(ServletRequest request,ServletResponse,FilterChain chain);//过滤的具体方法
- void inite(FilterConfig filterConfig);//初始化方法
- 开发步骤:
- 实现Filter接口
- 重写doFilter()方法
- 提供的方法
- 关于Filter的过滤规则配置的方法
- 使用Annotation注解@WebFilter()
@WebFilter({ "*.html", "*.jsp", "*.do" })
多个过滤的url,需要设置多个filter-mapping<filter> <filter-name>checkedFilter</filter-name> <filter-class>com.oracle.filter.LoginCheckedFilter</filter-class> </filter> <filter-mapping> <filter-name>checkedFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>checkedFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> <filter-mapping> <filter-name>checkedFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
- 使用Annotation注解@WebFilter()
- 通过Filter实现用户登录的验证及过滤操作
*在页面跳转时需要注意的地方:package com.oracle.filter; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet Filter implementation class LoginCheckedFileter */ @WebFilter({ "*.html", "*.jsp", "*.do" }) public class LoginCheckedFileter implements Filter { List<String> list=new ArrayList<>(); /** * Default constructor. */ public LoginCheckedFileter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //类型转换 HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; //对所有请求响应设置字符集 req.setCharacterEncoding("utf-8"); res.setCharacterEncoding("utf-8"); //获得请求地址 String uri=req.getRequestURI(); //获得请求路径 String path=req.getContextPath(); // System.out.println(path); // System.out.println(uri); // System.out.println("-------"+uri.replaceAll(path, "")); //获得登录的标记 HttpSession session=req.getSession(); //登录标记不存在,跳转到登录界面 if(session.getAttribute("emp")!=null){ //放行,满足登录条件 chain.doFilter(request, response); }else if(list.contains(uri.replaceAll(path, ""))){ //满足放行的uri chain.doFilter(request, response); }else{ //此方法会重定向到相对当此请求路径下的login.jsp,不满足放行条件,会进入无限循环 //res.sendRedirect("login.jsp"); //重定向到本工程根目录下的login.jsp,该方法在登录超时(session过期之后) //,在进行某些操作时,由于指定了页面的打开位置,会导致登录页面不是覆盖整个浏览器 //res.sendRedirect(path+"/login.jsp"); res.getWriter().println("<script>window.top.location.href='"+path+"/login.jsp'</script>"); } } /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { //添加放行的uri list.add("/login.jsp"); list.add("/empLogin.do"); } }
- 放行的uri使用的相对地址,便于工程以后的维护及修改(如修改工程名)
- 跳转时使用的是path(工程路径名)+uri(跳转页面),避免了相对路径下始终不满足放行条件,发生无限循环重定向
- FireFox提示
- Google Chrome提示
- 当登录超时再进行操作跳转到登录页,如果之前登陆过,默写特定网页指定了打开位置,会导致登录页不能覆盖整个浏览器
使用js强制将页面打开位置设置为整个窗口的上方res.getWriter().println("<script>window.top.location.href='"+path+"/login.jsp'</script>");