Filter为一个接口,要使用过滤器时,实现该接口 ,去实现接口中的方法,接口中的方法其实相比Servlet很简单,init(), doFilter(),destroy();创建初始化,过滤,销毁。
public interface Filter {
void init(FilterConfig var1) throws ServletException;
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
void destroy();
}
看不出什么端倪来,点开 FilterChain
public interface FilterChain {
void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}
同样看不太出来 ,来看看他的使用方法,过滤器经常用做,过滤掉一些不希望用户不经过登录,授权就能访问和执行到的请求或页面。对指定的url 进行放行,对其他必须要登录能访问到url 进行禁止访问。
//1.设置编码集
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//2.进行拦截登录 强转为子类才能的得到
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
//获得完整的访问路径
String path= httpServletRequest.getRequestURL().toString();
//获得项目名字
String projectName = httpServletRequest.getContextPath();
//查找项目名字的索引+项目名字长度
int index = path.indexOf(projectName)+projectName.length();
//截取字符串,从上面的索引截取到结尾
path = path.substring(index);
//不需要拦截的登录界面,登录Servlet路径,注册老师的界面,注册老师的Servlet
if(!path.startsWith("/datetimepicker")&&!path.startsWith("/css")&&!path.startsWith("/img")&&!path.startsWith("/js")&&!path.endsWith("index.jsp")&&!path.endsWith("insertTeacher.html")&&!path.endsWith("LoginTeacherServlet")&&!path.endsWith("InsertTeacherServlet")){
HttpSession session = httpServletRequest.getSession();
Object o = session.getAttribute("tid");
//session中没有tid,代表没有登录过
if(o==null){
// 去登录
httpServletResponse.sendRedirect("index.jsp");
}else{
chain.doFilter(request, response);
}
}else{
chain.doFilter(request, response);
}
设置将css js 等资源放行,检查有没有登录,如果没有登录,(session中没有记录)则 返回登录界面。
chain.doFilter(request, response); 方法 该方法也就是接口中的doFilter方法,经过查阅,这个方法是是转向下一个过滤器的,一个个的过滤器是chain 连接起来的,讲这些请求发发向下一个过滤器
web.xml的配置形式,注意一般是拦截所有的/* 所有的请求。
<filter>
<filter-name>myFilter</filter-name>
<filter-class>com.icss.student.util.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
会看到和Servlet 的配置方式非常 接近。
过滤器的声明周期
1.filter的init方法在容器初始化时加载。而servlet 是在请求控制的改url时再进行init()的
2.doFilter()方法
3.destory ()方法
每次访问url时,都调用一次 doFilter()方法。init()和destory()只执行一次。
有新认识再补充,欢迎留言👇,指出问题,互相讨论。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。