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日

相关文章

  • SpringMVC+MyBatis分页(最新)

    以下是关于“SpringMVC+MyBatis分页(最新)”的完整攻略,其中包含两个示例。 1. 前言 在Web应用程序中,分页是一种常见的需求。在SpringMVC和MyBatis中,可以使用PageHelper插件来实现分页。本攻略将详细讲解如何使用SpringMVC和MyBatis实现分页。 2. 添加PageHelper依赖 在使用PageHelpe…

    Java 2023年5月16日
    00
  • java springmvc实现验证码功能

    下面是Java SpringMVC实现验证码功能的攻略。 一、前置知识 在实现验证码功能前,我们需要先了解一些前置知识: Java基础语法 SpringMVC框架 Spring Security框架 Maven项目管理工具 二、添加依赖 在实现验证码功能前,我们需要先添加pom文件中的依赖: <!– 添加验证码依赖 –> <depend…

    Java 2023年6月15日
    00
  • 浅谈jsp中的9个隐含对象

    接下来我将为大家详细讲解“浅谈JSP中的9个隐含对象”的完整攻略。 1. JSP的9个隐含对象 在JSP页面中,有9个隐含对象,他们分别是: request:表示客户端发来的请求,被封装成了request对象,在JSP页面中可以通过request对象访问请求中的参数信息。 response:表示服务器对请求做出的响应,被封装成了response对象,在JSP…

    Java 2023年6月15日
    00
  • JSP + ajax实现输入框自动补全功能 实例代码

    下面是详细的攻略: 1. 需求分析 我们需要实现一个输入框自动补全的功能,即当用户在输入框中输入文字时,能够实时推荐可能的匹配结果。因此,我们需要使用ajax技术,实现在输入框输入字符时动态加载匹配的数据。 2. 技术栈 JSP:Java服务器页面,用于生成动态网页; ajax:用于异步加载数据,对局部网页内容进行更新; 3. 实现步骤 3.1 创建JSP页…

    Java 2023年6月15日
    00
  • Maven管理SpringBoot Profile详解

    Maven管理SpringBoot Profile详解 简介 Spring Boot是一款基于Spring框架,更快地启动、开发和部署单独的Java应用程序的工具。在使用Spring Boot的过程中,我们经常需要使用到不同的配置和环境,而这些配置和环境可以通过Profile的方式进行管理。 本文将讲解如何利用Maven对Spring Boot的Profil…

    Java 2023年5月19日
    00
  • PostMan post请求发送Json数据的方法

    PostMan是一款非常常用的API测试工具,可以轻松模拟请求并测试API接口。在许多情况下,我们需要发送JSON格式的数据来进行API测试。下面介绍在PostMan中如何使用post请求发送JSON数据的方法。 步骤一:打开PostMan 首先,打开PostMan并创建一个新的请求。 步骤二:选择Post请求 在请求建立之后,需要确保选择的请求类型是Pos…

    Java 2023年5月26日
    00
  • java LeetCode普通字符串模拟题解示例

    Java LeetCode普通字符串模拟题解示例攻略 1. 题目简述 本题是一道字符串模拟题目,要求实现一个String模拟类,具有以下功能: 初始化操作:构造函数接受一个字符串作为参数,将其存储在对象中。 获取字符串操作:实现一个charAt方法,接受一个整数索引index,返回字符串指定位置的字符;实现一个substring方法,接受两个整数索引star…

    Java 2023年5月19日
    00
  • SpringBoot2 整合 ClickHouse数据库案例解析

    下面我将为你详细讲解如何实现SpringBoot2整合ClickHouse数据库的步骤。 准备工作 安装ClickHouse数据库 创建一个SpringBoot2项目 添加依赖 在SpringBoot2项目的pom.xml文件中添加ClickHouse驱动依赖: <dependency> <groupId>cc.blynk</g…

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