jsp实现登录验证的过滤器

下面是关于“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日

相关文章

  • 常用Maven库,镜像库及maven/gradle配置(小结)

    关于“常用Maven库,镜像库及maven/gradle配置(小结)”的完整攻略,我们将从以下几个方面进行阐述: 常用Maven库的介绍 镜像库的作用 Maven/Gradle配置的步骤 示例演示 1.常用Maven库的介绍 常用Maven库是开发中使用频率较高的一些库,包括常用的Java类库、日志库、Spring框架等。其中一些常用的Maven库如下: j…

    Java 2023年5月20日
    00
  • java 对象数组排序

    Java对象数组排序攻略 在Java中,有时会使用对象数组来存储多个对象,对这些对象按照某个属性进行排序是很常见的需求。本攻略将介绍如何对Java对象数组进行排序。 一、对象数组排序的准备 首先,我们需要定义一个Java类来表示我们要排序的对象。这个Java类至少需要包含一个我们希望排序的属性,并实现Comparable接口。该接口有一个compareTo方…

    Java 2023年5月26日
    00
  • Java函数式编程(一):你好,Lambda表达式

    Java函数式编程(一):你好,Lambda表达式 函数式编程是什么? 函数式编程是一种编程范式,它强调将计算过程尽可能地写成若干个嵌套的函数调用,通过组合简单的函数形成较为复杂的计算。函数式编程的基本思想是将函数视为“一等公民”,即函数可以作为参数传递给其他函数,也可以作为返回值被其他函数返回。 为什么需要函数式编程? 函数式编程可以让我们写出更加简洁、可…

    Java 2023年5月26日
    00
  • Maven 的配置文件路径读取方法

    Maven 是一个流行的 Java 项目管理工具,它有一个核心的配置文件 pom.xml,用于管理项目的依赖、插件、构建目标等。除此之外,Maven 还有一些配置文件用于设置全局属性或指定仓库的位置等信息。下面我们来详细讲解 Maven 的配置文件路径读取方法。 1. Maven 配置文件路径 Maven 的配置文件路径分为两种类型:全局配置和用户配置。 全…

    Java 2023年5月20日
    00
  • Java实现MD5加密的方式与实例代码

    Java实现MD5加密的方式与实例代码 什么是MD5加密 MD5是一种常见的加密算法,主要用于对数据进行加密和校验。它可以将任意长度的消息变换成一个128位的消息摘要,用来保证信息传输完整性。 Java实现MD5加密的方式 Java中实现MD5加密,可以使用Java提供的MessageDigest类。该类允许应用程序通过调用update方法来处理数据,并使用…

    Java 2023年5月23日
    00
  • Java SpringBoot容器注入对象详解

    Java SpringBoot容器注入对象详解 在Java SpringBoot应用程序中,我们可以通过将对象注入到容器中来实现对象之间的依赖关系,这样就能够实现更好的代码复用和测试。 什么是容器注入 容器注入是一种通过容器来管理Java对象之间依赖关系的技术,也称为依赖注入(DI)。通过依赖注入,我们可以将一个对象或多个对象自动注入到另一个对象中,从而避免…

    Java 2023年5月19日
    00
  • 浅谈Java中FastJson的使用

    浅谈Java中FastJson的使用 什么是FastJson FastJson 是一个 Java 语言编写的高性能 JSON 处理器,但不仅仅是一个 JSON 库。它采用了一种名为 递归下降 的方式来实现 JSON 的解析,因此它的性能非常快。 在Java中,使用FastJson可以很方便地将java对象序列化与反序列化成json格式的字符串,支持按需解析,…

    Java 2023年5月26日
    00
  • Java实现的图像查看器完整实例

    针对“Java实现的图像查看器完整实例”的完整攻略,以下是详细的步骤: 1. 准备工作 首先,需要准备好开发所需要的环境和工具,主要包括: JDK:Java 开发环境,可以到 Oracle 官网下载; Eclipse:Java 开发工具,可以到 Eclipse 官网下载; Java Swing 包:Java 自带的 GUI 组件库,用于图形界面设计。 2. …

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