JavaWeb 过滤器简介

过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。

在请求到达Servlet/JSP之前,过滤器截获请求。

在响应送给客户端之前,过滤器截获响应。

多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射的顺序决定。

最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。

 我们需要实现一个Filter接口,导入import javax.servlet.*,并实现其中的抽象方法。

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

public class LoginFilter 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() {

    }
}

以上操作和Servlet很相似,也可以理解为Filter就是一个Servlet,只是Filter所对应的功能和位置不相同。

配置映射路径:

过滤器配置映射路径有两种方法,第一种方法就是在web.xml中配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>

      过滤器配置映射  
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.scores.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
<!--        拦截的路径  /*:拦截所有的请求-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

第二种方法就是利用注解的方式进行配置( 拦截的路径 /*:拦截所有的请求)

@WebFilter(urlPatterns = {"/*"})

配置完成之后接下来我们就可以给LoginFilter写上一些输出语句及逻辑判断

package com.scores.filter;

import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class LoginFilter implements Filter {

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

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        //获取当前uri
        String uri = request.getRequestURI();
        //通过这条输出语句可以清楚的看到被拦截的请求
        System.out.println("doFilter"+uri);
        //通过过滤器----允许通过
        filterChain.doFilter(servletRequest,servletResponse);
    }

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

在实行不同的要求时可以用不同的逻辑判断来完成,例如你想完成必须要有用户登录才能继续访问后续页面的要求,就可以在doFilter中加入逻辑判断,假如nowses就代表你的账号密码。

//逻辑判断
Object loginuser = request.getSession().getAttribute("nowses");
//如果他这个loginuser不为空
if(loginuser != null){
    //允许通过
     filterChain.doFilter(servletRequest,servletResponse);
    
}else{
    //跳转回登录页面
    HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.sendRedirect("/ScoresWeb/login.jsp");
}

总结:

过滤器:根据业务需求对请求进行拦截。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值