过滤器

过滤器
1、过滤器简介
过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息过滤。
2、过滤器的工作原理和生命周期

3、第一个过滤器案例
1)创建过滤器类,实现javax.servlet.Filter接口
2)重写Filter方法
init()方法
这是过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。
doFilter()方法
这个方法完成实际的过滤操作。这个地方是过滤器的核心方法。当用户请求访问与过滤器关联的URL时,Web容器将先调用过滤器的doFilter方法。FilterChain参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发、重定向将请求转发到其他资源。
destroy()方法
Web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源。(大多数情况用不到)

public class FirstFilter implements Filter {

@Override
public void destroy() {
    System.out.println("destroy---FirstFilter");
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    System.out.println("start----doFilter--FirstFilter");
    chain.doFilter(request, response);
    System.out.println("end------doFilter--FirstFilter");
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("init----FirstFilter");
}

}
3)配置web.xml文件

4、过滤器链
过滤器链是指针对一个请求有多个过滤器,服务器会按照web.xml中过滤器定义的先后顺序组装成一条链。

5、过滤器分类
Servlet2.5
 PEQUEST:用户直接访问页面时,Web容器将会调用过滤器;
 FORWARD:目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用;
 INCLUDE:目标资源是通过RequestDispatcher的include方法调用时,过滤器将被调用;
 ERROR:目标资源是通过声明式异常处理机制调用时,过滤器将被调用;
Servlet3.0
 ASYNC:支持异步处理;

6、过滤器应用
案例1:过滤器错误页面跳转
web.xml

404
/error.jsp


ErrorFilter
com.imooc.filter.ErrorFilter


ErrorFilter
/error.jsp
ERROR

ErrorFilter.java
public class ErrorFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
    System.out.println("检测到有错误信息");
    arg2.doFilter(arg0, arg1);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}

案例2:登录时编码过滤
web.xml

LoginFilter
com.imooc.filter.LoginFilter

noLoginPaths
login.jsp;fail.jsp;LoginServlet


charset
UTF-8



LoginFilter
/*

LoginFilter.java
public class LoginFilter implements Filter {

private FilterConfig config;

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) arg0;
    HttpServletResponse response = (HttpServletResponse) arg1;
    HttpSession session = request.getSession();

String noLoginPaths = config.getInitParameter(“noLoginPaths”);
String charset = config.getInitParameter(“charset”);
if(charset==null){
charset = “UTF-8”;
}
request.setCharacterEncoding(charset);

    if(noLoginPaths!=null){
        String[] strArray = noLoginPaths.split(";");
        for (int i = 0; i < strArray.length; i++) {

            if(strArray[i]==null || "".equals(strArray[i]))continue;

            if(request.getRequestURI().indexOf(strArray[i])!=-1 ){
                arg2.doFilter(arg0, arg1);
                return;
            }
        }
    }

    if(session.getAttribute("username")!=null){
        arg2.doFilter(arg0, arg1);
    }else{
        response.sendRedirect("login.jsp");
    }
}

@Override
public void init(FilterConfig arg0) throws ServletException {
    config = arg0;
}

}
LoginServlet.java
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(request.getContextPath()+”/sucess.jsp”);
}else{
//校验失败
response.sendRedirect(request.getContextPath()+”/fail.jsp”);
}
}
案例3:Servlet3.0异步操作
web.xml

AsynServlet
com.imooc.servlet.AsynServlet
true


AsynServlet
/servlet/AsynServlet

AsynFilter.java
@WebFilter(filterName=”AsynFilter”,asyncSupported=true,
value={“/servlet/AsynServlet”},
dispatcherTypes={DispatcherType.REQUEST,DispatcherType.ASYNC})
public class AsynFilter implements Filter {

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
    System.out.println("start.....AsynFilter");
    arg2.doFilter(arg0, arg1);
    System.out.println("end.....AsynFilter");
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}
AsynServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("Servlet执行开始时间:"+new Date());
    AsyncContext context =  request.startAsync();
    new Thread(new Executor(context)).start();
    System.out.println("Servlet执行结束时间:"+new Date());
}

public class Executor implements Runnable{
    private AsyncContext context;
    public Executor(AsyncContext context ) {
        this.context = context;
    }

    @Override
    public void run() {
        //执行相关复杂业务
        try {
            Thread.sleep(1000*10);

// context.getRequest();
// context.getResponse();
System.out.println(“业务执行完成时间:”+new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值