过滤器

一. 简介

  • 过滤器是一个服务器端的组件,可以截取用户端的请求与响应信息,并对这些信息过滤。
  • 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

二. 工作原理

这里写图片描述

三. 生命周期

这里写图片描述

1)在web容器启动时依据web.xml实例化 一次
2)初始化 init() 一次
3)过滤 doFilter() 多次
4)销毁 destroy() 一次 web容器关闭

四. 多个过滤器

这里写图片描述

Web应用允许多个过滤器来过滤页面请求——联想现实生活中的例子,比如:为了获得更加干净的水,可能需要多个过滤器来进行过滤,这个时候分为两种情况
1:多个过滤器过滤的URL不同,那么此时的多个过滤器是互不相干的,各过滤各的,互不干扰
2:多个多虑期过滤的URL相同,那么此时的多个过滤器就形成了一个过滤器链,此时就有个一个问题了Web容器现将对应的请求给谁过滤呢?处理规则也很简单,就是根据在Web.xml文件中配置的声明的顺序来决定哪个先过滤哪个再过滤

五. 过滤器的分类

这里写图片描述

六. 用户登录过滤

需求:登陆成功跳转到success.jsp页面,失败则跳转到failure.jsp页面。需要保证无法通过直接输入success.jsp页面的路径访问,自动跳转到登陆页面index.jsp。
分析:可通过过滤器进行过滤,事实上需要屏蔽的路径是success.jsp;但如果需要屏蔽的路径非常多,我们可以屏蔽所有路径,然后在过滤器里面判断是否为个例。为了方便以后修改要屏蔽的路径,可以将这些路径作为过滤器的初始化参数写在web.xml中,在过滤器里里面再获取

1.. servlet-处理用户请求

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request,response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");     
        if("admin".equals(username) && "admin".equals(password)){
            //校验通过
            HttpSession session = request.getSession();
            session.setAttribute("username", username);
            response.sendRedirect("../success.jsp");
        }else{
            //校验失败
            response.sendRedirect("../failure.jsp");
        }
    }

}

2.. 配置过滤器的web.xml参数

    <filter>     <!-- 指定一个过滤器 -->
        <filter-name>LoginFilter</filter-name>
        <filter-class>filter.LoginFilter</filter-class>
        <init-param>  <!--为过滤器指定初始化参数  -->
            <param-name>noFilterPaths</param-name>  
            <param-value>index.jsp;failure.jsp;LoginServlet</param-value>  
        </init-param>
    </filter>

    <filter-mapping>  <!-- 设置一个 Filter 所负责拦截的资源 -->
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>   <!-- 设置 filter 所拦截的请求路径(过滤器关联的URL样式) -->
        <dispatcher>REQUEST</dispatcher>   <!-- 指定过滤器所拦截的资源被 Servlet 容器调用的方式 -->
    </filter-mapping>

3..过滤器-拦截请求

package filter;

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;
import javax.servlet.http.HttpSession;

public class LoginFilter implements Filter{
    private FilterConfig config;  //定义全局的config变量
    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;  //强制类型转换
        HttpServletResponse res = (HttpServletResponse) response;

        String noFilterPaths = config.getInitParameter("noFilterPaths");  //获取web.xml中配置的初始化参数

        if(noFilterPaths!=null){
            String[] noFilter = noFilterPaths.split(";");
            for (String path : noFilter) {
                if(path==null || "".equals(path))
                    continue;
                if(req.getRequestURI().indexOf(path)!=-1 ){    //匹配到不需要过滤的路径
                    chain.doFilter(request, response);         //允许放行
                    return;
                }
            }
        }

        HttpSession session = req.getSession();
        if(session.getAttribute("username")!=null){
            chain.doFilter(request, response);   //允许放行
        }else{
            res.sendRedirect("index.jsp");
        }
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        config = filterConfig;   //获取到config对象
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值