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>