package filter;

import java.io.IOException;
import java.io.PrintWriter;

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;
import javax.servlet.http.HttpSession;

/**
 * 系统管理员过滤器
 *
 * 该过滤器用于检查用户的会话是否包含管理员的身份信息，
 * 如果没有管理员身份信息，则重定向到管理员登录页面。
 * 用于保护需要管理员权限才能访问的页面。
 *
 * @author Mingyue
 */
public class AdminFilter implements Filter {

	/**
	 * 初始化方法
	 *
	 * 该方法在过滤器被创建时调用，只调用一次。可以在此方法中进行一些初始化操作。
	 * 目前未做任何操作。
	 *
	 * @param filterConfig 过滤器的配置对象
	 * @throws ServletException 如果发生初始化错误
	 */
	public void init(FilterConfig filterConfig) throws ServletException {
		// 初始化操作（当前没有）
	}

	/**
	 * 过滤请求和响应
	 *
	 * 该方法会在每次请求到达目标Servlet之前被调用。它会检查会话中是否存在管理员身份，
	 * 如果管理员身份信息不存在，则会通过JavaScript跳转到管理员登录页面。
	 *
	 * @param request 传入的Servlet请求对象
	 * @param response 传入的Servlet响应对象
	 * @param chain 过滤器链对象，允许将请求传递到下一个过滤器或目标Servlet
	 * @throws IOException 如果输入输出过程中发生错误
	 * @throws ServletException 如果Servlet处理请求时发生错误
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 将ServletRequest转换为HttpServletRequest，以便处理HTTP请求
		HttpServletRequest req = (HttpServletRequest) request;
		// 获取会话对象
		HttpSession session = req.getSession();

		// 检查会话中是否存在名为"admin"的属性，若不存在则跳转到登录页面
		if(session == null || session.getAttribute("admin") == null) {
			// 将ServletResponse转换为HttpServletResponse，以便处理HTTP响应
			HttpServletResponse rep = (HttpServletResponse)response;
			// 获取输出流
			PrintWriter out = rep.getWriter();
			// 使用JavaScript进行重定向，跳转到管理员登录页面
			out.print("<script>window.parent.location.href='"+ req.getContextPath() +"/adminLogin.html'</script>");
		} else {
			// 如果管理员已登录，继续执行过滤器链中的下一个过滤器或目标Servlet
			chain.doFilter(request, response);
		}
	}

	/**
	 * 销毁方法
	 *
	 * 该方法在过滤器被销毁时调用，一般用于清理资源。当前没有特定操作。
	 */
	public void destroy() {
		// 销毁操作（当前没有）
	}
}
