1.为什么需要过滤器
比如说,之前做的MVC案例,直接访问这个Servlet就可以查看信息。那登录功能就白写了。
所以,在访问资源时,需要有一个过滤器
比如说有些字符处理可以用在过滤器里。
注解里,写的路径,是要过滤的路径。别处请求这个路径资源,就会通过过滤器。
用法类似Servlet,都是实现一个接口,加注解,然后用重写的方法。
实现的接口就是javax.servlet包里的接口。
这里不放行,在控制台只有一个输出。请求就被拦截。
chain,这个参数使用doFilter就能转发请求。 到要访问的那个页面。
2 filter执行流程
放行前对request数据处理。
response等到访问到资源之后,才会有数据。
在放行后对response处理。
3.Filter使用细节
3.1 拦截路径配置
3.2 过滤器链
怎么安排过滤器之间的顺序?
filter1比filter2先执行,按名字的字符串比较。
4.案例
4.1 登录验证
怎么判断用户是否登录呢?
登录之后就放在session里存了个user对象。
如果session里面有这个对象就放行。
创建filter。
不能拦截所有。如果拦截/ *,那么浏览器的css也加载不出来。注册的界面也加载不出来。
先判断访问的路径是否和登录注册相关。
4.2 过滤器代码
package com.itheima.web.filter;
@WebFilter("/*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//强转
HttpServletRequest request=(HttpServletRequest) req;
//判断哪些路径可以直接放行。
String[] urls={"/Login.jsp","LoginServlet","/imgs/","/css/","/register.jsp","/registerServlet","/CheckCodeServlet"};
//得到当前路径,然后挨个判断是否在直接放行里。
String url = request.getRequestURL().toString();
for(String u :urls)
{
if(url.contains(u)){
//如果包含,直接放行。
chain.doFilter(req, resp);
return;
//放行了,就结束这个方法。
}
}
/*1.判断session里是否有user*/
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user != null){
chain.doFilter(req, resp);
}else{
//提示信息,尚未登录。
request.setAttribute("Login_msg","您尚未登录");
request.getRequestDispatcher("/Login.jsp").forward(request,resp);
}
}
public void init(FilterConfig config) throws ServletException {
}
}
5. Listener
对三种对象的行为进行监听,发现有举动就自动执行代码。
5.1 使用方法
后面学Spring的时候深入学习。