Filter
过滤器 Filter
filter是对客户端访问资源的过滤,访问某个资源时,符合条件就通过,否则就不通过,并且可以对目标资源访问前后进行逻辑处理。
服务器创建时就创建了该filter对象,服务器关闭时 filter就销毁。
Filter接口有三个方法,并且这三个方法都是与filter生命相关的方法。
init(Filterconfig) --代表filter对象初始化方法 filter对象创建时执行
doFilter(ServletRequest,ServletResponse.FilterCha); --代表filter对象执行的核心方法,如果某个资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法
destory() --代表是filter销毁方法,当filter对象销毁时执行该方法
创建testFilter类 实现Servlet包下的 Filter接口 重写三个方法
package com.david.filter; import javax.servlet.*; import java.io.IOException; public class testFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("filter被初始化了"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("过滤方法"); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { System.out.println("filter被销毁了"); } }
配置xml文件 url-pattern 进行过滤的资源
<filter> <filter-name>testFilter</filter-name> <filter-class>com.david.filter.testFilter</filter-class> </filter> <filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
filter配置
完全匹配 <url-pattern>中 /test 只有访问test路径才会匹配成功
目录匹配 /users/* 只有访问users目录才会匹配成功
后缀名匹配 *.jsp 只有访问jsp文件才会匹配成功 后缀名匹配 只能以*号开头 不能前面加目录 /users/*.jsp 这是错误的
除了配置url-pattern路径外 还可以配置servlet-name
dispatcher 访问方式
<filter> <filter-name>testFilter</filter-name> <filter-class>com.david.filter.testFilter</filter-class> </filter> <filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
REQUEST 默认值,代表直接访问某个资源时执行
FORWARD 转发时执行 request.getRequestDispatcher("/test1").forward(req,res);
INCLUDE 包含资源时执行
ERROR 发生错误时执行
例如使用filter对登陆权限进行认证 地址配置为/admin/* admin文件夹下所有的文件 然后再filter中判断cookie 或session身份认证
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("过滤方法"); HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse res = (HttpServletResponse) servletResponse; Cookie[] cookies = req.getCookies(); String CurrentUserName = null; if(cookies != null){ for(Cookie c : cookies){ if("myUser_name".equals(c.getName())){ CurrentUserName = c.getName(); } } } if(CurrentUserName != null){ //已登陆 放行访问内容 filterChain.doFilter(servletRequest,servletResponse); }else{ //未登录 res.sendRedirect("/login"); } }
解决全局乱码问题,就不用每个都设置一下 编码类型了
req.setCharacterEncoding("UTF-8");
res.setCharacterEncoding("UTF-8");