Eu uso o código para ensinar você (2): Filtro para interceptação de login

1. Introdução

Quando você começou a aprender Java Web, acredito que a primeira pessoa que você encontrará deve ser JSP + Servlet para desenvolver aplicativos da web. Aqui falamos sobre o uso de Filtro em Servlet e os cenários de desenvolvimento reais correspondentes.

2. O que é filtro?

2.1 A definição oficial de Filtro

Um filtro (Filtro) é um objeto que executa tarefas de filtragem em solicitações ou respostas de recursos (servlet ou conteúdo estático) ou em ambos. —— Trecho da documentação JavaEE6

2.2 Ver o documento de filtro

Documentação Java EE6: https://tool.oschina.net/apidocs/apidoc?api=javaEE6

Insira a descrição da imagem aqui

3. Solução de fluxograma de execução de filtro

Insira a descrição da imagem aqui

4. Filtro em cenários reais de desenvolvimento

4.1 Processamento Unicode

4.1.1 Cenário de negócios

   Em nosso desenvolvimento de Java Web, os formulários de formulário geralmente precisam ser preenchidos em chinês e passados ​​para o servidor para armazenamento. Portanto, precisamos lidar com o problema truncado.
    Se o formulário de registro tiver parâmetros chineses, o servlet registrado precisa lidar com o problema truncado chinês; se o formulário de login tiver parâmetros chineses, o servlet que lida com o login precisa lidar com o problema truncado chinês; se os dois formulários tiverem chinês, ele precisará ser processado duas vezes, então 10 formulários de formulário, 100 formulários de formulário? ? ?
    Portanto, é muito amargo e revigorante lidar com todos os problemas truncados chineses solicitados pelo Filter. Abaixo, demonstramos com o código:

4.1.2 Estrutura do projeto

PS: Neste momento, alcançamos esse efeito: escreva dois formulários, login.jsp e register.jsp, preencha em chinês para enviar o formulário. Use o filtro para lidar de maneira uniforme com o problema chinês truncado de formulários múltiplos.
Insira a descrição da imagem aqui

4.1.3 Formulário de processamento de servlet

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 login


Insira a descrição da imagem aqui
Formulário de login: Formulário de inscrição:
Insira a descrição da imagem aqui

4.1.5 Use o filtro para processar todos os caracteres truncados chineses 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 Efeito de demonstração

Após preencher em chinês na página de login ou na página de registro, o Servlet pode receber chinês mesmo sem processamento truncado de chinês. Porque Filter nos ajudou a lidar com caracteres truncados chineses,
Insira a descrição da imagem aqui
conforme mostrado abaixo:
Insira a descrição da imagem aqui

4.2 Interceptador de login do usuário

4.2.1 Cenário de negócios

No desenvolvimento real, existem muitas solicitações que exigem que os usuários efetuem login antes de poderem acessá-los. Por exemplo: quando fizermos login no Taobao, você será solicitado a fazer login ao verificar o carrinho de compras ou verificar a lista de pedidos. Deixa eu te contar o código abaixo, como fazer isso? ? ?

4.2.2 Estrutura do projeto

PS: Neste momento, alcançamos um efeito. Quando o usuário salta para a "Lista de Pedidos" em index.jsp, o filtro é interceptado para determinar se o usuário está conectado e, caso não esteja, pule para a página de login para o usuário fazer login.
Insira a descrição da imagem aqui

4.2.2 Com base no exemplo anterior, faça os seguintes 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 inicial: 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 Escrevendo um interceptor de login

@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 Efeito de demonstração

1) Acesse diretamente "Ver Lista de Pedidos" na página index.jsp
Insira a descrição da imagem aqui
2) Vá para a página de login e avise porque o usuário não está conectado
Insira a descrição da imagem aqui
3) Visualize os dados de impressão do console, observe e pense sobre o processo de retorno entre vários interceptores.
Insira a descrição da imagem aqui

4.3 Aplicação em outros cenários

1) Filtro de autenticação
2) Filtro de registro e auditoria
3) Filtro de conversão de imagem
4) Filtro de compressão de dados
5) Filtro criptografado

  Esta postagem de blog usa dois exemplos para se familiarizar com a função do Filtro no cenário de desenvolvimento real. Depois de se familiarizar com esses dois exemplos, a aplicação de outros cenários de negócios será implementada posteriormente.

5. Anexe o código-fonte completo

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

Acho que você gosta

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