代码改变世界

[Java]Web过滤器

2016-01-14 09:46  lilooo  阅读(345)  评论(0编辑  收藏  举报

一、设置web.xml

1.增加过滤器配置

  在web.xml文件中增加过滤器项,示例如下:

    <filter>
        <filter-name>AuthFilter</filter-name>
        <filter-class>com.etrans.bubiao.sys.AuthFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AuthFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

2.基本说明

  即增加filterfilter-mapping项,它们对应的filter-name作为匹配标识是一样的,filter-class对应我们要实现的过滤器的代码类,url-pattern标识要过滤的url

  前面示例中的配置会使得应用服务器把.jsp后缀的请求全部交给com.etrans.bubiao.sys.AuthFilter的实例化对象来处理(注意:每种过滤器只有一个实例)。 

3.扩展说明

  a.可以有多个url-pattern,对多种条件下的资源进行过滤。

  b.filter段内可以加入init-param段,其中可以增加一些过滤器的初始化参数。这些参数可以在过滤器代码的init方法中提取。

  示例:

 

    <!-- 防止无权限直接访问页面 -->
    <filter>
          <filter-name>AuthFilter</filter-name>
          <filter-class>com.etrans.bubiao.sys.AuthFilter</filter-class>
          <init-param>
              <param-name>exclude</param-name>
              <param-value>/ygclogin.html,/authImg</param-value>
        </init-param>
    </filter>
    <filter-mapping>
          <filter-name>AuthFilter</filter-name>
          <url-pattern>*.jsp</url-pattern>
          <url-pattern>*.htm</url-pattern>
          <url-pattern>*.html</url-pattern>
    </filter-mapping>

 

二、过滤器代码编写

 

1.生成java类

  类名就是前面配置文件中filter-class指定的名字,并且该类要实现javax.servlet.Filter接口。自动生成的代码如下:

 

package com.etrans.bubiao.sys;

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 AFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        // TODO Auto-generated method stub

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}
View Code

 

2.完成外围代码

  在init函数内增加相关代码,如读取初始化参数等。注意:声明的类变量无需标识为static,因为本类只有一个实例。

  在destroy函数内增加相关代码,如清理环境等。

3.完成业务代码

  在doFilter函数内增加代码,对浏览器申请的资源进行过滤。注意:如果本过滤器不需要拦截的内容,则应调用过滤器链继续处理,否则浏览器里面就成空白的了。

 

4.示例代码

package com.etrans.bubiao.sys;

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;

public class AuthFilter implements Filter {
    
    private String[] excludeList;

    @Override
    public void destroy() {
        
    }

    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) arg0;
        HttpServletResponse resp = (HttpServletResponse) arg1;
        String url = req.getRequestURI();
        String baseUrl = req.getContextPath() + "/";
        String user = (String) req.getSession().getAttribute("user");
        if (null == user) {
            boolean isExclude = url.equals(baseUrl);
            if (!isExclude) {
                for (String exclude: excludeList) {
                    if (url.endsWith(exclude)) {
                        isExclude = true;
                        break;
                    }
                }
            }
            
            if (!isExclude) {
                System.out.println("请重新登录!因为您对此页面没有权限:" + url);
                System.out.println("您将被重定向到:" + baseUrl);
                resp.sendRedirect(baseUrl + "ygclogin.html");   
                return;
            }
        }
        
        arg2.doFilter(arg0, arg1);
    }
    
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        String exclude = arg0.getInitParameter("exclude");
        excludeList = exclude.split(",");
    }

}
View Code