javaweb过滤器、监听器
过滤器
对访问的请求和响应进行拦截
四种拦截方式:
- 请求与响应发生变化
- 完成没有变化
- 被拦截过不去(写的时候要记住放行)
- 改变了原来的请求资源的目地
作用
对字符进行编码
让浏览器不缓存
屏蔽非法文字
登录权限验证
请求分发器
页面伪静态化处理
使用实例
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
}
过滤器配置过滤细节
- /* 匹配所有的资源
- /system/*
- *.后缀名 只有.后缀名的才会走这个Filte
- /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(使用最多)