filter拦截器的简单使用

原创 2016年05月30日 21:51:51

     在很多系统中都使用过拦截器,拦截器大多用在登陆和日志处理方面,那么现在就以登陆为例子,简单介绍下拦


截器。


一、功能:


    它使用户可以改变一个request和修改一个response.Filter 不是一个servlet,它不能产生一个response,它能


够在一个request到达servlet之前预处理request,也可以在response离开servlet时处理response.换种说法,


filter其实是一个“servletchaining“(servlet 链)


二、组成:


    配置文件

 

    三个方法:

1void init(Filter Config Config)用于完成filter的初始化


2woid destory用于filter销毁之前,完成某些资源的回收


3.void doFilter(ServletRequest request, ServletResponse response,FilterChain chaim);实现过滤功能,该


方法就是每个请求及响应增加的额外处理。)

 

filter链:


执行filter的顺序,一个项目中可以执行多个filter,并且每个filter有不同的执行顺序,这些具体顺序的执行在配


置文件中进行配置。

 

Web.xml中配置filter


<!-- 定义Filter --> 
<filter> 
    <!-- Filter 的名字 --> 
    <filter-name>security</filter-name> 
    <!-- Filter 的实现类 --> 
	<filter-class> test.filter.SecurityFilter</filter-class>
</filter> 
<!-- 定义Filter 拦截地址 --> 
<filter-mapping> 
    <!-- Filter 的名字 --> 
    <filter-name> security </filter-name> 
    <!-- Filter 负责拦截的URL --> 
    <url-pattern>/security/*</url-pattern> 
</filter-mapping>

小例子:

<filter>
	<filter-name>LoginFilter</filter-name>
	<filter-class>com.voiinnov.puhuilicai.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>LoginFilter</filter-name>
	<url-pattern>/ssl/*</url-pattern> 
	<!-- <url-pattern>*</url-pattern> -->
</filter-mapping> 


Filter实现类;
这里以登陆为例,

package com.voiinnov.puhuilicai.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
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;

import org.apache.commons.lang.StringUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.voiinnov.puhuilicai.common.Constants;
import com.voiinnov.puhuilicai.entity.CustUser;

/**
 * 
 * @Description: 登录filter
 * @author jingjiwu
 * @date 2014年8月25日 下午6:57:25
 */
public class LoginFilter implements Filter {

	private NotAuthUrl notAuthUrl = null;
	
	public LoginFilter(){
	}
	
	
	public void init(FilterConfig filterConfig) throws ServletException {
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());  
        notAuthUrl = (NotAuthUrl) ctx.getBean("notAuthUrl");
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;  
        HttpServletResponse res = (HttpServletResponse) response;  
        HttpSession session = req.getSession(true);
        String preUrl = (String)session.getAttribute("preUrl");
    	String logUrl = (String)session.getAttribute("logUrl");
    	CustUser user = (CustUser) session.getAttribute(Constants.USER); 
    	String type = req.getHeader("X-Requested-With");
        String url = ((HttpServletRequest)request).getRequestURI();
        if(user==null && url.contains("/ssl/") && !isNotloginUrl(url)){
        	if(StringUtils.isNotBlank(type) && type.equalsIgnoreCase("XMLHttpRequest")){
        		res.setHeader("sessionstatus", "timeout");  
        		res.sendError(518, "session timeout.");  
        	}else{
        		String purl = req.getRequestURL().toString();
            	if (!purl.contains("login")) {
            		preUrl=purl;
            		if (null!=req.getQueryString()) {
            			preUrl= preUrl+"?"+req.getQueryString();
    				}
    			}
            	session.setAttribute("preUrl", preUrl);
            	session.setAttribute("logUrl", logUrl);
            	logUrl = "http://"+req.getHeader("Host")+req.getContextPath()+"/index.htm?isFilter=yes";
       		 	res.sendRedirect(logUrl);
       		 	return;
        	}
        }else{
        	if(null!=user){
        		Long loginTime = (Long) session.getServletContext().getAttribute(user.getUserName());
        		if(loginTime!=null){
        			if(user.getLoginTime()<loginTime){
        				session.removeAttribute("user");
        				System.out.println("session remove");
        				String login = req.getContextPath() + "/index.htm";
	                 	res.sendRedirect(login);
	                 	return;
        			}
        		}
        		if(StringUtils.isNotBlank(preUrl)){
        			session.removeAttribute("logUrl");
        			session.removeAttribute("preUrl");
        			if(user.getCustType()==1 && preUrl.indexOf("ssl/account/toCenter")>1){
        				preUrl = preUrl.replaceAll("ssl/account/toCenter", "ssl/account/toEntCenter");
        			}
        			res.sendRedirect(preUrl);
        			return;
        		}
        	}
        	
	        /*if(null != user ){
	        	if(StringUtils.isNotBlank(preUrl)){
					session.removeAttribute("logUrl");
					session.removeAttribute("preUrl");
					if(user.getCustType()==1 && preUrl.indexOf("ssl/account/center")>1){
						preUrl = preUrl.replaceAll("ssl/account/center", "ssl/account/entcenter");
					}
					res.sendRedirect(preUrl);
	        	}
			}*/
        	/*if(null != user && StringUtils.isNotBlank(preUrl)){
    			session.removeAttribute("logUrl");
    			session.removeAttribute("preUrl");
    			if(user.getCustType()==1 && preUrl.indexOf("ssl/account/center")>1){
    				preUrl = preUrl.replaceAll("ssl/account/center", "ssl/account/entcenter");
    			}
            	res.sendRedirect(preUrl);
        	}*/
        } 
        chain.doFilter(request, response);
        
	}

	/**
	 * 不登录即可访问的页面
	 * @param url
	 * @return
	 */
	private boolean isNotloginUrl(String url){
		for(String not:notAuthUrl.getNotAuth()){
			if(url.contains(not))
				return true;
		}
		return false;
	}
	
	public void destroy() {
		
	}
}


    

     拦截器基本就分为这几部分,想要更多的了解,就需要自己去实践喽~

版权声明:本文为博主原创文章,未经博主允许不得转载。

spring拦截器、与filter的区别

5.1、处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理...
  • zqlsnow
  • zqlsnow
  • 2016年10月27日 16:11
  • 13496

Java中Filter、Listener,拦截器的学习,listener、 filter、servlet 加载顺序及其详解

Filter filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。它与Servlet的区...
  • lexang1
  • lexang1
  • 2016年08月17日 16:18
  • 2741

SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系

一 简介 (1)过滤器: 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操...
  • xiaoyaotan_111
  • xiaoyaotan_111
  • 2016年12月22日 18:02
  • 20621

javaWeb简单易懂的Filter拦截器例子

  • 2015年11月29日 12:55
  • 176B
  • 下载

AOP--Filter使用,过滤器和拦截器的区别

AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP利用封装、继承和...
  • StubbornPotatoes
  • StubbornPotatoes
  • 2012年03月13日 16:14
  • 12765

【DRP】拦截器Filter的使用

1.Filter前言         Servlet过滤器----Filter可以动态地拦截请求和响应,在客户端访问后台资源前、在服务器响应发送回客户端前,都可以先使用过滤器。过滤器相当于给ser...
  • mengdonghui123456
  • mengdonghui123456
  • 2017年01月10日 16:05
  • 538

AOP--Filter使用,过滤器和拦截器的区别

转自:http://blog.csdn.net/bjyfb/article/details/7347663 AOP(Aspect-Oriented Programming,面向切面编...
  • hjiacheng
  • hjiacheng
  • 2017年06月23日 17:29
  • 140

AOP--Filter使用,过滤器和拦截器的区别

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,并不是一种具体的实现,谈到实现一般有Filter和代理模式两种常见的使用方式,spring中的AOP也是封...
  • lixiangminghate
  • lixiangminghate
  • 2017年04月14日 23:51
  • 382

AOP--Filter使用,过滤器和拦截器的区别

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,并不是一种具体的实现,谈到实现一般有Filter和代理模式两种常见的使用方式,spring中的AOP也是封...
  • u010255859
  • u010255859
  • 2016年04月19日 14:32
  • 2813

拦截器 FILTER 样例

  • 2013年07月06日 09:58
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:filter拦截器的简单使用
举报原因:
原因补充:

(最多只允许输入30个字)