1、实现登录操作时提示的错误信息可封装在request域中,如下所示:

image.png

然后再JSP中访问域中的数据:

<div id="errorMsg">${login_msg} ${register_msg}</div>

获取cookie中的值:

image.png

2、Filter

概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等

image.png

2.1、Filter快速入门

image.png

2.2、filter拦截路径的设置:

image.png

2.3、过滤器链:一个web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。

image.png

==注解配置的Fiter,优先级按照过滤器类名(字符串)的自然排序。==

2.4、登录验证

Java代码如下所示:

import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 拦截所有路径
 */
@WebFilter("/*")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        //类型转换
        HttpServletRequest req = (HttpServletRequest) request;
        //直接放行的路径(当访问注册或者登录的页面时,可以直接放行)
        String[] urls = {"/login.jsp", "/imgs/", "/css/", "/loginServlet", "/registerServlet", "/checkCodeServlet"};
        //获取当前访问的资源路径
        String url = req.getRequestURL().toString();
        //循环遍历数组并且判断
        for (String s : urls) {
            //找到了
            if (url.contains(s)) {
                //直接放行
                chain.doFilter(request, response);
                //结束方法
                return;
            }
        }

        //判断session中是否有user
        HttpSession session = req.getSession();
        Object user = session.getAttribute("user");
        //判断user是否为空
        if (user != null) {
            //登录了,直接放行
            chain.doFilter(request, response);
        } else {
            //没有登录,返回一个错误信息
            req.setAttribute("login_msg", "您尚未登录!");
            //返回登录页面
            req.getRequestDispatcher("/login.jsp").forward(req, response);
        }
    }

    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }

}
3、Listener

image.png