javaweb过滤器、监听器

本文深入讲解JavaWeb中的过滤器和监听器,包括过滤器的四种拦截方式、生命周期、配置方法及权限验证,同时探讨了监听器的作用域对象生命周期和属性监听机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

javaweb过滤器、监听器

过滤器

对访问的请求和响应进行拦截

四种拦截方式:

  1. 请求与响应发生变化
  2. 完成没有变化
  3. 被拦截过不去(写的时候要记住放行)
  4. 改变了原来的请求资源的目地

作用

对字符进行编码

让浏览器不缓存

屏蔽非法文字

登录权限验证

请求分发器

页面伪静态化处理

使用实例

1.创建过滤器类r,自定义类实现Filter(Tomcat中的Servelt.jar) 接口即可

2.xml配置过滤器

  <filter>
  	<filter-name>first</filter-name>
  	<filter-class>cn.itsource.firstfilter.FirstFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>first</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

3.过滤器需要放行才能抵达web资源

@Override//相当于Servlet中的service方法
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		System.out.println("业务方法");
		arg2.doFilter(arg0, arg1);//放行
	}

4.过滤器根据过滤器配置的映射路劲匹配,决定过滤那些资源

生命周期

创建–>初始化–>执行(每次过滤都执行)–>销毁(正常关闭)

过滤器链

概念

多个过滤器形成的一组过滤器,访问一个资源,会经过多个过滤器,目的是为了职责分明

过滤器链顺序

xml文档配置方式执行顺序:

是由filter-mapping的顺序决定,web.xml文档解析从上到下,先配置的先执行

注解配置过滤器执行顺序:

过滤器链的执行顺序用@WebFilter注解,执行顺序按照过滤器类全限定名,字母表先后顺序

配置对象FilterConfig

表示过滤器配置信息,初始化时根据Filter配置信息,创建了一个FilterConfig对象

配置方法

<filter>
  	<filter-name>filter</filter-name>
  	<filter-class>cn.itsource.filterconfig.ConfigFilter</filter-class>
    <!-- FilterConfig配置 -->
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>filter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

常用方法

1.获取filter的名字

String filterName = cfg.getFilterName();
System.out.println(filterName);//filter

2.根据名字获取配置参数

String initParameter = cfg.getInitParameter("encoding");
System.out.println(initParameter);//utf-8

3.获取所有的配置参数名字

Enumeration<String> initParameterNames = cfg.getInitParameterNames();
while (initParameterNames.hasMoreElements()) {
	String nextElement = initParameterNames.nextElement();
	System.out.println(nextElement);//encoding
}

过滤器配置过滤细节

  1. /* 匹配所有的资源
  2. /system/*
  3. *.后缀名 只有.后缀名的才会走这个Filte
  4. /index.jsp

6.在访问Servlet的时候,请求转发执行过滤器,会先走过滤器的doFilter方法在走Servlet的service方法

字符编码过滤

1.字符过滤(最佳方式)

req.setCharacterEncoding("utf-8");

2.解决硬编码问题:配置文件

<filter>
  	<filter-name>filter</filter-name>
  	<filter-class>cn.itsource.filterencoding.EncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>filter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain fc)
	req.setCharacterEncoding(initParameter);
}
@Override
public void init(FilterConfig cfg) throws ServletException {
	//根据名字获得配置参数
	initParameter = cfg.getInitParameter("encoding");//utf-8
}

3.如果没有编码设置默认编码

if (req.getCharacterEncoding() == null) {//判断是否设置了默认编码,如果没有则设置成utf-8				req.setCharacterEncoding("utf-8");
}

4. 希望按照自己设置的编码处理

<init-param>
      <param-name>force</param-name>
      <param-value>false</param-value><!-- false用自己的,true用写好的 -->
</init-param>
if(force){
	req.setCharacterEncoding(initParameter);			
}

过滤器权限验证

1.过滤器方法

//配置文件判断要放行的路径
String requestURI = req.getRequestURI();
//配置路径全部装入list集合
List<String> list = Arrays.asList(arr);
boolean contains = list.contains(requestURI);
if(req.getSession().getAttribute("user")!=null || contains)

2.权限判断

做权限判断的资源专门放入到一个目录/system/*中

  <filter-mapping>
    <filter-name>login</filter-name>
    <url-pattern>/system/*</url-pattern>
  </filter-mapping>

监听器

作用域对象生命周期

1.ServletRequestListener–>request监听器

2.HttpSessionListener–>session监听器

3.ServletContextListener -->application监听器

作用域对象的属性监听

当添加属性,移除属性,修改属性的时候执行

1.ServletRequestAttributeListener

2.HttpSessionAttributeListener

3.ServletContextAttributeListener(使用最多)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值