JavaWeb丨通过过滤器实现登录拦截及处理中文乱码问题

“登录过滤器”就是为了防止在用户没有登录的情况下来访问我们的网站。

过滤器的生命周期一般都要经过下面三个阶段:
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");

猜你喜欢

转载自blog.csdn.net/qq_38720976/article/details/83722236