初识Servlet过滤器

过滤器的处理方式
Servlet过滤器主要用于过滤客户端的请求,可以改变请求中的内容来满足实际开发的需要,然后将过滤后的请求转交给下一资源。
在Web容器中部署了过滤器后,不仅客户端发送的请求会经过过滤器的处理,而且请求在发送到目标资源处理以后其回应的信息也同样要经过过滤器。
如果一个过滤器不能满足业务需要,那么可以部署多个过滤器进行多次处理,这样就组成了一个过滤器链,WEB容器按过滤器的先后顺序处理请求。


过滤器的核心对象
过滤器对象放置在javax.servlet包中,其名为Filter,它是一个接口。出这个接口外,与过滤器相关的对象还有FilterConfig与FilterChain对象,这两个对象也是接口对象,位于javax.servlet包中,分别为过滤器的配置对象与过滤器的传递工具。定义过滤器只需要直接或间接的实现Filter接口。

  • Filter接口的主要方法
public class myFilter implements Filter {
    //过滤器初始化方法,此方法在初始化过滤器时直接使用
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    //对请求进行过滤处理
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }
    //销毁方法以释放资源
    @Override
    public void destroy() {
    }
}
  • FilterConfig接口的主要方法
class myFilterConfig implements FilterConfig{
    //用于获取过滤器名称
    @Override
    public String getFilterName() {
        return null;
    }
    //获取过滤器上下文
    @Override
    public ServletContext getServletContext() {
        return null;
    }
    //获取过滤器的初始化参数值
    @Override
    public String getInitParameter(String s) {
        return null;
    }
    //获取过滤器的所有初始化参数
    @Override
    public Enumeration<String> getInitParameterNames() {
        return null;
    }
}
  • FilterChain接口的方法
class myFilterChain implements FilterChain{

    //此方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器是过滤链中的最后一个过滤器,那么请求将传送给目标资源
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) throws IOException, ServletException {
    }
}

配置过滤器

/**
 * filterName:用于指定Servlet过滤器名。
 * urlPatterns:用于指定哪些URL使用该过滤。/*表示所有页面。
 * initParams:用于指定初始化参数。
 */
@WebFilter(filterName = "DemoFilter",urlPatterns = {"/*"},initParams = {@WebInitParam(name = "mood",value = "awake")})
public class myFilter implements Filter {
}

//例如采用注解的方式配置一个作用于index.jsp文件的过滤器myFilter
@WebFilter(filterName = "myFilter",urlPatterns = {"/index.jsp"})
public class myFilter implements Filter {
}

创建一个过滤器,实现网站访问统计量的功能,并在配置过滤器时,将网站访问量的初始值设置为100.

创建并配置过滤器:

@WebFilter(filterName = "myFilter",urlPatterns = {"/index.jsp"},initParams = {@WebInitParam(name = "visitCount",value = "100")})
public class myFilter implements Filter {
    private int visitCount;
    //过滤器初始化方法,此方法在初始化过滤器时直接使用
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String param=filterConfig.getInitParameter("visitCount");
        visitCount=Integer.valueOf(param);
    }
    //对请求进行过滤处理
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        visitCount++;
        //将ServletRequest转化为HttpServletRequest
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        //获取SevrletContext
        ServletContext context=servletRequest.getServletContext();
        context.setAttribute("visitCount",visitCount);
        filterChain.doFilter(servletRequest,servletResponse);
    }
    //销毁方法以释放资源
    @Override
    public void destroy() {
    }
}

index.jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  您是第【<%=application.getAttribute("visitCount")%>】位访客。
  </body>
</html>

字符编码过滤器

@WebFilter(filterName = "myFilter",urlPatterns = {"/*"},initParams = {@WebInitParam(name = "encoding",value = "UTF-8")})
public class myFilter implements Filter {
    private String encoding=null;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        encoding=filterConfig.getInitParameter("encoding");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if(encoding!=null){
            servletRequest.setCharacterEncoding(encoding);
            servletResponse.setContentType("text/html;charset="+encoding);
        }
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
    }
}
本项目属于机器学习的简单部分,基于为了快速理解机器学习而搭建的人工智能速成项目,大家可以根据其中的项目时间进行相关的学习.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值