Filter Listener Servlet 是 javaweb 的三大组件
监听器
监听某一个对象(内置对象)的状态
状态:
1.监听内置对象的创建; ServletContext , request, session
2.监听内置对象值的改变 ServletContext request session
3.监听内置对象是否有存某一个固定的值 ==>主要是针对于session
监听内置对象的创建
ServletContex
ServletContex是随着服务器的创建而创建 ,随着服务器的关闭而销毁
步骤:
1.创建一个类 实现 ServletContextListener
2.重写两个方法 contextDestroyed(ServletContextEvent sce) 销毁后所执行的方法
contextInitialized(ServletContextEvent sce) 初始化所执行的方法
3.在xml进行配置 或者是写注解 @WebListener
xml配置
<listener>
//完整的包名与类名
<listener-class>com.study.listeren.MyServletContextListeren</listener-class>
</listener>
实现ServletContextListener(使用注解,如果写xml会优先加载xml配置)
@WebListener
public class MyServletContextListeren implements ServletContextListener {
// 创建的时候所执行的方法
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("contextInitialized");
}
// 销毁的时候所执行的方法
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("contextDestroyed");
}
}
request
request ==随着请求的开始而开始,随着请求的结束而结束(一次请求 )
步骤:
1.创建一个类 实现 ServletRequestListener
2.重写其requestDestroyed(ServletRequestEvent sre)销毁
requestInitialized(ServletRequestEvent sre) 创建
3.配置注解 注意点(默认的tomcat会发动请求,==>看效果,直接重新访问这个界面)
实现 ServletRequestListener
@WebListener
public class MyRequestListeren implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("requestDestroyed");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("requestInitialized");
}
}
session
session ==>是随着会话的创建而结果 ==>是30分钟之后而关闭(如果不设置默认的时间)
步骤:
1.创建一个类 实现 HttpSessionListener
2.重写其sessionDestroyed(HttpSessionEvent se)销毁
sessionCreated(HttpSessionEvent se 创建
3.配置注解 注意点:只要关闭后三十分钟 sessionId被清除
实现 HttpSessionListener
@WebListener
public class MySessionListeren implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionCreated");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionDestroyed");
}
}
监听内置对象值的改变
1.监听ServletContext对象值的改变 ==> 实现这个监听 ServletContextAttributeListener
1.attributeAdded(ServletContextAttributeEvent scab) 追加
2.attributeRemoved(ServletContextAttributeEvent scab) 删除
3.attributeReplaced(ServletContextAttributeEvent scab) 替换
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
// 添加至
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
}
//删除值
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
}
//替换值的时候
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
}
}
2.监听reques对象里值的改变==> 实现这个监听器 ServletRequestAttributeListener
1.attributeAdded(ServletContextAttributeEvent scab) 追加
2.attributeRemoved(ServletContextAttributeEvent scab) 删除
3.attributeReplaced(ServletContextAttributeEvent scab) 替换
注意点:在追加数据时候,默认会赋值一个null
@WebListener
public class MyRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("增加"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("删除"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("修改"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
}
}
3.监听session 的值改变==> 实现 HttpSessionAttributeListener
1.attributeAdded(ServletContextAttributeEvent scab) 追加
2.attributeRemoved(ServletContextAttributeEvent scab) 删除
3.attributeReplaced(ServletContextAttributeEvent scab) 替换
@WebListener
public class MySessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("增加"+httpSessionBindingEvent.getSession().getAttribute("uname"));
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("删除:"+httpSessionBindingEvent.getSession().getAttribute("uname"));
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("替换:"+httpSessionBindingEvent.getSession().getAttribute("uname"));
}
}
4.HttpSessionActivationListener == >防止内存中的数据丢失
sessionWillPassivate(HttpSessionEvent se)
钝化 ==>工业:把一些液体固体化 硬盘 == 内存
sessionDidActivate(HttpSessionEvent se) 活化 =>把固体化的物质解化
钝化:也就是把内存中数据保存在磁盘 1.把对象存在session
活化 :把磁盘中的数据加载到内存
注意点 1.要依赖于流,对象必须实现序列化的接口 2.不需要给注 3.不需要新建一个类 4. 在idea中需要配置
public class Person implements Serializable,HttpSessionActivationListener {
private String pname;
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
// 钝化
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionWillPassivate");
}
//活化
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
System.out.println("sessionDidActivate");
}
}
HttpSessionBindingListener 监听对象是否绑定在session==>也就是是否把这个对象存到session 里
valueBound() 表示绑定了
valueUnbound() 表示解绑了
1.不需要给注 2.不需要新建一个类
代码
public class Student implements Serializable,HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("被绑定了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("解绑了");
}
}
过滤器:Filter
程序中的过滤器跟生活中的定义一下 1.过滤: 过滤编码格式 2.对某些请求进行过滤
使用的一个步骤(与使用servlet的步骤是一样的):
1.写一个类 实现过滤这个接口
2.实现其抽象方法
init()filter 初始化所执行的方法
doFilter() 满足过滤条件的一切请求与响应都会执行这个方法
filterChain.doFilter(servletRequest,servletResponse); 一定放行
destroy() 销毁的方法
3.在web.xml 进行配置 或者配置注解
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*") 加载的顺序是按照名字来进行排序的
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*")
public class EncodingFilter implements Filter {
//filter 初始化的时候执行
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
}
//满足过滤条件的请求与响应都会执行
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html;charset=utf-8");
System.out.println("doFilter");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
// 销毁的时候执行
@Override
public void destroy() {
System.out.println("destroy");
}
}
@WebFilter(filterName = "userFilter",urlPatterns = "/admin/*")//过滤条件
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//对符合过滤条件的请求进行处理
// 首先把 ServletRequest 转化为HttpServletRequest
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpSession httpSession = request.getSession();
if(httpSession.getAttribute("uname") !=null){
//正常放行
filterChain.doFilter(servletRequest,servletResponse);//处理完成放行
}else{
System.out.println("123455");
//回到index.jsp
request.setAttribute("msg","非法访问");
request.getRequestDispatcher("../index.jsp").forward(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
}
过滤器链
一个请求与响应的路上存在多个过滤器 ==> 过滤器链执行的过程