Eu uso o código para ensinar a você: 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
3. Solução de fluxograma de execução de filtro
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.
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
Formulário de login: Formulário de inscrição:
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,
conforme mostrado abaixo:
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.
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
2) Vá para a página de login e avise porque o usuário não está conectado
3) Visualize os dados de impressão do console, observe e pense sobre o processo de retorno entre vários interceptores.
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.