filter理解

filter理解,第1张

文章目录
  • Filter的理解
    • filter写法
      • 1.接口创建
      • 2.配置映射关系
      • 3.filter的周期
    • 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配置:谁在上方谁先执行

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/877101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存