Utilizo código para enseñarte (2): Filtro para la interceptación de inicio de sesión

1. Introducción

Cuando empezó a aprender Java Web, creo que la primera persona con la que se encontrará debe ser JSP + Servlet para desarrollar aplicaciones web. Aquí hablamos sobre el uso de Filter en Servlet y los escenarios de desarrollo reales correspondientes.

2. ¿Qué es el filtro?

2.1 La definición oficial de Filtro

Un filtro (Filter) es un objeto que realiza tareas de filtrado en solicitudes de recursos (servlet o contenido estático) o respuestas de recursos, o en ambos. —— Extracto de la documentación de JavaEE6

2.2 Ver el documento de filtro

Documentación de Java EE6: https://tool.oschina.net/apidocs/apidoc?api=javaEE6

Inserte la descripción de la imagen aquí

3.Solución de diagrama de flujo de ejecución de filtrado

Inserte la descripción de la imagen aquí

4. Filtrar en escenarios de desarrollo reales

4.1 Procesamiento Unicode

4.1.1 Escenario empresarial

   En nuestro desarrollo de Java Web, los formularios de formulario a menudo deben completarse en chino y pasarse al servidor para su almacenamiento. Por lo tanto, debemos ocuparnos del problema confuso.
    Si el formulario de registro tiene parámetros chinos, el servlet registrado debe lidiar con el problema chino confuso; si el formulario de inicio de sesión tiene parámetros chinos, el servlet que maneja el inicio de sesión debe lidiar con el problema confuso chino; si los dos formularios tienen chino, debe procesarse dos veces, entonces ¿10 formularios de formulario, 100 formularios de formulario? ? ?
    Por lo tanto, es muy amargo y refrescante manejar todos los problemas confusos chinos solicitados por Filter. A continuación lo demostramos con código:

4.1.2 Estructura del proyecto

PD: En este momento hemos logrado tal efecto: escriba dos formularios, login.jsp y register.jsp, complete en chino para enviar el formulario. Utilice el filtro para manejar uniformemente el problema confuso chino de múltiples formas.
Inserte la descripción de la imagen aquí

4.1.3 Formulario de procesamiento de servlets

RegisterServlet:

@WebServlet(name = "RegisterServlet",urlPatterns = "/register.do")
public class RegisterServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //接收参数
       String username =  request.getParameter("username");
       String pwd =  request.getParameter("pwd");
        System.out.println("username:"+username+",pwd:"+pwd);
        request.getRequestDispatcher("login.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

LoginServlet:

@WebServlet(name = "LoginServlet",urlPatterns = "/login.do")
public class LoginServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        String username =  request.getParameter("username");
        String pwd =  request.getParameter("pwd");
        System.out.println("username:"+username+",pwd:"+pwd);
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

4.1.4 Página JSP para registro e inicio de sesión

Formulario de inicio de sesión:
Inserte la descripción de la imagen aquí
Formulario de registro:
Inserte la descripción de la imagen aquí

4.1.5 Utilice el filtro para procesar todos los caracteres confusos chinos solicitados

@WebFilter(filterName = "CommonFilter",urlPatterns = "*.do")
public class CommonFilter implements Filter {
    
    
    public void destroy() {
    
    
       
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    
        System.out.println("--------公共拦截器--start----------");
        //当每个表单中都有中文提交时,此时Servlet都需要进行乱码处理
        req.setCharacterEncoding("UTF-8");
        chain.doFilter(req, resp);//放行
        System.out.println("--------公共拦截器--end----------");
    }

    public void init(FilterConfig config) throws ServletException {
    
    
    }

}

4.1.6 Efecto de demostración

Después de completar en chino en la página de inicio de sesión o en la página de registro, el Servlet puede recibir chino incluso sin un procesamiento confuso en chino. Porque Filter nos ayudó a lidiar con los caracteres confusos chinos
Inserte la descripción de la imagen aquí
como se muestra a continuación:
Inserte la descripción de la imagen aquí

4.2 Interceptor de inicio de sesión de usuario

4.2.1 Escenario empresarial

En el desarrollo real, hay muchas solicitudes que requieren que los usuarios inicien sesión antes de poder acceder a ellas. Por ejemplo: cuando ingresemos a Taobao, se le pedirá que inicie sesión cuando revise el carrito de compras o la lista de pedidos. Déjame decirte el código a continuación, ¿cómo lograrlo? ? ?

4.2.2 Estructura del proyecto

PD: En este momento, hemos logrado un efecto. Cuando el usuario salta a la "Lista de pedidos" en index.jsp, el filtro se intercepta para determinar si el usuario ha iniciado sesión, y si no, salta a la página de inicio de sesión para que el usuario inicie sesión.
Inserte la descripción de la imagen aquí

4.2.2 Sobre la base del ejemplo anterior, realice los siguientes preparativos:

Lista de pedidos: Order.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>订单列表</title>
</head>
<body>
<h1>订单列表</h1>
</body>
</html>

Página de inicio: index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>主页</title>
  </head>
  <body>
  <h1>welcome to index.jsp!</h1>
  <a href="login.jsp">登录</a>
  <a href="register.jsp">注册</a>
  <a href="${pageContext.request.contextPath}/order/showOrder.do">查看订单列表</a>
  </body>
</html>

OrderServlet:

@WebServlet(name = "OrderServlet",urlPatterns = "/order/showOrder.do")
public class OrderServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("------------展示订单列表-------------");
        request.getRequestDispatcher("index.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request,response);
    }
}

4.2.3 Escribir un interceptor de inicio de sesión

@WebFilter(filterName = "LoginFilter",urlPatterns = "/order/*")
public class LoginFilter implements Filter {
    
    
    public void destroy() {
    
    
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    
        System.out.println("--------登录拦截器--start----------");
        //涉及到4个作用域
        HttpServletRequest request = (HttpServletRequest)req;
        HttpSession session = request.getSession();
        String userName = (String) session.getAttribute("session_user");
        if(userName!=null&!"".equals(userName)){
    
    //说明用户登录了
            chain.doFilter(req, resp);//放行
        }else{
    
    //说明用户未登录
            //跳转到登陆页面
            request.setAttribute("tip","请先登录!");
            request.getRequestDispatcher("/login.jsp").forward(request,resp);
        }

        System.out.println("--------登录拦截器--end----------");
    }

    public void init(FilterConfig config) throws ServletException {
    
    

    }

}

4.2.4 Efecto de demostración

1) Acceda directamente a "Ver lista de pedidos" en la página index.jsp
Inserte la descripción de la imagen aquí
2) Salte a la página de inicio de sesión y pregunte porque el usuario no ha iniciado sesión
Inserte la descripción de la imagen aquí
3) Vea los datos de impresión de la consola, observe y piense en el proceso de retorno entre múltiples interceptores.
Inserte la descripción de la imagen aquí

4.3 Aplicación en otros escenarios

1) Filtro de autenticación
2) Filtro de registro y auditoría
3) Filtro de conversión de imágenes
4) Filtro de compresión de datos
5) Filtro cifrado

  Esta publicación de blog utiliza dos ejemplos para familiarizarse con la función de Filtro en el escenario de desarrollo real. Una vez que esté familiarizado con estos dos ejemplos, la aplicación de otros escenarios comerciales se implementará más adelante.

5. Adjunte el código fuente completo

https://download.csdn.net/download/u010312671/12562324

Supongo que te gusta

Origin blog.csdn.net/u010312671/article/details/106990373
Recomendado
Clasificación