过滤器

2019-06-11  本文已影响0人  某某宝

1、介绍
1)、Filter
Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。 它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。
2)、使用 Filter 的完整流程
Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。
3)、 Filter 链
在一个 web 应 用中,可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链。
若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的 顺序执行。
4)、原理

clipboard.png
在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。 根据需要检查 HttpServletRequest,也可以修改 HttpServletRequest 头和数据。
在 HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据 需要检查 HttpServletResponse,也可以修改 HttpServletResponse 头和数据。

2、实现
我们可以通过实现一个叫做 javax.servlet.Fileter 的接口来实现一个过滤器, 其中定义了 三个方法,init(), doFilter(), destroy()分别在相应的时机执行。后期观 察生命周期。 Filter 的实现只需要两步:
Step1: 编写 java 类实现 Filter 接口,并实现其 doFilter 方法。
Step2: 在 web.xml 文件中对编写的 filter 类进行注册,并设置它所能拦截 的资源。

public class Filter01 implements Filter {
    /**
     * 初始化方法,只执行一次
     * 服务器启动即初始化
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub      
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("拦截处理");
        //放行
        chain.doFilter(request, response);
        System.out.println("拦截结束");
    }
    /**
     * 销毁方法
     */
    @Override
    public void destroy() {
        // TODO Auto-generated method stub      
    }   
}
  <filter>
    <filter-name>filter01</filter-name>
    <filter-class>com.czb.filter.Filter01</filter-class>  
  </filter>
  <filter-mapping>
    <filter-name>filter01</filter-name>
    <url-pattern>/download</url-pattern><!-- 需要拦截的路径,也可以同时配置多个,通常设置为 /*  -->
  </filter-mapping>

3、非法访问拦截
静态资源 css、js、images等 (statics目录下的资源,都放行)
放行指定页面 login登录 (不需要登录即可访问的页面,都要放行)
放行执行操作 登录操作 (不需要登录即可执行的操作,都放行,登录、注册等)
登录状态 放行 (登录成功后将用户信息存到session域对象中,如果域对象中的值不为空,则为登录状态;否则,为非登录状态)

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        // 得到当前的路径
        String url = request.getRequestURI();
        System.out.println(url);

        // 1、静态资源 css、js、images等 (statics目录下的资源,都放行)
        if (url.contains("/statics")) {
            // 放行
            chain.doFilter(request, response);
            return;
        }
        //2登录页面
        if (url.contains("LoginAjax.html")) {
            chain.doFilter(request, response);
            return;
        }
        // 3、放行执行操作 登录操作 (不需要登录即可执行的操作,都放行,登录、注册等)
        // 得到用户行为
        String actionName = request.getParameter("actionName");
        if (url.contains("/servlet01")) { // 确认模块
            // 确认用户行为
            // if ("form".equals(actionName)) {
            // 放行
            chain.doFilter(request, response);
            return;
            // }
        }
        // 4、登录状态 放行 (登录成功后将用户信息存到session域对象中,如果域对象中的值不为空,则为登录状态;否则,为非登录状态)
        // 获取session域对象的值
        User user = (User) request.getSession().getAttribute("user");
        if (user != null) {
            // 放行
            chain.doFilter(request, response);
            return;
        }
        
        response.sendRedirect("LoginAjax.html");
        return;
    }
上一篇下一篇

猜你喜欢

热点阅读