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
		
	}
}












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值