JAVA-Filter过滤器

180 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

如果知道系统中的某些页面时,我们跳过登录就能访问该页面,这时就用到了过滤器

过滤器

过滤器:即Filter,是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件前,通过一些列的过滤器对请求进行修改、判断等,把不符合规则的请求拦截或修改。也可以对响应进行过滤、拦截或修改响应

常见的过滤器

  • 字符集过滤器:给全站添加统一的UTF-8字符集
  • URL过滤器:实现不登录不能使用
  • 缓存过滤器:禁止浏览器缓存所有动态页面

作用

一般用于登录权限的验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用

注意:

过滤器并不是越多越好,也不是所有的模块都要用上,结合实际的业务逻辑需求巧妙的使用

编码集过滤器

/**
 * @author : lupingzhao
 * @desc : 编码集过滤器:目的为项目中每一个URL设置统一的编码集
 * @date : 21:54 2021/6/19
 */
@WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = "/manage/*")
public class CharacterEncodingFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
        System.out.println("初始化(编码集过滤器)");
    }
    
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("开始过滤(编码集过滤器)");
        //获取request、response对象
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        
        chain.doFilter(request, response);
    }
    
    public void destroy() {
        System.out.println("开始销毁(编码集过滤器)");
        
    }
}

Session过滤器(过滤未登录的用户)

@WebFilter(filterName = "SessionFilter", urlPatterns = "/manage/*")
public class SessionFilter implements javax.servlet.Filter {
    public void init(FilterConfig config) throws ServletException {
        System.out.println("SessionFilter初始化");
    }
    
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("SessionFilter开始过滤");
        //1.获取request、response对象
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        
        //2.获取特权页面
        String path = request.getServletPath(); // 获取访问的Servlet路径
        System.out.println("path:" + path);
        if (("/manage/login.jsp".equals(path) || ("/manage/manager.do".equals(path)))) {
            chain.doFilter(request, response); // 放行
            return;
        }
        
        //3.过滤session(判断session域对象中是否有值)
        HttpSession session = request.getSession();
        if (session.getAttribute("user") == null) {
            System.out.println("没有登录");
            request.setAttribute("error", "您没有登录"); // 将错误信息存储到request域对象中
            request.getRequestDispatcher("/manage/error.jsp").forward(request, response);
            return;
        } else {
            System.out.println("登录成功了。。。。");
            chain.doFilter(request, response);
            return;
        }
    } 
    public void destroy() {
        System.out.println("SessionFilter销毁");
    }
}