filter理解

Filter的理解

javaweb三大组件:servlet,filter过滤器,listener监听器

filter写法

1.接口创建

public class MyFilter implements Filter {
	public MyFilter() {
	}
	public void destroy() {
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}

}

2.配置映射关系

filter标签部分定义使用的过滤器,filter-mapping标签告诉服务器把哪些请求交给过滤器处理。这里的/表示所有请求,/表示根路径,(星号)代表所有请求,加在一起就变成了根路径下的所有请求。

<filter>
		<filter-name>MyFilter</filter-name><!--过滤器名称-->
		<filter-class>com.dyz.filter.MyFilter</filter-class><!--类全限定名(类路径)-->
	</filter>
	<filter-mapping>
		<filter-name>MyFilter</filter-name><!--和上边的filter-name保持一致-->
		<url-pattern>*.jsp</url-pattern><!--拦截路径,这个表示拦截所有以.jsp结尾的文件-->
	</filter-mapping>

3.filter的周期

public class MyFilter implements Filter {

	public MyFilter() {
		System.out.println("实例化Filter");
	}
	
	public void destroy() {
		System.out.println("销毁Filter");
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("进入doFilter");

//		chain.doFilter(request, response);//放行
	}

	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("初始化Filter");
	}

}

filter的作用

  • 它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).

应用方面

例如:用filter控制用户访问权限

public class SecurityFilter implements Filter { 
	public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException {     
	HttpServletRequest req = (HttpServletRequest) request;    
	HttpServletResponse res = (HttpServletResponse) response;    
	HttpSession session = req.getSession();
	if (session.getAttribute("username") != null) {        
		chain.doFilter(request, response);    
	} else {        
		res.sendRedirect("../failure.jsp");    
	} 
}

出于信息安全和其他一些原因的考虑,项目中的一些页面要求用户满足了一定条件之后才能访问(让用户输入帐号和密码),如果输入的信息正确就在session里做一个成功的标记,这里的成功标志就是session中的username有值;其后在请求保密信息的时候判断session中是否有已经登录成功的标记,存在则可以访问,不存在则禁止访问。

得到了http请求之后,可以获得请求对应的session,判断session中的username变量是否为null,如果不为null,说明用户已经登录,就可以调用doFilter继续请求访问的资源。如果为null,说明用户还没有登录,禁止用户访问,并使用页面重定向跳转到failure.jsp页面显示提示信息。

多个过滤器的执行先后问题

如果为注解配置,按照类名的字符串大小决定先后

web.xml配置:谁在上方谁先执行

执行时按照栈的数据结构先进后出,即先进后结束进程。

多个过滤器的执行先后问题

如果为注解配置,按照类名的字符串大小决定先后

web.xml配置:谁在上方谁先执行

执行时按照栈的数据结构先进后出,即先进后结束进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值