JAVAWEB三大组件:
Servlet Filter Listenter
过滤器Filter
当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
1.过滤器的作用:
一般用于完成通过的操作。如:登录验证、统一编码设置、敏感字符的过滤…
2.使用步骤:
1.实现接口Filter
2.复写方法
3.设置拦截路径。url-pattren/注解
代码:
@WebFilter("*.jsp")
public class Filter implements javax.servlet.Filter {
public void destroy() {
// System.out.println("destroy....");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// System.out.println("doFilter......");
chain.doFilter(req, resp);//放行
}
public void init(FilterConfig config) throws ServletException {
// System.out.println("init......");
}
}
3.Filter生命周期:
init():在服务器启动后,会创建Filter对象,然后调用init方法。
doFilter():每一次请求被拦截资源是,都会执行。
destroy():在服务器关闭后,Filter对象被销毁,如果服务器是正常关闭,会调用destroy方法。
4.拦截方式配置:资源被访问的方式
*注解配置
设置dispatcherTypes属性
@WebFilter(value="/index.jsp",dispatherTypes={DispatcherType.FORWARD,DispatcherType.REQUEST})
1.REQUEST:默认值,浏览器直接请求资源
2.FORWARD:转发访问资源
3.LNCLUDE:包含访问资源
4.ERROR:错误跳转资源
5.ASYNC:异步访问资源
*web.xml配置
<filter-mapping>
<filter-name>xxx</filter-name>
<url-pattern></url-pattern>
<dispatcher>拦截方式</dispatcher>
</filter-mapping>
5.过滤器链(配置多个过滤器)
* 执行顺序:两个过滤器1和2
1.过滤器1
2.过滤器2
3.资源执行
4.过滤器2
5.过滤器1
*过滤器执行先后顺序问题:
1.注解配置:按照类名的字符串比较规则,值小的先执行
如:AFilter和BFilter A先执行
2.web.xml配置:<filter-mapping>谁定义在上边谁先执行。
6.案例:
1.案例1_登录验证
*需求:
1.访问项目的所有资源,都验证是否登录
2.登录了,放行
3.没有登录,跳转到登录页面。
Filter实现类:
package com.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//0.强制转换
HttpServletRequest request= (HttpServletRequest) servletRequest;
//获取资源请求路径
String uri = request.getRequestURI();
//判断是否包含登录的相关路径
if (uri.contains("login.html") || uri.contains("/LoginServlet") || uri.contains("/css") || uri.contains("/fonts") || uri.contains("/js") || uri.contains("/images")){
//包含,放行
filterChain.doFilter(servletRequest,servletResponse);
} else {
//不包含,验证用户是否登录
//从session中获取USER对象
Object user = request.getSession().getAttribute("user");
if (user!=null){
//已登录,放行
filterChain.doFilter(servletRequest,servletResponse);
} else {
//没有登录就跳转到登录页面
request.setAttribute("logno_errot","尚未登录,请登录");
request.getRequestDispatcher("login.html").forward(request,servletResponse);
}
}
}
@Override
public void destroy() {
}
}
2.案例2_敏感词汇过滤
*需求:
1.对day17_case案例登录录入的树精进行敏感词汇过滤
2.敏感词汇参考《敏感词汇.txt》
3.如果是敏感词汇,替换为***
*分析
1.对request对象进行增强,增强获取参数相关方法。
2.放行,传递代理对象
*增强对象的功能:设计模式
1.装饰模式
2.代理模式
*概念:
1.真实对象:被代理的对象
2.代理对象:
3.代理模式:代理对象代理真实对象,达到增强真实对象功能的的目的。
*实现方式:
1.静态代理:有一个类文件描述代理模式
2.动态代理:在内存中形成代理类。
*实现步骤:
1.代理对象和真实对象实现相同的接口
2.代理对象=Proxy.newInstance();
3.使用代理对象
*增强方式:
1.增强参数列表
2.增强返回值类型
3.增强方法执行逻辑
package com.filter;
import javax.servlet.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.*;
/**
* 敏感词汇过滤器
*/
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
private List<String> list=new ArrayList<String>();//敏感词汇集合
@Override
public void init(FilterConfig filterConfig) throws ServletException {
try{
//1.加载文件,获取真实路径
ServletContext servletContext = filterConfig.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/com/filter/敏感词汇.txt");
//2.读取文件
BufferedReader br=new BufferedReader(new FileReader(realPath));
//3.将文件的每一行数据添加到List中
String line=null;
while((line=br.readLine())!=null){
list.add(line);
}
br.close();
} catch (Exception e){
e.printStackTrace();
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//1.创建代理对象,增强getParameter方法
ServletRequest proxy_requset = (ServletRequest) Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(), servletRequest.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(servletRequest, args);
if (value!=null){
for (String str:list){
if (value.contains(str))
value=value.replaceAll(str,"***");
}
}
return value;
}
return method.invoke(servletRequest,args);
}
});
//2.放行
filterChain.doFilter(proxy_requset, servletResponse);
}
@Override
public void destroy() {
}
}
14.监听器Listener(了解)
*事件监听机制
*事件 :一件事情
*事件源 :事件发生的地方
*监听器 :一个对象
*注册监听:将事件、事件源、监听器绑定在一起。
当事件源上发生某个事件后,执行监听器代码
*ServletContextListener接口:监听ServletContext的创建和销毁
*方法:
*void contextDestroy(ServletContextEvent sce) :ServletContext销毁前调用的方法
*void contextInitialized(ServletContextEvent sce):ServletContext对象创建后调用的方法
*实现步骤;
1.定义一个类,实现ServletContextListenter接口
2.复写方法
3.配置
1.web.xml
2.注解 : @WebListener
3.指定初始化参数
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/路径</param-value>
</context-param>
*其他应用:GUI界面化布局
....