当浏览器有一个请求的时候 。不管是请求html jsp servlet 我们都可以在请求到达之前就拦截。做统一的处理
当有返回的时候,在,到达浏览器之前。我们也可以拦截一下。 做你想要的处理
其实这个拦截器跟servlet 类似 也是由服务器自动调用。也是配置拦截的路径。
如何写一个filter
编写
1,实现接口 Filter 是 java.servlet的接口
2,要在web.xml中配置 和servlet类似 servlet-name 。。。。 都变成filter-name 与servlet区分
特点
3,接口中一共就三个方法 init 在服务器启动的时候用于初始化,对象被创建并且调用了这个方法。也是单例的。
4,主要的是dofilter 这个方法,在每次拦截的时候调用一次。 里面一共三个对象 req res 和 filterChain
应用
5,filterChain 的doFilter(req,res)把请求传给filter 链的下一个filter ,你过时最后一个就是执行了
6,如果是多个filter 拦截同一个路径,看filter-mapping 在web.xml中的配置先后,先配置,先执行。
这个filterchain 也就是doFilter 方法的递归调用,顺序就是递归的顺序
forward<> dispatcher一共是四种选项, request 直接请求 include 页面包含 error 也就是 diapatcher 可以配置多个。也就是多种多拦截jsp中
<jsp:include page="/test.jsp"> include 可以拦截
应用一:
可以禁用浏览器的缓存;
在dofilter 方法中
将response
setHeader
应用二:
跟上边类似,在request.setCharacterEncoding("utf-8);
应用三
校验有些页面需要校验登录
需要用
uncheckedurls , sessionkey 重定向的页面路径 /login/login.jsp
获取请求的路径
request.getRequestURL() 浏览器请求的路径
request.getRequestURI() /项目名/login/login.jsp
request.getServletPath() /login/login.jsp
在 filter的init 方法中 也就是在服务器启动的时候只获取这么一次。
getFilterConfig().getServletContext().getInitParameter("上面param-name中配置的”
把那三个都赋值filter的全局变量中。
第一判断是不是需要拦截 不写else 默认就是else
Arrays.asList(uncheckurls.split(",")) 这是一个 list
list.contains(url)就是我们getServletPath 就直接dofilter return;
到这证明需要拦截,看看session有没有
request.getSession().getAttribute(sessionkey) 如果是null就 response.sendRedirect(redirecturl); return;
到这证明session不是null
dofilter