天天看点

JAVA Web 中的过滤器Filter

  Filter意为滤镜或者过滤器,它用于Servlet之外对request或response进行修改。给大家说个通俗易懂的列子:假如你在没有没有登录qq空间的时候,在url地址栏直接输入你的空间地址。它是不会跳转到你的空间的,而是跳转到登录界面。实现这一功能的就是我们今天索要讲的Filter过滤器::

1:Filter接口

一个Filter必须实现javax.servlet.Filter接口,Filter接口有3个方法:

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;

public class test implements Filter {

public void init(FilterConfig arg0) throws ServletException {

//web程序启动时调用此方法,用于初始化该Filter

}

public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain arg2) throws IOException, ServletException {

}

public void destroy() {

//用于web程序关闭时调用此方法,用于销毁一些资源

}

}

这3个方法中init()与destroy()方法只会被调用一次,分别是在web程序加载或者卸载的时候调用。而都Filter方法每次有客户请求都会被调用一次。Filter的所有工作都集中在doFilter()方法中。

2:Filter配置

Filter需要再web.xml中配置候才能生效,通常一个Filter需要配置<filter>与<filter-mapping>标签,配置如下:

<filter>

<filter-name>过滤器名</filter-name>

<filter-class>所在的包</filter-class>

<init-param>

<param-name></param-name>

<param-value>带有此名的放行,多个用逗号隔开</param-value>

</init-param>

<init-param>

<param-name></param-name>

<param-value>字符集</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name></filter-name>

<url-pattern>/*</url-pattern>//所有的都需要匹配此过滤器

</filter-mapping>

<dispatcher>配置到达Servlet的方式有4中取值:REQUEST,FORWARD,INCLUDE.ERROR。可以同时匹配多个<dispatcher>,默认的为:request。

request:表示仅当直接请求Servlet是才生效。

forward:表示仅当某Servlet通过forward到该Servlet时才生效。

include:jsp中可以通过<jsp:include />请求某Servlet。仅当这种情况下才生效。

error:jsp中可以通过<%@page errorPage=“error.jsp” %>指定错误处理页面,仅当这种情况下才生效。

<url-pattern>与<dispatcher>的关系是“且”的关系,只有全部满足这两者的条件时,Filter才会生效。

一个web可能会有多个Filter,多个Filter执行的先后顺序是<Filter-mapping>配置在前面的Filter先执行。他们可能会相互影响。

登录用户名例子:

package 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;

import javax.servlet.http.HttpSession;

public class loginFilter implements Filter {

private FilterConfig config;

public void destroy() {

}

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("noPaths");

String charset = config.getInitParameter("charset");

if (charset == null) {

charset = "UTF-8";

}

request.setCharacterEncoding(charset);

    if (noPaths != null) {

String[] str = noPaths.split(";");

for (int i = 0; i < str.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");

}

}

public void init(FilterConfig arg0) throws ServletException {

}

}

web.xml配置:

<filter>

<filter-name>loginFilter</filter-name>

<filter-class>filter.loginFilter</filter-class>

<init-param>

<param-name>noPaths</param-name>

<param-value>login.jsp;fail.jsp;loginServlet</param-value>

</init-param>

<init-param>

<param-name>charset</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>loginFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

以上是Filter和web.xml代码。

Â