fileter_listener
fileter
一个实现了特殊接口的Java类,实现对请求资源(jsp,servlet,html)的过滤功能
过滤器是一个运行在服务器的程序,优先于请求资源(Servlet或者jsp,html)之前执行,过滤器是javaweb技术中最为实用的技术
作用
对目标资源(Servlet,jsp)进行过滤
使用方法
通过xml配置方式
通过注解方式
Filter的生命周期
init(FilterConfig):初始化
doFilter(ServletReqeust req,ServletResponse resp,FilterChain chain):执行过滤的方法
destory():销毁
生命周期描述
1.当服务器启动的时候,过滤器就被初始化了,执行过滤器的init方法
2.每当一个请求的路径是满足过滤器的配置属性,那么就会执行一次过滤器的doFilter方法
3.当服务器正常关闭的时候,销毁过滤器,执行过滤器的destory方法
映射路径
有选择的过滤器请求,需要配置过滤器不同的映射路径,从而让过滤器过滤希望过滤的请求
完全路径匹配,以“ / ”开始
过滤器只能拦截路径
目录匹配,以“ / ”开始,以“ * ”结束
当前项目下的所有路径都可以拦截
扩展名匹配,以“ * ”开始
拦截后缀
拦截方式
可以让过滤器区分不同的访问资源的方式,有不同的拦截方式
DispatcherType.REQUEST
默认,过滤从浏览器发送过来的请求和重定向
DispatcherType.FORWARD
只过滤转发过来的请求
@WebFilter(urlPatterns = "/demo02" ,dispatcherTypes = {
DispatcherType.FORWARD,DispatcherType.REQUEST})
public class FileDemo02 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("111");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
过滤器链
当一个filter收到请求的时候,调用chain.doFilter才可以访问下一个匹配的filter,若当前的filter是最后一个filter,调用chain.doFilter才能访问目标资源
非法字符
思路分析
创建一个表单用于发表言论
创建一个txt文件,其中存入非法字符
创建一个Filter,拦截请求,在init方法中将txt文件中的非法字符读取到内存中
获取请求中的参数,对请求的参数进行非法字符的校验
如果言论中不含有非法字符,就放行
如果言论中含有非法字符,就拦截,并且提示用户非法言论
package illegalchec;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
@WebFilter("/*")
public class IllegaFilter implements Filter {
private List<String> illegalWords = new ArrayList<String>();
//new一个list
@Override
public void init(FilterConfig filterConfig) throws ServletException {
try{
InputStream is = filterConfig.getServletContext().getResourceAsStream("IllegaWords.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"));
String line = null;
while((line = reader.readLine()) != null){
illegalWords.add(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setContentType("text/html;charset = utf-8");
request.setCharacterEncoding("utf - 8");
String message = request.getParameter("message");
for (String illegalWord : illegalWords){
if (message != null && message.trim().contains(illegalWord)){
response.getWriter().write("含有非法字符");
return;
}
}
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
Listener
监听器是一个Java类,用来监听其他的JavaBean的变化
在javaweb中监听器就是监听三个域对象的状态的
requestqa , session , servletContext(application)
监听器的应用
主要在Swing编程
Android大量应用
js里面的事件
监听器的术语
事件源:被监听的对象.目标对象
监听器对象:监听的对象
事件:事件源行为的称呼
注册(绑定):将”监听器对象“注册给“事件源”
事件对象:在“监听器对象”中获得“事件源”
ServletContextListener
监听ServletContext对象的销毁和创建
创建:其中ServletContext服务器启动的时候,服务器为每个Web应用创建一个单独的ServletContext
销毁:服务器关闭的时候,或者从项目中移除
ServletContextListener的使用
编写一个类,实现ServletContextListener接口
在web.xml里面注册listener