jsp实现登录验证的过滤器

yizhihongxing

下面是关于“jsp实现登录验证的过滤器”的完整攻略:

一、过滤器的介绍

过滤器是Servlet 2.3版本之后新增的一种组件。其作用是在客户端发送请求到Servlet之前或者在Servlet响应客户端请求之后,对请求和响应进行拦截和处理。过滤器可以拦截多个Servlet,因此可以将与特定任务相关的处理放在一个过滤器中进行处理,提高程序的可维护性和可重用性。

二、过滤器的实现

在JSP中实现登录验证过滤器的过程,可以分为以下步骤:

1. 编写过滤器类

Java Web应用程序的src目录下,新建一个名为LoginFilter.java的文件,编写过滤器类。具体代码如下所示:

package com.example.filter;

import java.io.IOException;
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.HttpSession;

/**
 * 登录验证过滤器
 */
public class LoginFilter implements Filter {

    private FilterConfig config;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession session = request.getSession(false);// 获取当前请求所对应的会话,如果会话不存在则返回null

        String uri = request.getRequestURI(); // 获取客户端请求的资源标识符(URI)

        // 如果该请求是登录界面的请求,或者用户已经登录,则将请求交由下一个过滤器处理
        if ("/login.jsp".equals(uri) || (session != null && session.getAttribute("user") != null)) {
            chain.doFilter(request, resp);
        } else {
            // 否则重定向到登录界面
            resp.sendRedirect(request.getContextPath() + "/login.jsp");//有两个斜杠,一个斜杠表示的是项目根路径,第二个表示的是相对//。具体来说,/login.jsp实际上表示的是“当前Web应用程序的根路径/login.jsp”
        }
    }

    @Override
    public void destroy() {
        this.config = null;
    }
}

在该类中,我们重写了三个方法:

  • init方法:在过滤器被初始化时调用,可以获取FilterConfig对象,该对象用于从web.xml文件中获取过滤器的初始化参数。
  • doFilter方法:拦截客户端发送的HTTP请求和Servlet响应的HTTP请求,进行验证操作的核心逻辑在此方法中执行。
  • destroy方法:在过滤器被销毁时调用,可以释放资源和进行清理操作。

2. 在web.xml文件中配置过滤器

在Java Web应用程序的web目录下,打开web.xml文件,在节点下添加等标签。具体代码如下所示:

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.example.filter.LoginFilter</filter-class>
    <init-param>
        <param-name>excludeUrls</param-name>
        <param-value>.jsp,.js,.css</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • 标签:定义一个过滤器。
  • 标签:定义过滤器的名字。
  • 标签:定义过滤器的类名。
  • 标签:定义过滤器的初始化参数。
  • 标签:定义需要拦截的URL模式。

3. 编写登录界面

我们需要在Java Web应用程序中编写一个用于登录验证的页面。页面中包含两个表单元素:username和password。具体代码如下所示:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/LoginServlet"
          method="POST">
        Username: <input type="text" name="username" required><br>
        Password: <input type="password" name="password" required><br>
        <input type="submit" value="Login">
    </form>
</body>
</html>

4. 编写登录Servlet

我们需要在Java Web应用程序中编写一个Servlet,用于处理用户登录请求。具体代码如下所示:

package com.example.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("admin".equals(username) && "admin123".equals(password)) {
            // 如果用户名和密码正确,创建一个新的会话
            HttpSession session = request.getSession();
            // 将用户信息存储到会话中
            session.setAttribute("user", username);
            // 将用户重定向到index.jsp页面
            response.sendRedirect(request.getContextPath() + "/index.jsp");
        } else {
            // 如果用户名或密码错误,将用户重定向到登录界面并提示用户错误信息
            response.sendRedirect(request.getContextPath() + "/login.jsp?error=true");
        }
    }

}

在该类中,我们重写了doGet方法和doPost方法,分别用于处理GET和POST请求。在处理POST请求时,我们获取用户名和密码,并进行验证。如果验证通过,将用户信息存储到会话中,然后将用户重定向到index.jsp页面。如果验证失败,将用户重定向到登录界面,并提示用户错误信息。

5. 编写index.jsp页面

我们需要在Java Web应用程序中编写一个index.jsp页面,用于展示用户信息。具体代码如下所示:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Index Page</title>
</head>
<body>
    <h1>Welcome ${sessionScope.user}!</h1>
    <a href="${pageContext.request.contextPath}/LogoutServlet">Logout</a>
</body>
</html>

在该页面中,我们使用EL表达式获取在会话中存储的用户信息,并用于展示用户信息的功能。同时,我们在页面中添加一个“Logout”链接,用于处理用户登出请求。

6. 编写登出Servlet

我们需要在Java Web应用程序中编写一个Servlet,用于处理用户登出请求。具体代码如下所示:

package com.example.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LogoutServlet
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public LogoutServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取当前请求所对应的会话
        HttpSession session = request.getSession(false);
        if (session != null) {
            // 如果会话存在,则将会话失效
            session.invalidate();
        }
        // 重定向到登录页面
        response.sendRedirect(request.getContextPath() + "/login.jsp");
    }

}

在该类中,我们同样重写了doGet方法和doPost方法,分别用于处理GET和POST请求。在处理请求时,我们获取当前请求所对应的会话,并将会话失效。然后将用户重定向到登录页面。

三、示例说明

下面给出两个示例说明:

示例一

假设Java Web应用程序的安装路径为:C:/webapp,在该目录下新建一个名为“login.jsp”的文件,内容如下所示:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/LoginServlet"
          method="POST">
        Username: <input type="text" name="username" required><br>
        Password: <input type="password" name="password" required><br>
        <input type="submit" value="Login">
    </form>
</body>
</html>

然后在该目录下新建一个名为“WEB-INF”的文件夹,该文件夹用于存放编译后的class文件和Web应用程序配置文件。在“WEB-INF”目录下新建一个名为“web.xml”的文件,配置如下所示:

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID"
         version="3.0">
    <display-name>loginweb</display-name>
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.example.filter.LoginFilter</filter-class>
        <init-param>
            <param-name>excludeUrls</param-name>
            <param-value>.jsp,.js,.css</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.example.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.example.servlet.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/LogoutServlet</url-pattern>
    </servlet-mapping>
</web-app>

在“src”目录下新建一个名为“com.example.filter”的包,该包用于存放过滤器类。在该包下新建一个名为“LoginFilter.java”的文件,内容如下所示:

package com.example.filter;

import java.io.IOException;
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.HttpSession;

/**
 * 登录验证过滤器
 */
public class LoginFilter implements Filter {

    private FilterConfig config;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession session = request.getSession(false);

        String uri = request.getRequestURI();

        if ("/login.jsp".equals(uri) || (session != null && session.getAttribute("user") != null)) {
            chain.doFilter(request, resp);
        } else {
            resp.sendRedirect(request.getContextPath() + "/login.jsp");
        }
    }

    @Override
    public void destroy() {
        this.config = null;
    }
}

在“src”目录下新建一个名为“com.example.servlet”的包,该包用于存放Servlet类。在该包下新建一个名为“LoginServlet.java”的文件,内容如下所示:

package com.example.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("admin".equals(username) && "admin123".equals(password)) {
            HttpSession session = request.getSession();
            session.setAttribute("user", username);
            response.sendRedirect(request.getContextPath() + "/index.jsp");
        } else {
            response.sendRedirect(request.getContextPath() + "/login.jsp?error=true");
        }
    }

}

在“src”目录下新建一个名为“com.example.servlet”的包,该包用于存放Servlet类。在该包下新建一个名为“LogoutServlet.java”的文件,内容如下所示:

package com.example.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class LogoutServlet
 */
@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public LogoutServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
        response.sendRedirect(request.getContextPath() + "/login.jsp");
    }

}

在完成以上步骤后,将Java Web应用程序部署在Tomcat或其他Web服务器上,在浏览器中访问http://localhost:8080/login.jsp即可打开登录界面进行登录。登录成功后,将跳转到index.jsp页面并展示当前登录用户的用户名。在index.jsp页面中,点击“Logout”链接即可退出登录。

示例二

我们还可以进一步优化上面的示例一,让登录界面只有在用户尚未登录或登录失败时才显示错误信息。具体做法是在登录验证过滤器中添加一段代码,将与错误信息相关的会话属性从会话对象中删除。具体代码如下所示:

if ("/login.jsp".equals(uri) || (session != null && session.getAttribute("user") != null)) {
    if (session != null && session.getAttribute("loginError") != null) {
        // 如果用户已经登录,或者登录失败但未进行重定向,则删除与错误信息相关的会话属性
        session.removeAttribute("loginError");
    }
    chain.doFilter(request, response);
} else {
    if (session != null) {
        session.setAttribute("loginError", "Please login first.");
    }
    resp.sendRedirect(request.getContextPath() + "/login.jsp");
}

在登录Servlet中,我们同样需要删除与错误信息相关的会话属性。具体代码如下所示:

```
response.sendRedirect(request.getContextPath() + "/login.jsp?error=true");
session.setAttribute("loginError", "Username or password is incorrect

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jsp实现登录验证的过滤器 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 一篇文章带你入门Java UML的类图

    下面我将为您详细讲解“一篇文章带你入门Java UML的类图”的完整攻略。 简介 Java UML是Java开发中必不可少的一部分,它可以帮助开发者对Java程序进行设计、开发和维护。其中类图是Java UML的重要组成部分。类图是一种描述类、接口、实现和它们之间关系的图形化方式。 步骤 下面我将向您介绍如何使用Java UML的类图进行Java编程: 1.…

    Java 2023年5月24日
    00
  • Spring Boot(四)之使用JWT和Spring Security保护REST API

    下面是关于Spring Boot如何使用JWT和Spring Security保护REST API的攻略: 什么是JWT? JSON Web Token(JWT)是一种开放标准(RFC 7519),用于通过网络在各方之间安全地传输声明。JSON Web Token是由三部分组成:标题,声明和签名。例如: eyJhbGciOiJIUzI1NiIsInR5cCI…

    Java 2023年5月20日
    00
  • Java Maven高级之插件开发详解

    Java Maven高级之插件开发详解 什么是Maven插件 Maven插件是Maven框架中的一种机制,它通过扩展Maven的功能来满足个性化的需求。本质上,Maven插件就是一个打包好的jar包,它定义了自己的goal,当我们执行Maven命令时,可以通过指定goal来触发插件的执行。 Maven插件的类型 Maven插件可以分为两种:build插件和r…

    Java 2023年5月20日
    00
  • javascript实现留言板功能

    下面是“JavaScript实现留言板功能”的完整攻略。首先,需要进行以下几个步骤: 步骤一:创建HTML页面 首先需要创建一个基本的HTML页面结构。在该页面中需要设置一个textarea、一个提交按钮和一个显示留言的区域。代码示例如下: <!DOCTYPE html> <html lang="en"> <…

    Java 2023年6月15日
    00
  • DBeaver连接mysql和oracle数据库图文教程

    DBeaver连接MySQL数据库图文教程 安装与配置 下载并安装DBeaver:从DBeaver官网下载并安装DBeaver。 安装MySQL驱动:打开DBeaver,在“Database”菜单中选择“Driver Manager”,在弹出的窗口中选择MySQL,点击“Download/Update”按钮下载MySQL驱动,并按照提示进行安装。 创建连接:…

    Java 2023年6月16日
    00
  • Spring Boot深入学习数据访问之Spring Data JPA与Hibernate的应用

    Spring Boot深入学习数据访问之Spring Data JPA与Hibernate的应用 什么是Spring Data JPA? Spring Data JPA 是 Spring Data 一个子数据访问项目,该项目基于Spring框架为开发人员提供了一个基于JPA的工具包,方便开发人员使用JPA来访问数据库。 Spring Boot 中使用Spri…

    Java 2023年5月19日
    00
  • IDEA 非常重要的一些设置项(一连串的问题差点让我重新用回 Eclipse)

    下面是“IDEA 非常重要的一些设置项”的完整攻略。 1. 自动导入包的设置 开发中,我们需要使用很多的类。在使用类的时候,IDEA 会自动提示我们需要导入的包。但是,如果包的数量很多,我们可能会忘记导入某些包。 为了避免这种情况,我们可以设置 IDEA 在自动提示需要导入的包时,自动导入缺少的包。在 IDEA 的设置中,点击 Editor > Gen…

    Java 2023年5月20日
    00
  • SpringBoot整合Mybatis简单实现增删改查

    下面是关于SpringBoot整合Mybatis实现增删改查的详细攻略: 1. 环境搭建 在开始之前,你需要在本地安装好以下软件: JDK 1.8或以上版本 Maven MySQL数据库 在安装好上述软件后,你可以新建一个SpringBoot项目,这里使用的是IntelliJ IDEA,你可以通过IDEA创建SpringBoot项目并选择添加Mybatis …

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部