过滤器Filter作用

过滤器可以再请求和响应之前做一部分预处理,有效的过滤掉不需要的内容,而且过滤器可以被复用,节省了大量的复用代码,提高了java的代码执行效率

过滤器Filter作用场景

  • 防止未登录就进入界面
  • 控制应用编码
  • 过滤敏感词汇等场景

过滤器Filter生命周期

java 过滤器 设置不过滤器 java过滤器使用场景_Filter

过滤器Filter使用框架

HttpServletRequest req=(HttpServletRequest) request;//获取request对象
HttpServletResponse rpon=(HttpServletResponse) response;//获取response对象

过滤操作代码..

//放行
//如果有下一个过滤器则跳到下一个过滤器
//如果没有下一个过滤器则跳到目标页面
filter.doFilter(request, response);

过滤器Filter场景一:控制应用编码

EnCodingFilter.java

package linjie.dongni.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* @author LinJie E-mail:xulinjie0105@gmail.com
* @version 创建时间:2018年5月11日 下午10:09:14
* 过滤器控制编码
*/
public class EnCodingFilter implements Filter {

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter)
            throws IOException, ServletException {
        HttpServletRequest request1 = (HttpServletRequest)request;
        HttpServletResponse response1 = (HttpServletResponse)response;

        //预处理
        request1.setCharacterEncoding("UTF-8");
        response1.setCharacterEncoding("UTF-8");

        //
        filter.doFilter(request, response);
    }

    public void init(FilterConfig arg0) throws ServletException {

    }

}

web.xml配置

<!-- 过滤器配置 -->
  <filter>
    <filter-name>enCodingFilter</filter-name>
    <filter-class>linjie.dongni.filter.EnCodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>enCodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

过滤器Filter场景二:防止未登录就进入界面

1、场景分析

当没有使用过滤器时,可直接在没有进行管理员登录情况下进入后台首页

2、解决方案

使用过滤器解决没有登录直接访问后台首页问题

1、新建过滤器AdminFilter.java
package linjie.dongni.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* @author LinJie E-mail:xulinjie0105@gmail.com
* @version 创建时间:2018年5月12日 下午8:59:05
* Admin登录过滤器
*/
public class AdminFilter implements Filter{

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter)
            throws IOException, ServletException {
        //将request、response的类型强转为Http
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse rpon = (HttpServletResponse)response;
        //如果account返回为空,则非法进入,并跳转到登录页面
        if(req.getSession().getAttribute("account") == null) {
            request.setAttribute("error", "非法进入");
            request.getRequestDispatcher("/alogin.jsp").forward(request, response);;
        }else { 
            //放行
            //如果有下一个过滤器则跳到下一个过滤器
            //如果没有下一个过滤器则跳到目标页面
            filter.doFilter(request, response);
        }
    }

    public void init(FilterConfig arg0) throws ServletException {

    }

}

注意:笔者代码中的account是一个POJO,读者可忽略这个意思,懂Filter的使用思路即可

2、web.xml配置
<!-- 后台登录过滤 -->
   <filter>
    <filter-name>adminFilter</filter-name>
    <filter-class>linjie.dongni.filter.AdminFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>adminFilter</filter-name>
    <url-pattern>/admin/*</url-pattern><!-- 在整个admin/目录下的文件都过滤验证 -->
  </filter-mapping>
再次直接访问后台首页就已经不行了

关于web.xml中的< url-pattern>作用对象

  • 1:作用与所有web资源:< url—pattern>/*< /url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。
  • 2:作用于某一文件夹下所有文件:< url—pattern>/dir/*< /url-pattern>
  • 3:作用于某一种类型的文件:< url—pattern>.扩展名< /url-pattern>。比如< url—pattern>.jsp< /url-pattern>过滤所有对jsp文件的访问请求。
  • 4:作用于某一文件夹下某一类型文件:< url—pattern>/dir/*.扩展名< /url-pattern>

如果一个过滤器需要过滤多种文件,则可以配置多个< filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则

<filter>
      <filter-name>xxxFilter</filter-name>
      <filter-class>linjie.dongni.XxxFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>xxxFilter</filter-name>
      <url-pattern>file1.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
      <filter-name>xxxFilter</filter-name>
      <url-pattern>file2.jsp</url-pattern>
  </filter-mapping>