天天看点

java-web-Filter-登录验证之筛选器使用实例

java-web-Filter-登录验证之筛选器使用实例

一、简介:

Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

二、容易混淆的几个概念:

拦截器:是在面向切面编程(AOP)的就是在你的service或者一个方法;

过滤器:是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者其它web容器;

监听器:Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。

三、使用过滤器,对指定的 url 进行拦截

目标:在做登录验证时,往往会对“登录页”和“一些资源类的地址”不进行登录验证直接放行,这就需要使用筛选器进行地址验证,从而达到预期效果。

四、代码部分

1.1 注册筛选器,配置初始化参数(enable:是否启用;exclude_url:不进行验证的 url;)

<!-- 登录验证 filter -->
     <filter>  
        <filter-name>AuthFilter</filter-name>  
        <filter-class>com.demo.web.filter.AuthFilter</filter-class>
        <init-param>
            <!-- 是否启用登录验证 -->
            <param-name>enable</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <!-- 不验证的url(正则表达式)-->
            <param-name>exclude_url</param-name>
            <param-value>(login.jsp)|(/login/.+)|(/content/.+)</param-value>            
        </init-param>  
    </filter>
    <filter-mapping>
        <filter-name>AuthFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>      

1.2 AuthFilter.java 筛选器

package com.demo.web.filter;


import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


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 org.aspectj.weaver.ast.Var;


import com.demo.web.utilis.Global;
import com.sun.tools.javac.resources.javac;


import me.grass.coder.Debug;
import me.grass.extend.StringExtend;


/** 
* 权限筛选器
* @author xxj 
*/
public class AuthFilter implements Filter{
  Pattern _patten;  
  boolean _enbale=true;
  @Override
  public void init(FilterConfig arg0) throws ServletException {
    String enable = arg0.getInitParameter("enable");
    String regex = arg0.getInitParameter("exclude_url");
    Debug.printForamt("AuthFilter init-param: enable={0};exclude_url={1}",enable,regex);
    
    _enbale = StringExtend.getBoolean(enable);    
    // 初始化正则验证器
    if(_patten==null){
      //忽略大小写
      _patten = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
      
      Debug.printForamt("权限筛选器初始化;AuthFilter.Enable={1};正则 ={0};", regex,_enbale);
    }
  }


  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter)
      throws IOException, ServletException {
    if(!_enbale){
      Debug.printForamt("AuthFilter.Enable = {0};", _enbale);
      filter.doFilter(request, response);
      return;
    }
    
    HttpServletRequest req =  (HttpServletRequest)request;
    String url = req.getRequestURI(); 
    //1.web.xml 中配置的,不验证的url
    Matcher matcher = _patten.matcher(url);
    if(matcher.find()){
      Debug.printForamt("[不验证] {0}", url);
      filter.doFilter(request, response);
      return;
    }
    //2.登录验证(未登录跳转到登录页)
    if(对 session 的判断){
      Debug.printForamt("[未登录] {0}", url);
      HttpServletResponse resp = (HttpServletResponse)response;
      resp.sendRedirect(req.getContextPath()+"/login.jsp?unlogin");
      filter.doFilter(request, response);
      return;
    }
    //3.验证访问权限
    Debug.printForamt("[已授权] {0}", url);
    filter.doFilter(request, response);
  }


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