“登录过滤器”就是为了防止在用户没有登录的情况下来访问我们的网站。
过滤器的生命周期一般都要经过下面三个阶段:
1.初始化
当容器第一次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 Filter Config 对象的引用。
2.过滤
过滤器的大多数时间都消耗在这里。doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 Filter Chain 对象引用上的 doFilter方法),之后在处理控制权返回该过滤器时处理响应。
3.析构
容器紧跟在垃圾收集之前调用 destroy()方法,以便能够执行任何必需的清理代码。
具体代码操作如下
1.登录过后,需要把用户名设置为全局共享
HttpSession session = request.getSession(); //将数据存储到session中
session.setAttribute("loginName", loginName);
2.在web.xml文件中定义一个登录过滤器,代码如下:
<!-- 配置过滤器 -->
<filter>
<description>登录过滤器</description>
<filter-name>loginFilter</filter-name> //过滤器类名
<filter-class>aiit.ifly.Filter.LoginFilter</filter-class>//包名+过滤器类名
</filter>
<!-- 映射过滤器 -->
<filter-mapping>
<filter-name>loginFilter</filter-name>
//拦截内容,我设置的为拦截所有/*
<url-pattern>/*</url-pattern>
</filter-mapping>
3.新建一个LoginFilter过滤器类,继承Filter类。
package aiit.ifly.Filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginFilter implements Filter {
public void doFilter(ServletRequest resquest, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest hrequest = (HttpServletRequest)resquest;
HttpServletResponse hresponse = (HttpServletResponse)response;
//设置统一编码格式
hrequest.setCharacterEncoding("utf-8");
//无需登录过滤就能浏览的界面,像登录界面、注册界面、还有一些保存图片的路径,把它们单抽取出来
if(hrequest.getServletPath().endsWith("login.jsp")||hrequest.getServletPath().endsWith("toCheckLogin")||hrequest.getServletPath().endsWith(".png")){
chain.doFilter(resquest,response);
}else{
//获取登录过后,全局共享数据
Object name =hrequest.getSession().getAttribute("loginName");
if(name!=null){
// 已经登陆,继续此次请求
chain.doFilter(resquest, response);
}else{
//如果没有取到用户信息,非法访问,没有登陆,跳转到登陆页面
hresponse.sendRedirect("login.jsp");//重定向到登录界面
}
}
}
public void destroy() {
// TODO Auto-generated method stub
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
4.退出登录后,要销毁全局共享信息,如不销毁,浏览器会默认记住信息,短时间内,再次访问,过滤器无法识别是否登录
request.getSession().invalidate();
5.过滤器处理中文乱码问题,在doFilter里面添加下面这句,就可以解决servlet中文乱问题
//设置统一编码格式
request.setCharacterEncoding("utf-8");