Servlet过滤器、编码过滤、Servlet监听器

目录

过滤器

简介

编码过滤

登录检测

Servlet监听器

对Servlet上下文监听

对session监听


Servlet一共分为三类:基础Servlet、过滤器、监听器。

过滤器

简介

过滤器的本质在于过滤所有的非法操作,而且所有的过滤需要自动实现过滤操作。想要在WEB中实现过滤器,需要一个专门的程序类,这个类需要去实现javax.servlet.Filter接口,这个接口里面定义有三个方法:

   | - 当容器启动后,过滤器就启动了

范例:建议MyFilter过滤器程序类

package cn.ren.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 {
		System.out.println("*** 初始化参数 ****" + filterConfig.getInitParameter("myparam"));
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println(" *** 过滤器执行前 *****");
		chain.doFilter(request, response);
		System.out.println(" *** 过滤器执行后 *****");
	}
	@Override
	public void destroy() {
		System.out.println("*** 销毁 ***");
	}

}

对于每个过滤器而言将用户的请求转发到目标位置需要利用FilterChain接口完成,这个接口;里面定义有 如下方法:

过滤器依然属于Servlet程序,所以依然需要在web.xml中进行配置

<filter>
  	<filter-name>MyFliter</filter-name>
  	<filter-class>cn.ren.filter.MyFliter</filter-class>
  	<init-param>
  		<param-name>myparam</param-name>
  		<param-value>init_param</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>MyFliter</filter-name>
  	<!-- 这里是过滤路径,设置为“/*”表示过滤所有路径,如果设置具体,则.. -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

所有的过滤器会根据器过滤路径自动进行执行,执行时一定要使用FilterChain接口中的doFilter()方法,将用户请求向后传递。

编码过滤

编码过滤主要是为了解决页面乱码的问题,如果所有的页面通过过滤器进行编码过滤,就不需要在每个页面上编写过滤代码。

范例:定义一个input.jsp页面

<body>
	<form action="show.jsp" method="post">
		信息:<input type="text" name="msg" id="msg" >
		<input type="submit" value="发送">
	</form>
</body>

范例:编写show.jsp页面

<h1>msg = ${param.msg}</h1>

范例:编写一个编码过滤器

package cn.ren.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 EncodingFilter implements Filter {
	private String charset = "UTF-8" ;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// 可以通过初始化参数进行过滤器编码的同一配置,这样如果要更换编码,这样修改web.xml配置文件
		if(filterConfig.getInitParameter("charset") != null) {
			this.charset = filterConfig.getInitParameter("charset") ;
		}  
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding(this.charset);
        response.setCharacterEncoding(this.charset);
		chain.doFilter(request, response);
	}

}
  <filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>cn.ren.filter.EncodingFilter</filter-class>
  	<init-param>
  		<param-name>charset</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>EncodingFilter</filter-name>
  	<!-- 这里是过滤路径,设置为“/*”表示过滤所有路径,如果设置具体,则.. -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

规范以后的开发程序使用编码过滤,不用在页面编写编码

登录检测

之后更。。。。。

Servlet监听器

Servlet监听器是对整个WEB状态进行监听,主要分为两种形式:application监听(ServletContext监听、整个容器监听)、session监听(用户的状态);

对Servlet上下文监听

实现对Servlet上下文监听,那么就需要两种监听处理:

  • 对Servlet上下文的状态监听:javax.servlet.ServletContextListener

        | - 容器启动:public void contextInitialized(ServletContextEvent sce)

        | - 容器销毁:public void contextDestroyed(ServletContextEvent sce)

        | - ServletContextEvent 事件对象:public ServletContext getServletContext()

  • 对Servlet上下文属性监听:javax.servlet.ServletContextAttributeListener

        |- 增加属性:public void attributeAdded(ServletContextAttributeEvent event)

        |- 替换属性:public void attributeRemoved(ServletContextAttributeEvent event)

        |- 删除属性: public void attributeReplaced(ServletContextAttributeEvent event)

        |- ServletContextAttributeEvent事件对象:

             |- 取得属性名称:public  String getName()

             |- 取得属性内容:public Object getValue()

范例:定义一个Servlet的整体监听

package cn.ren.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener, ServletContextAttributeListener {
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("*** 容器启动 ***" + sce.getServletContext().getRealPath("/"));
	}	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("*** 容器销毁 ***" + sce.getServletContext().getRealPath("/"));
	}
	@Override
	public void attributeAdded(ServletContextAttributeEvent event) {
		System.out.println(" *** 增加application *** name = " + event.getName() + "、value = " + event.getValue());
	}
	@Override
	public void attributeRemoved(ServletContextAttributeEvent event) {
		System.out.println(" *** 删除application *** name = " + event.getName() + "、value = " + event.getValue());
	}
	@Override
	public void attributeReplaced(ServletContextAttributeEvent event) {
		System.out.println(" *** 替换application *** name = " + event.getName() + "、value = " + event.getValue());
	}
}

配置

  <listener>
  	<listener-class>cn.ren.listener.MyListener</listener-class>
  </listener>
<%
    //application.setAttribute("msg", "www.baidu.com") ;
    application.removeAttribute("msg") ;
%>

对session监听

session监听指的是针对一个用户的状态监听,有两种:

  • session的状态监听:javax.servlet.http.HttpSeesionListener;

      | - session创建:public void sessionCreated(HttpSessionEvent se) ;

      | - session销毁:public void sessionDestroyed(HttpSessionEvent se) ;

      | - HttpSessionEvent 事件: public HttpSession getSession()

  • seesion的属性监听:javax.servlet.http.HttpSessionAttributeListener

      | - 增加属性:public void attributeAdded(HttpSessionBindingEvent event)

      | - 替换属性:pbulic void attributeRemoved(HttpSessionBindingEvent event)

      | - 销毁属性:public void attributeReplaced(HttpSessionBindingEvent event)

      | - HttpSessionBindingEvent 事件:

            | - public String getName()

            | - public Object getValue()

            | - public HttpSession getSession()

范例:观察Session

package cn.ren.listener;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("**** Session创建 ***" + se.getSession().getId());
	}
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("**** Session销毁***" + se.getSession().getId());
	}
	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		System.out.println("**** Session属性增加 ***" + event.getName() + "、" +  event.getValue());
	}
	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		System.out.println("****属性删除 ***" + event.getName() + "、" +  event.getValue());
	}
	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		System.out.println("****属性替换***" + event.getName() + "、" +  event.getValue());
	}
	
}
  <listener>
  	<listener-class>cn.ren.listener.SessionListener</listener-class>
  </listener>

session有三种情况会销毁:

  • 【项目运行时】使用session.invalidate()方法销毁;
  • 【项目运行过程中】session过时销毁,默认时间是30分钟;
  • 【项目开发之中】web项目重新加载会销毁;

过时时间可以自定义:(时间单位为1分钟)

  <session-config>
  	<session-timeout>1</session-timeout>
  </session-config>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值