Servlet :filter 和监视器:

filter : 作用:
在一个请求去访问某个资源的时候,filter可以在
这个请求访问到这个资源之前,把请求拦下,然后
做出一系列的处理或者判断(比如编码的转换,信息
的过滤、权限的判断、是否已经登录的验证等等),
最后filter再决定是否要让这个请求去访问那个资源.

Filter在客户端和访问资源的中间位置。
Filter可以在请求访问资源之前拦截请求。
Filter可以在响应返回客户端之前拦截响应。

作用:
a.可以修改response和request中的数据。
b.可以做日志输出
c.可以做事务管理
d.可以控制字符乱码
e.可以控制用户的访问权限

编写filter 过滤器
写一个JAVA类,然后实现JAVAx.Servlet.Filter 接口:
这个类里面 init() destroy ,doFilter() 方法;
init ---- 关于初始化的;
destroy ----- 销毁
doFilter() ------- 实现允许通过;
其中最重要的doFilter方法有三个参数
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
FilterChain是一个接口,表示过滤器链,这个接口中只有一个方法
public interface FilterChain {
public void doFilter(ServletRequest request, ServletResponse response)throws IOException, ServletException;
}

	同一个请求有可能要依次的通过俩个或者多个过滤器,
	在web中把这样多个过滤器看做一个过滤器链条对象,
	就是用这个FilterChain类型的对象来表示。
	chain.doFilter(req,res)表示把当前的req和res传
	给这个过滤器链条中的下一个过滤器进行过滤,如果
	说链条中已经没有下一个过滤器,那么就把这次访问
	放行,让它去访问它真正要访问的资源.

1.3 在web.xml中配置filter过滤器
注意标签中也能使用给过滤器传值
例如

encodingFilter
com.briup.filter.EncodingFilter

	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	其中<url-pattern></url-pattern>有四种配置方式

	第一种 精确匹配
		<url-pattern>/test_servlet</url-pattern>
		表示此拦截器只会拦截/test_servlet这一个路径
	
	第二种 扩展名匹配
		<url-pattern>*.html</url-pattern>
		表示此拦截器只会拦截后缀名是.html的路径
	
	第三种 路径匹配
		<url-pattern>/test/*</url-pattern>
		表示此拦截器拦截/test路径下的所有资源

		注意:路径和扩展名匹配无法同时设置,
		比如下面的三个<url-pattern>都是非法的,
		如果设置,启动tomcat服务器会报错。
		<url-pattern>/test/*.html</url-pattern>
		<url-pattern>/*.html</url-pattern>
		<url-pattern>he*.html</url-pattern>

		另外<url-pattern>/aa/*/bb</url-pattern>
		这个是精确匹配,url必须是 /aa/*/bb,这里的*不是通配的含义
	
	第四种 匹配任意的url
		<url-pattern>/*</url-pattern>
	
	
	注意:filter过滤器只是会拦截地址栏中会出现的路径,
	如果是服务器内部跳转的路径,filter是不会拦截的


1.4 多个filter过滤器的执行顺序
	如果有多个过滤器,并且多个过滤器拦截的路径有相同的部分,
	就有一些路径被会这多个过滤器共同拦截,那么过滤器的顺序
	是按照web.xml中配置的顺序从上到下执行的

	注意:一个<filter>标签可以多个<filter-mapping>标签
	例如:
	  <filter>
		<filter-name>test_filter</filter-name>
		<filter-class>com.briup.web.filter.TestFilter</filter-class>
	  </filter>
	  <filter-mapping>
		<filter-name>test_filter</filter-name>
		<url-pattern>/hello.html</url-pattern>
	  </filter-mapping>
	  
	  <filter-mapping>
		<filter-name>test_filter</filter-name>
		<url-pattern>/first.html</url-pattern>
	  </filter-mapping>

===================
模拟一个功能: 只有登陆了才可以访问登陆后的页面:没有登陆就访问这个页面就会跳转回到要登陆的界面;

解决方案:: 首先在控制跳转的servlet中,设置session, 然后设置 用户名 ( 如果成功登陆那么就设置,没有登陆就不要设置;
然后在filter 中 获取到这个session ,然后对这个session 中存的值 进行比较如果和已知的值相等 那么就是登陆成功,那么就让通过,如果是不相同,那么就是没有通过,就是重定向到登陆页面;
HttpSession session =request2.getSession(false); // 细节1: 不要去获取一个新的session ,而是只要比较session里面的值 就可以了;

	 if (session!=null) {     //多重判断 其实说到底还是为了方便 判断的效率,如果判断不对就不用再判了;
		Object  uesr = session.getAttribute("user");{
			if (uesr != null) {
				chain.doFilter(request, response);
			}else {
			response2.sendRedirect(request2.getContextPath()+"/login.html");
			}
		}
	}else {
		response2.sendRedirect(request2.getContextPath()+"/login.html");
	}

}

=========================================================

第七章:监听器(Listener)
1.1 监听器的作用
监听web中的一些事件的发生,如果某些事件一旦发生了,
那么这个监听器就会调用指定方法进行处理.
例如:在web中可以监听request对象的创建和销毁.

1.2 编写Listener监听器
	写一个java类,实现指定接口
	
	监听request相关的接口
	ServletRequestListener接口
		requestDestroyed方法
		requestInitialized方法
	ServletRequestAttributeListener接口
		attributeAdded方法
		attributeRemoved方法
		attributeReplaced方法
	
	
	监听session相关的接口
	HttpSessionListener接口
		sessionCreated方法
		sessionDestroyed方法

	HttpSessionAttributeListener接口
		attributeAdded方法
		attributeRemoved方法
		attributeReplaced方法
	
	
	监听application相关的接口
	ServletContextListener接口
		contextInitialized方法
		contextDestroyed方法
	
	ServletContextAttributeListener接口
		attributeAdded方法
		attributeRemoved方法
		attributeReplaced方法

1.3 在web.xml中配置Listener监听器
<listener>
	<listener-class>com.briup.listener.TestListener</listener-class>
</listener>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值