学习记录 监听器与过滤器

来源:互联网 发布:rar怎么解压到mac 编辑:程序博客网 时间:2024/04/20 18:27

Listener监听器

用来监听域对象HttpServletRequestHttpSessionServletContext的创建与销毁,属性变化,session绑定javaBean

创建与销毁 属性变化

ServletContext ServletContext Listener ServletContextAttributeListener

HttpSession HttpSessionListener HttpSessionAttributeListener

HttpServletRequest HttpServletRequest Listener HttpServletRequestAttributeListener

监听javaBean对象是否绑定到sessionHttpSessionBindingListener

监听session序列化与反序列化(服务器session写入到硬盘):HttpSessionActivationListener

 

创建监听器

1.创建类实现Listener

2.重写接口方法

3.web.xml中注册监听器

 

ServletContext:在服务器启动时创建,在服务器关闭时销毁。

HttpSessiongetSession()时创建,在超时(默认30分钟,setMaxInactiveInterval(int interval)设置超时时间)、服务器关闭、invalidate()时销毁。

HttpServletRequest:发送请求时创建,产生响应时销毁。

 

监听属性变化

attributeAdded(ServletRequestAttributeEvent srae){}

attributeRemove(ServletRequestAttributeEvent srae){}

attributeReplaced(ServletRequestAttributeEvent srae){}

 

监听session绑定javaBean:setAttribute(“user”,user)removeAttribute(“user”)时监听到,

HttpSessionBindingListener是由javaBean实现的,不需要在web.xml中注册。

 

Filter过滤器

web服务器管理的的web资源拦截,实现需求功能,例如URL访问权限控制、过滤敏感词汇、压缩响应信息等。

 

创建过滤器

1.创建类实现Filter借口

2.重写接口方法doFilter是执行过滤的方法(doFilter内如果没有chain.doFilter(requestres)

3.web.xml中配置文件

  <filter>

   <filter-name>DoFilter</filter-name>

   <filter-class>com.omf.servlet.DoFilter</filter-class>

  </filter>

  <filter-mapping>

   <filter-name>DoFilter</filter-name>

   <url-pattern>/*</url-pattern>

  </filter-mapping>

注:Filter配置写在Servlet配置之上

多个Filter对同一个资源进行拦截会形成Filter链,并由web.xml中的<Filter-mapping>决定执行顺序。

 

Filter生命周期

1.服务器启动,创建Filter对象,调用init方法。

2.访问资源时,如果路径域Filter配置的拦截路径匹配,就会执行doFilter方法进行拦截。

3.服务器关闭时,调用destory方法销毁Filter

 

FilterConfig

Filter的配置对象。有如下方法:

getFilterName() 获取Filter名称

getInitParameter(String name) 获取Filter初始化参数

getInitParameterNames()

getServletContext() 获取ServletContext对象

 

<url-pattern>/*</url-pattern> 可以拦截指定url

<servlet-name>testServlet</servlet-name> 拦截指定servlet

<dispatcher>REQUEST</dispatcher> 请求拦截

<dispatcher>FORWARD</dispatcher> 转发拦截

 

全局编码过滤:重写requestgetParameter方法,使用装饰设计模式:

1.创建一个类让他与被装饰类实现同一个借口或继承同一个父类

2.在装饰类中持有一个被装饰类的引用

3.定义一个构造方法将被包装的对象传递过来

4.对于不需要改写的方法直接调用,需要改写的方法则重写

 

public void doFilter(ServletRequestrequest, ServletResponse response, FilterChain chain) throws IOException, ServletException {

MyRequest mr=new MyRequest((HttpServletRequest)request);

chain.doFilter(mr,response);

}

class MyRequest extends HttpServletRequestWrapper{

 

private ServletRequestrequest;

public MyRequest(HttpServletRequestrequest) {

super((HttpServletRequest)request);

this.request=request;

}

@Override

public String getParameter(Stringname) {

if(name!=null){

return this.getParameterMap().get(name)[0];

}

return null;

}

@Override

public String[] getParameterValues(Stringname) {

if(name!=null){

return this.getParameterMap().get(name);

}

return null;

}

@Override

public Map<String, String[]> getParameterMap() {

Map<String,String[]> map=request.getParameterMap();

for(Map.Entry<String,String[]>entry:map.entrySet()){

String[] values=entry.getValue();

for(int i=0;i<values.length;i++){

try {

values[i]=new String(values[i].getBytes("iso-8859-1"),"utf-8");

} catch (UnsupportedEncodingExceptione) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

return map;

}

}

public void init(FilterConfigfConfig) throws ServletException {

this.fConfig=fConfig;

}

0 0
原创粉丝点击