过滤器和注解

本文详细介绍了Java中的过滤器,包括过滤器的作用、开发方法、执行顺序及FilterConfig、FilterChain接口的使用。同时,文章还探讨了过滤器在访问控制中的应用,通过实例展示了如何创建登录过滤器。最后,讲解了Servlet3.0的新特性,特别是注解的使用,如@WebServlet、@WebFilter等。
摘要由CSDN通过智能技术生成

过滤器

1:过滤器的作用

把通用的、相同的处理代码用过滤器实现,可以共享,然后在web.xml中将过滤器配置给相关的资源使用即可

2:过滤器的开发方法

  1. 写一个类实现Filter接口
  2. 重写Filter接口的三个方法

  1. IDE开发工具开发过滤器的步骤:
  2. 在doFilter()方法写逻辑: System.out.println("MyFilter.doFilter()...");
  3. 创建servlet,运行servlet测试.
    1. 放行  执行chain.doFilter(request,response)
    2. 不放行 不执行chain.doFilter(request,response)
package com.tjetc.filter;

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;

public class HelloFilter implements Filter {
    public HelloFilter() {
        System.out.println("HelloFilter的构造方法");
    }

    /**
     * 初始化, 调用一次, Tomcat启动时会调用Filter的init ?
     *
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("HelloFilter的init方法被调用");
        String filterName = filterConfig.getFilterName();
        System.out.println("filterName=" + filterName);
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()) {//initParameterNames.hasMoreElements())遍历过程中判断是否还有元素遍历
            //获取参数名称
            String parameterName = initParameterNames.nextElement();
            //获取参数对应的value值
            String parameterValue = filterConfig.getInitParameter(parameterName);
            System.out.println(parameterName + "=" + parameterValue);
        }
        ServletContext servletContext = filterConfig.getServletContext();
        //获取上下文对象
        System.out.println("servletContext=" + servletContext);
    }

    /**
     * 每次Filter拦截到的请求, 都会调用doFilter方法, 可调用多次
     *
     * @param servletRequest  请求对象
     * @param servletResponse 响应对象
     * @param filterChain     过滤器链对象
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("HelloFilter的doFilter方法被调用");
        //例如:验证是否的登录过,没有登录,返回到登录页面或者返间json, 需要的登录
        //filterChain  过滤器链, 不处理过滤器链, 那就认为链条断掉, 后续的filter和servlet都不会访问
        //filterChain.doFilter(servletRequest,servletResponse);
        filterChain.doFilter(servletRequest, servletResponse);//放行,执行后续的filter和servlet
    }

    /**
     * 销毁Filter时调用, 调用一次, 使用场景:释放资源
     */
    @Override
    public void destroy() {
        System.out.println("HelloFilter的destroy方法被调用");
    }
}

 web.xml配置HelloFilter

    <filter>
        <filter-name>HelloFilter</filter-name>
        <filter-class>com.tjetc.filter.HelloFilter</filter-class>
        <init-param>
            <param-name>age</param-name>
            <param-value>19</param-value>
        </init-param>
        <init-param>
            <param-name>email</param-name>
            <param-value>ww@163.com</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>HelloFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

 3、过滤器的各个方法执行顺序

  1. 构造方法
  2. init(filterConfig)初始化方法
  3. doFilter()方法
  4. destroy()方法
package com.tjetc.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // resp.setContentType("text/html;charset=utf-8");
        // resp.getWriter().write("<h1>HelloServlet欢迎您!</h1>");

        //请求转发到my.jsp页面
        req.getRequestDispatcher("/my.jsp").forward(req, resp);
    }
}

web.xml配置HelloServlet

    <servlet>
        <servlet-name>HelloServlet<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值