java 使用过滤器实现登录拦截处理

yizhihongxing

Java使用过滤器实现登录拦截处理,可以基于Servlet的过滤器实现,这种方式可以在不改变原有代码的情况下实现权限控制等工作。具体操作步骤如下:

1.编写过滤器类

首先,需要编写一个类实现javax.servlet.Filter接口,实现对请求的拦截,并在其doFilter()方法中添加登录验证及权限控制等逻辑代码。示例代码如下:

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.HttpServletResponse;

public class LoginFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        // 过滤器初始化方法,可以在此处获取配置参数或初始化资源
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 判断用户是否已登录,未登录则重定向到登录页面
        if(request.getSession().getAttribute("user") == null) {
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return;
        }

        // 判断用户权限是否足够,不足则给予提示或重定向到无权限页面
        String uri = request.getRequestURI();
        if(uri.contains("/admin/") && request.getSession().getAttribute("role") != "admin") {
            response.sendRedirect(request.getContextPath() + "/no_permission.jsp");
            return;
        }

        // 如果用户已登录并权限足够,则放行请求
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {
        // 过滤器销毁方法,可以在此处释放资源
    }
}

在上述代码中,我们实现了LoginFilter类,实现了Filter接口并重写了其init()doFilter()destroy()方法。在doFilter()方法中,我们首先获取到了当前请求的HttpServletRequestHttpServletResponse对象,然后判断用户是否已登录,若未登录,则重定向到登录页面;随后判断用户的权限是否足够,若权限不足,则重定向到无权限页面;最后,如果用户已登录并权限足够,则放行请求。

2.配置web.xml

在过滤器类编写完成后,需要配置web.xml文件,将其注册为过滤器。示例代码如下:

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.example.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在上述代码中,我们首先定义了一个名为LoginFilter的过滤器,其类名为com.example.filter.LoginFilter;然后在filter-mapping标签中将过滤器与所有URL匹配上。这样,所有请求都会经过LoginFilter过滤器进行登录验证及权限控制。

3.编写登录页面

实现了过滤器后,我们需要编写一个登录页面用于用户登录,示例代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form action="${pageContext.request.contextPath}/login.do" method="post">
        <p>Username: <input type="text" name="username"></p>
        <p>Password: <input type="password" name="password"></p>
        <p><input type="submit" value="Login"></p>
    </form>
</body>
</html>

在上述代码中,我们定义了一个Html页面,包含一个表单,请求方式为POST,并指向了一个名为login.do的Servlet。在Servlet中,我们可以将用户输入的用户名和密码与数据库中存储的数据进行比对,若一致,则将用户信息存入Session中,登录成功;否则提示用户输入的用户名或密码不正确。

4.编写Servlet

登录页面编写完成后,我们需要编写一个Servlet,用于接收用户登录信息,示例代码如下:

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

public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 根据用户名和密码查询数据库,验证用户信息是否正确
        boolean isUserValid = checkUserValid(username, password);

        if(isUserValid) {
            // 用户信息正确,则将用户信息存入Session中,设置用户已登录,跳转至首页
            HttpSession session = request.getSession();
            session.setAttribute("user", username);
            session.setAttribute("role", "admin"); // 也可以根据用户名从数据库中查询用户的角色
            response.sendRedirect(request.getContextPath() + "/index.jsp");
        } else {
            // 用户信息不正确,则给予提示信息,并重定向回登录页面
            request.setAttribute("errorMsg", "Invalid username or password");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }

    private boolean checkUserValid(String username, String password) {
        // 查询数据库,比对用户名和密码
        return true; // 在此处应在数据库中查询用户信息,并比对用户名和密码,返回true或false
    }
}

在上述代码中,我们定义了一个Servlet,用于接收前端页面传来的请求,获取用户名和密码,并与数据库存储的信息进行比对。若比对成功,则将用户信息存储到Session中,并跳转到首页;若比对失败,则给予相应的提示信息,并重定向回登录页面。

5.测试登录拦截功能

所有代码编写完成后,我们需要测试一下登录拦截的功能是否生效。首先,我们访问一个需要登录的页面,验证过滤器是否能够拦截未登录的用户并重定向到登录页面;然后,用正确的用户名和密码登录系统,验证过滤器能否正确放行登录用户的请求;最后,我们使用错误的用户名或密码登录系统,验证过滤器是否能够正确重定向到登录页面,并提示用户登录信息不正确。

以上就是Java使用过滤器实现登录拦截处理的完整攻略,其中包含了编写过滤器、配置web.xml、编写登录页面、编写Servlet和测试登录拦截功能等所有步骤。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 使用过滤器实现登录拦截处理 - Python技术站

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

相关文章

  • js如何获取兄弟、父类等节点

    获取兄弟节点:要获取兄弟节点,可以使用nextSibling和previousSibling属性。这两个属性分别代表下一个兄弟节点和上一个兄弟节点。需要注意的是,这两个属性获取到的节点可能是文本节点,而不是我们想要的HTML元素节点,所以我们需要进行判断。如果是文本节点,则继续获取下一个(或上一个)节点,直到获取到的节点是一个元素节点。 示例代码: <…

    other 2023年6月27日
    00
  • 魔兽世界6.1暗牧属性优先级输出循环 wow6.1暗牧攻略

    魔兽世界6.1暗牧属性优先级输出循环攻略 1. 简介 在魔兽世界6.1版本中,暗牧(暗影牧师)是一种强大的法术输出职业。本攻略将解释暗牧的属性优先级和输出循环,帮助玩家在战斗中最大化输出。 2. 属性优先级 暗牧输出的效果受到多个属性的影响。下面是暗牧属性的优先级排列(从高到低): 精神(Spirit):提高法力恢复速度。 智力(Intellect):提高法…

    other 2023年6月28日
    00
  • 3Dmax初始化失败一直停留在initializing界面该怎么办?

    首先,3Dmax初始化失败一直停留在initializing界面可能由以下原因导致: 应用程序文件受损或缺失; 3Dmax所需的系统文件损坏或缺失; 3Dmax版本与操作系统不兼容; 显卡驱动不兼容; 显卡失败等。 为了解决这个问题,我们可以使用以下方法: 方法一:删除配置文件 步骤1:按下窗口键和R键,打开运行窗口。 步骤2:输入%LOCALAPPDATA…

    other 2023年6月20日
    00
  • Git的基础文件操作初始化查看添加提交示例教程

    好的。首先,我们需要了解Git是什么,它的基本概念以及工作原理,然后再来学习如何进行基础文件操作。 Git的基本概念和工作原理 Git是一种分布式版本控制系统,可以帮助我们跟踪代码的变化,管理代码的版本,协同开发等。Git有三个基本区域:工作区、暂存区和本地仓库。其中,工作区是我们平常编写代码的地方,暂存区用于暂存我们需要提交的文件,本地仓库是存储我们提交的…

    other 2023年6月20日
    00
  • C++实现LeetCode(108.将有序数组转为二叉搜索树)

    C++实现LeetCode(108.将有序数组转为二叉搜索树)攻略 题目描述 给定一个有序整数数组,转换为高度平衡的二叉搜索树。 示例 1: 输入: [-10,-3,0,5,9] 输出: 0 / \ -3 9 / / -10 5 示例 2: 输入: [1,3] 输出: 3 / 1 题目分析 这道题目需要将有序整数数组转换为二叉搜索树,要求转换后的二叉树是平衡…

    other 2023年6月27日
    00
  • 关于JavaScript数组去重的一些理解汇总

    关于JavaScript数组去重的一些理解汇总 JavaScript数组去重是前端开发中一个常见的需求,本文将从以下几个方面对JavaScript数组去重进行详细的讲解和总结: 使用ES6 Set去重 使用ES5 filter方法去重 对比两种方法的优缺点 使用ES6 Set去重 ES6引入了Set来解决数组去重问题,Set是一种对象类型,它允许我们存储任何…

    other 2023年6月27日
    00
  • win10系统的“usb选择性暂停设置”怎么打开

    在Win10系统中,USB选择性暂停是一种省电功能,可以在不使用USB设备时将其暂停,以节省电力。以下是打开Win10系统的USB选择性暂停设置的攻略: 打开电源选项设置 首先,我们需要打开电源选项设置。可以使用以下步骤打开电源选项设置: 在Windows搜索栏中输入“电源选项”,并选择“电源选项设置”。 在电源选项设置窗口中,单击“更改计划设置”按钮。 在…

    other 2023年5月8日
    00
  • 什么是操作系统

    什么是操作系统? 操作系统(Operating System,简称 OS)是一种控制计算机硬件和软件资源的程序集合,它是计算机系统中最基本的系统软件。操作系统提供了操作计算机所必须的各种服务,如用户管理、内存管理、文件管理、进程管理、设备管理等等。 操作系统的功能 按照常见的分类方式,操作系统具有以下主要功能: 进程管理:进程是计算机中正在执行的程序实例,在…

    其他 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部