过滤器(拦截器)
1,请求。响应都会拦截
2.需要等待过滤器方形
package com.yhy.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("拦截请求。。");
chain.doFilter(request, response);//放行
System.out.println("拦截响应");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
web.xml
注册
只拦截MyFilterServlet
一个Servlet
<filter>
<filter-name>MyFilterServlet</filter-name>
<filter-class>com.yhy.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilterServlet</filter-name>
<url-pattern>/MyFilterServlet</url-pattern>
</filter-mapping>
拦截所有Servlet
<filter>
<filter-name>MyFilterServlet</filter-name>
<filter-class>com.yhy.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilterServlet</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
当有多个Filter时,拦截顺序和web.xml
中的<filter-mapping>
顺序一致
通配符
dispatcher请求方式
REQUEST拦截HTTP请求 get post
FORWARD 只拦截通过请求转发的请求
INCLUDE 只拦截通过request.getRequestDispatcher("").include()
、通过<jsp:include page="...">
ERROR 只拦截<error-page>
发出的请求
使用:
<filter>
<filter-name>MyFilterServlet</filter-name>
<filter-class>com.yhy.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilterServlet</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
监听器
监听对象: request/session/application
1.监听对象的创建和销毁
request:ServerRequestListener
session:HttpSessionListener
application:ServetContextListener
每个监听器提供两个方法:监听开始、监听结束
2.监听对象中国属性的变更
request:ServletRequestAttributeListener
session: HttpSessionAttributeListerner
application: ServletContextAttributeListener
每个监听器包含三个方法 add remove replace
package com.yhy.filter;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class ListenerSer implements ServletRequestAttributeListener,HttpSessionAttributeListener,ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
String name = scae.getName();
Object value = scae.getServletContext().getAttribute(name);
System.out.println("Context【添加】属性:属性名:"+name+",属性值:"+value);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
System.out.println("Context【删除】属性:属性名"+scae.getName());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
// TODO Auto-generated method stub
String name =scae.getName();
String value = (String)scae.getServletContext().getAttribute(name);
System.out.println("Context【修改】属性,属性名:"+name+",属性值:"+value);
}
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
String name = se.getName();
String value = (String)se.getValue();
System.out.println("Session【添加】属性:属性名:"+name+",属性值:"+value);
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
System.out.println("Session【删除】属性:属性名"+se.getName());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
// TODO Auto-generated method stub
String name =se.getName();
String value = (String)se.getSession().getAttribute(name);
System.out.println("Session【修改】属性,属性名:"+name+",属性值:"+value);
}
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
String name = srae.getName();
String value = (String) srae.getServletRequest().getAttribute(name);
System.out.println("Request【添加】属性:属性名:"+name+",属性值:"+value);
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
System.out.println("Request【删除】属性:属性名"+srae.getName());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
// TODO Auto-generated method stub
String name =srae.getName();
Object value = srae.getServletRequest().getAttribute(name);
System.out.println("Request【修改】属性,属性名:"+name+",属性值:"+value);
}
}
session的钝化和活化
内存->硬盘 钝化、持久化、序列化
硬盘->内存 活化、反序列化
session对象的四种状态:
监听绑定和解绑:HttpSessionBingListener
不需要配置web.xml
a.session.setAttrubute("a".xxx)
对象a【绑定】到session中
b.session.removeAttribute("a")
对象a从session中【解绑】
监听活化和钝化:HttpSessionActivationListener
不需要配置web.xml
c.钝化
d.活化