博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

在javaweb开发中,项目中都会包含一些过滤器(Filter),主要用于web服务器对资源的管理控制,如静态资源文件、jsp页面访问等。我们可以使用过滤器实现一些特殊的功能,如常见的过滤敏感词汇(替换为**)、url访问权限、登录验证,本文以登录验证为例,后面会为小伙伴们贴上代码。

开发Filter主要分为两个步骤

  1. 在web.xml中配置过滤器。

     <!-- 登录验证过滤器 -->
    <filter>
    <filter-name>loginFilter</filter-name><!--定义过滤器名称-->
    <filter-class>com.lzq.myproject.filter.LoginFilter</filter-class><!--指定过滤器:web可通过反射进行创建并初始化-->
    <init-param><!--指定初始化参数:可以存在多个-->
    <param-name>param1</param-name><!--定义初始化参数名称-->
    <param-value>我是初始化参数</param-value><!--定义初始化参数值-->
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>loginFilter</filter-name>
    <url-pattern>/*</url-pattern><!--过滤所有url-->
    </filter-mapping>
  2. 通过实现Filter接口创建过滤器。
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException; public class LoginFilter implements Filter {
    private FilterConfig filterConfig; @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    // 初始化
    this.filterConfig = filterConfig;
    } @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    HttpSession session = request.getSession();
    // 获取初始化参数 param1 的值
    String param1 = this.filterConfig.getInitParameter("param1");
    // 打印初始化参数值
    System.out.println(param1); String path = request.getRequestURI();
    if(path.indexOf("/index/indexAction.do") > -1){// 登录页面不过滤
    filterChain.doFilter(request, response);// 递交给下一个过滤器
    }
    if(path.indexOf("/index/indexAction!login.do") > -1){// 登录页面登录请求不过滤
    filterChain.doFilter(request, response);// 递交给下一个过滤器
    }
    if(path.indexOf("/register.jsp")>-1){// 注册页面不过滤
    filterChain.doFilter(request, response);// 递交给下一个过滤器
    }
    Integer uid = (Integer)session.getAttribute("userid");
    if(uid != null){//已经登录
    filterChain.doFilter(request, response);//放行,递交给下一个过滤器
    }else if(path.indexOf("myproject") > -1){
    // 未登录,进入登录页面
    response.sendRedirect("index/login.jsp");
    }
    } @Override
    public void destroy() {
    // web服务器停止时,自动调用该方法进行销毁
    }
    }

  过滤器(Filter)会在请求到达Servlet之前,拦截用户的请求,当用户请求资源满足我们自定义条件后,进行放行。

  过滤器生命周期:

  1、Filter的创建和销毁由WEB服务器负责。在WEB服务器启动时,通过web.xml读取,创建Filter实例对象,并调用其实现Filter接口方法init(FilterConfig filterConfig)进行初始化,如果在web.xml中的<filter></filter>下存在

      <filter-param>

        <param-name>参数名</param-name>

        <param-value>参数值</param-value>

      </filter-param>

  标签,将把过滤器指定的初始化参数传入init方法的FilterConfig对象中。Filter对象只会创建一次,从而init方法也只会执行一次

  FilterConfig接口:

String getFilterName();//得到filter的名称。
String getInitParameter(String name);//返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames();//返回过滤器的所有初始化参数的名字的枚举集合。
ServletContext getServletContext();//返回Servlet上下文对象的引用。

  2、当用户请求访问与过滤器关联的url时,将执行doFilter(ServletRequest request,ServletResponse response, FilterChain chain)方法。该方法的形参FilterChain将请求交给下一个过滤器。

  3、当WEB服务器停止时,过滤器将自动被销毁,调用过滤器对应的destroy方法。方法destroy也只会执行一次

 

Filter链:在web项目中,我们将web.xml中配置的多个过滤器组合称为一个Filter链,过滤器的调用顺序为web.xml中配置注册的顺序,通过doFilter方法的FilterChain对象可移交到下一个过滤器。

java-过滤器(Filter)的更多相关文章

  1. java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例

    java 过滤器Filter: package com.sun.test.aircraft.filter;import javax.servlet.*;import java.io.IOExcepti ...

  2. java过滤器Filter笔记

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静 ...

  3. java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序

    过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码 ...

  4. XSS过滤JAVA过滤器filter 防止常见SQL注入

    Java项目中XSS过滤器的使用方法. 简单介绍: XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩 ...

  5. java过滤器filter使用

    一:filter:过滤器,拦截servlet的请求和响应. 1. package jd.com.filter; import javax.servlet.*; import java.io.IOExc ...

  6. 防止常见XSS 过滤 SQL注入 JAVA过滤器filter

    XSS : 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往W ...

  7. java 过滤器filter使用案例

    主要需要 过滤器类  和配置文件 1.过滤器类 SessionFilter package com.service; import javax.servlet.*; import javax.serv ...

  8. Java过滤器—Filter用法简介

    一.什么是Filter? Filter译为过滤器. 由于年,Sun公司在Servlet2.3规范中添加了Filter功能,并在Servlet2.4中对Filter进行了细节上的补充. 二.运行原理: ...

  9. Java 过滤器Filter,Java Filter 不拦截某些请求 Java 过滤器支持Ajax请求

    ================================ ©Copyright 蕃薯耀 2020-01-10 https://www.cnblogs.com/fanshuyao/ 一.Java ...

  10. Java过滤器Filter使用详解

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6374212.html 在我的项目中有具体应用:https://github.com/ygj0930/Coupl ...

随机推荐

  1. (译文)IOS block编程指南 3 概念总览

    Conceptual Overview(概览) Block objects provide a way for you to create an ad hoc function body as an ...

  2. 递推(三):POJ中的三道递推例题POJ 1664、POJ 2247和POJ 1338

    [例9]放苹果(POJ 1664) Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. In ...

  3. redis.conf介绍

    默认配置文件: # Redis configuration file example. # # Note that in order to read the configuration file, R ...

  4. Failed to load class “org.slf4j.impl.StaticLoggerBinder”

    背景: 在配置使用Hibernate的时候遇到了这个问题, 然后就很头疼. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerB ...

  5. [模板] 动态ST表

    ST表本身是不可修改的. 如果考虑增加一个数,可以把ST表反过来写,即f[i][j]表示i往前1<<j个数,一个数最多影响logn个数,常数非常小. #include<iostrea ...

  6. centeros 6 远程升级ssl ssh 的shell脚本

    变量说明 SSL_N=openssl-1.0.2p #ssl 版本SSH_N=openssh-7.9p1 #ssh 版本ZLIB_N=zlib-1.2.11 # zlib 版本 脚本分为两个,因为升级 ...

  7. Mysql 查询多个字段去重复

    今天需要统计信息,但是有过个重复的数据,需要去除,找了如下方法: SELECT *, COUNT(DISTINCT phone ) FROM apply_info GROUP BY phone

  8. 几个非常实用的JQuery代码片段

    jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多).jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用). ...

  9. github 获取 token

    登录github 地址:https://github.com 点击settings 在点击Developer settings 继续 继续 描述栏随意写  复选框是token的权限 都选上吧 点击红框 ...

  10. 「LibreOJ β Round #3」绯色 IOI(抵达)

    [题解] 我们可以发现叶子节点的关联点一定是它的父亲节点,那么我们dfs一遍就可以求出所有节点的关联点,或者判断出无解. 对于每个点i,它的关联点u的危险度肯定比它连接的其他点vi的危险度小,我们从u ...