##Filter :过滤器
*在生活中的过滤器:净水器,空气净化器,土匪、
*web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
*过滤器的作用:
*一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤....
*快速入门:
1.步骤:
1.定义一个类,实现接口Filter
2.复写方法
3.配置拦截路径: 1.web.xml 2.注解
/*
* 过滤器快速入门
* */
@WebFilter("/*")
public class FilterDemo1 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("过滤器被执行了.....");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
3.过滤器细节:
1.web.xml配置
url-pattern中的路径是拦截路径
2.过滤器执行流程
1.执行过滤器
2.执行放行后的资源
3.回来执行过滤器放行代码下边的代码
3.过滤器生命周期方法
1.init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
2.doFilter:每一次请求被拦截资源后,会执行。执行多次
3.destory:在服务器关闭后,Filter对象被销毁.如果服务器是正常关闭,则会执行destory方法,只执行一次。用于释放资源
4.过滤器配置详解
*拦截路径配置:
1.具体资源路径:/index.jsp 只用访问index.jsp资源是,过滤器才会被执行
2.拦截目录:/user/* 访问/user下的所有资源时,过滤器都会被执行
3.后缀名拦截:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
4.拦截所有资源:/* 访问所有资源时,过滤器都会被执行
*拦截方式配置:资源被访问的方式
*注解方式:
*设置:dispatcherTypes属性
1.REQUEST:默认值。浏览器直接请求资源
2.FORWARD:转发访问资源
3.INCLUDE:包含访问资源
4.ERROR:错误跳转资源
5.ASYNC:异步访问资源
*web.xml配置
*设置<dispatcher></dispatcher>标签即可
5.过滤器链(配置多个过滤器)
*执行顺序:如果有两个过滤器:过滤器1和过滤器2
1.过滤器1
2.过滤器2
3.资源执行
4.过滤器2
5.过滤器1
*过滤器先后顺序问题:
1.注解配置:按照类名的字符串比较规则比较,值小的先执行
*如:AFilter 和 BFilter ,AFilter就先执行
2.web.xml配置:<filter-mapping> 谁定义在上面谁先执行
*增强对象的功能:
*设计模式:一些通用的解决固定问题的方式
1.装饰模式
2.代理模式
*概念:
1.真实对象:被代理的对象
2.代理对象:
3.代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
*实现方式:
1.静态代理:有一个类文件描述代理模式
2.动态代理:在内存中形成代理类
*实现步骤:
1.代理对象和真实对象实现相同的接口
2.代理对象 = Proxy.newInstance();
3.使用代理对象调用方法
4.增强方法
*增强方式:
1.增强参数列表
2.增强返回值类型
3.增强方法体执行逻辑
//动态代理增强lenvo对象
/*
* 三个参数:
* 1.类加载器:真实对象.getClass().getClassLoader()
* 2.接口数组:真实对象。getClass().getClassLoader()
* 3.处理器:new InvocationHandler()
* */
SaleComputer proxy_lenvo = (SaleComputer) Proxy.newProxyInstance(lenvo.getClass().getClassLoader(), lenvo.getClass().getInterfaces(), new InvocationHandler() {
/*
* 代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
* 参数:
* 1.proxy:代理对象
* 2.method:代理对象调用的方法,被封装为的对象
* 3.args:代理对象调用的方法时,传递的实际参数
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("该方法执行了...........");
String name = method.getName();
System.out.println(name);
System.out.println(args[1]);
return null;
}
});
proxy_lenvo.show();
String sale = proxy_lenvo.sale(6000.4);
System.out.println(sale);
// lenvo.sale(8000.0);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//判断是否是sale方法
if(method.getName().equals("sale")){
//1.增强参数
double money =(double)args[0];
money = money* 0.85;
System.out.println("专车接您...");
//使用真实对象调用方法
Object obj = method.invoke(lenvo, money);
System.out.println("免费送货");
//增强返回值
return obj+"鼠标垫";
}else {
Object obj = method.invoke(lenvo, args);
return obj;
}
}
});
##过滤铭感信息案例:
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.创建代理对选哪个,增强getParameter方法
ServletRequest p = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强getParameter方法
///判断是否是getParameter方法
if(method.getName().equals("getParameter")){
//增强返回值
String value = (String)method.invoke(req,args);
if(value != null){
for (String str : list) {
if(value.contains(str)){
value = value.replaceAll(str,"***");
}
}
}
return value;
}
return method.invoke(req,args);
}
});
chain.doFilter(p, resp);
}
private List<String> list = new ArrayList<String>();//敏感词汇集合
public void init(FilterConfig config) throws ServletException {
try {
//1.获取文件真实路径
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/铭感词汇.txt");
//2.读取文件
BufferedReader bufferedReader = new BufferedReader(new FileReader(realPath));
//3,将文件的每一行数据添加到list中
String line = null;
while ((line = bufferedReader.readLine()) != null){
list.add(line);
}
bufferedReader.close();
System.out.println(list);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
## Listener :监听器
*概念:web的三大组件之一
*事件:一件事情
*事件源:事件发生的地方
*监听器:一个对象
*注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
*ServletContextLinstener:监听ServletContext对象的创建和销毁
*void contextDestroyed(ServletContextEvent sce):ServletContext对象被销毁之前会调用该方法
*void contextInitialized(ServletContextEvent sce):ServletContext对象创建后会调用该方法
*步骤:
1.定义一个类,实现ServletContextListener接口
2.复写方法
3.配置
1.web.xml
<listener>
<listener-class>文件路径</listener-class>
</listener>
*指定初始化参数:
<context-param>
<param-name>名称</param-name>
<param-value>键值</param-value>
</context-param>
2.注解: *@webListener