您当前的位置: 首页 > 

Charge8

暂无认证

  • 1浏览

    0关注

    447博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Filter过滤器

Charge8 发布时间:2018-12-28 23:38:57 ,浏览量:1

一、Filter过滤器

1、介绍

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

      它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。

2、Filter开发步骤:         1)编写java类实现Filter接口,并实现其doFilter方法。         2)在web.xml文件中注册filter类,并设置它所能拦截的资源

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

3、Filter的生命周期

        1)服务器启动时,web服务器创建Filter的实例对象,并调用其init方法,完成对象的初始化功能。filter对象只会创建一次,init方法也只会执行一次。

        2)拦截到请求时,执行doFilter方法。可以执行多次。

        3)服务器关闭时,web服务器销毁Filter的实例对象。

二、简单Demo

1、filter类

public class EncodeFilter implements Filter{
	private String encode;

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

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		//设置编码
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		//禁用浏览器缓存
		response.setHeader("Cache-Control", "no-cache");
		response.setHeader("Pragma", "no-cache");
		response.setDateHeader("Expires", -1);
		//放行通过,如果后续还有其它过滤器,则进入到下一个过滤器,如果没有其它过滤器了,则到达目标访问资源
		chain.doFilter(req, resp);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		encode = filterConfig.getInitParameter("encode");
		System.out.println(encode);
	}
}


public class AuthFilter implements Filter{
	@Override
	public void destroy() {
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		
		String path = request.getServletPath();
		System.out.println("path="+path);
		String uri = request.getRequestURI().toLowerCase();
		System.out.println("uri="+uri);
		
		//对uri进行一些判断操作
		if (UrlUtils.isDynamicUrl(uri) && !UrlUtils.isNoLoginUrl(uri)) {
			// 判断用户是否登录
			Object user = request.getSession().getAttribute("user");
			if (user == null) {// 未登录,响应登录界面
				response.sendRedirect(request.getContextPath() + "/login.jsp");
				return;
			}
		}else {
			chain.doFilter(req, resp);
		}
	}

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

2、web.xml 注册filter类

  
  	EncodeFilter
  	cn.jq.myservlet.filter.EncodeFilter
  	
  		encode
  		UTF-8
  	
  
  
  	EncodeFilter
  	/* 
  
  
  
  	AuthFilter
  	cn.jq.myservlet.filter.AuthFilter
  
  
  	AuthFilter
  	/* 
  
三、Filter对象——FilterConfig

        在web.xml注册filter时,可使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其 init方法获取参数。

filterConfig对象的方法:

        1)String getFilterName():得到filter的名称。

        2)String getInitParameter(String name):返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.

        3)Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。

        4)public ServletContext getServletContext():返回Servlet上下文对象的引用。

四、过滤器链——FilterChain

         一个web应用中可以注册多个过滤器对某些web资源进行拦截,这些过滤器就称为过滤器链。

    1、过滤器链作用:

         当一个filter收到请求的时候,调用chain.doFilter才可以访问下一个匹配的filter,若当前的filter是最后一个filter,调用chain.doFilter才能访问目标资源

    2、过滤器链的执行顺序:

         多个filter的执行顺序是由web.xml中 filter-mapping的位置顺序决定(谁在前先执行谁)。

    java web 过滤器跟拦截器的区别和使用

 

ends~

关注
打赏
1664721914
查看更多评论
立即登录/注册

微信扫码登录

0.0384s