Struts拦截器实现拦截未登陆用户实例解析

Struts拦截器实现拦截未登录用户实例解析

什么是Struts拦截器?

Struts2拦截器是请求处理流程中的组件,它可以拦截一个请求和响应,也可以在一个请求被处理前或被处理后插入一些处理逻辑。对于网站的作者和开发人员来说,Struts2拦截器可以帮助我们快速构建一个完整的Web应用。

Struts拦截器如何实现拦截未登录用户?

Struts2开发框架允许开发者自定义拦截器,并且提供了一系列的拦截器接口用于自行接口。通过继承Struts2框架中的ActionSupport类及实现拦截器接口,我们可以在拦截器中实现用户登陆的检查逻辑,从而实现拦截未登录用户的目的。

下面是一个简单的实现未登录用户拦截的拦截器示例:

package com.example.interceptor;

import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.ActionContext;

/**
 * 实现用户登录验证的Struts2拦截器
 */
public class LoginInterceptor implements Interceptor {

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("LoginInterceptor destroy.");
    }

    @Override
    public void init() {
        System.out.println("LoginInterceptor init.");
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("LoginInterceptor intercept.");
        Map<String, Object> session = ActionContext.getContext().getSession();
        if (session.containsKey("loginUser")) {
            System.out.println("LoginInterceptor user has login.");
            return invocation.invoke(); // 已登录用户继续执行Action
        } else {
            System.out.println("LoginInterceptor user not login, redirect to login page.");
            return "login"; // 未登录用户跳转到登录页面
        }
    }
}

在上述代码中,我们通过实现Struts2的Interceptor接口,并重载其中的intercept方法实现了用户登录检查逻辑。在invocation.invoke()方法被调用时,表示已登录的用户,此时可以继续执行Action;但如果session中不包含登录用户的信息,那么我们将用户重定向到登录页面。

另一种示例代码

我们再来看一个更为完整的拦截未登录用户示例:

package com.example.interceptor;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.ActionContext;

/**
 * 实现用户登录验证的Struts2拦截器
 */
public class LoginInterceptor extends MethodFilterInterceptor {

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        // 取得请求
        HttpServletRequest request = ServletActionContext.getRequest();
        // 取得URL
        String url = request.getRequestURI();
        if (url.indexOf("login.action") > 0 || url.indexOf("register.action") > 0) {
            System.out.println("LoginInterceptor doIntercept, do not intercept for login or register action.");
            return invocation.invoke();// 登录和注册页面不拦截
        } else {
            System.out.println("LoginInterceptor doIntercept, intercept request.");
            // 取得Session
            Map<String, Object> session = ActionContext.getContext().getSession();
            // 判断Session中是否存在登录用户的标识
            if (session.containsKey("loginUser")) {
                System.out.println("LoginInterceptor user has login. Invoke action.");
                return invocation.invoke();// 已登录用户继续执行Action
            } else {
                // 未登录,重定向到登录页面
                System.out.println("LoginInterceptor user not login, redirect to login page.");
                return "login";
            }
        }
    }

}

在还没有解析代码之前,我们先来分析一下上述例子的流程。该拦截器从HttpServletRequest中获取当前请求的Uri,如果request中不包含login和register字段的url,那么我们判断当前Session中是否包含用户登录信息。如果存在,则表示用户已经登录,我们让请求继续执行;如果没有,则重定向到登录页面。

代码解析

上面的示例代码是一个更完整的拦截未登录用户的Demo,我们来逐行分析一下代码:

  1. 继承了Struts2的MethodFilterInterceptor拦截器,并override其中的doIntercept方法,完成对未登录用户进行拦截和重定向的操作。
  2. 我们把ActionContext中的Session取得,在Session中获取标识登录用户的信息。
  3. 检查Session是否包含key为"loginUser"的信息,如果有则表示用户已经登录,允许请求进入Action进行操作;如果没有,则表示用户没有登录,不允许我们继续操作,需要重定向到登录页面。
  4. 我们在此例中添加了对登录和注册Action的允许,避免对这些Action不必要的拦截。

总结

运用Struts2的拦截器功能,我们可以实现非常方便的拦截未登录用户,在进行会员操作时特别有用。通过Custom struts2 interceptor实现用户登录验证,无需在每个Action中写判断逻辑,充分体现了封装、抽象、继承等面向对象编程思想。

阅读剩余 61%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts拦截器实现拦截未登陆用户实例解析 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 用命令行编译java并生成可执行的jar包方法

    下面是使用命令行编译Java并生成可执行jar包的完整攻略: 确认Java环境已经部署 在开始之前,请先确认Java环境已经正确部署。可以在控制台执行java -version和javac -version命令,查看是否有正确的输出。如果没有,请先安装Java JDK。 编写Java代码 首先,需要编写一个Java程序。在本例中,我们将编写一个名为MyCla…

    Java 2023年5月20日
    00
  • springboot+mybatis通过实体类自动生成数据库表的方法

    下面我将详细讲解“springboot+mybatis通过实体类自动生成数据库表的方法”的完整攻略,其中会包含两个示例。 1. 引入依赖 首先,在工程的pom.xml文件中引入如下依赖: <!– Spring Boot 依赖 –> <dependency> <groupId>org.springframework.bo…

    Java 2023年5月20日
    00
  • Java 如何实现POST(x-www-form-urlencoded)请求

    实现POST(x-www-form-urlencoded)请求的过程如下所示: 构建URL和请求参数 创建URL对象和HttpURLConnection对象 设置请求头 写入请求参数 发起请求并接受服务器响应 以下为代码示例: 示例一 import java.net.*; import java.io.*; public class PostRequestE…

    Java 2023年5月19日
    00
  • Java中的递归方法示例介绍

    下面是我详细讲解“Java中的递归方法示例介绍”的完整攻略。 什么是递归方法 递归方法是指一个方法可以直接或者间接地调用自己的方法,这种方法通常用于解决那些可以被分割成几个同样情况的小问题的问题。 递归的基本原理是将一个大问题分割成若干具有相同解法的小问题,每个小问题又可以通过同一种方法进行进一步分解,直到最后可以解决这个问题或者其中一个问题。 在Java中…

    Java 2023年5月26日
    00
  • myeclipse中使用maven前常见错误及解决办法

    下面我将为您讲解“myeclipse中使用maven前常见错误及解决办法”的完整攻略。 一、MyEclipse中使用Maven的常见错误 找不到Maven依赖项 当使用Maven在MyEclipse中创建项目时,有时会遇到“找不到Maven依赖项”的错误。这可能是由于MyEclipse没有正确配置Maven的路径或者Maven本身存在问题。 无法从Maven…

    Java 2023年5月20日
    00
  • java连接orcale数据库示例分享

    下面是详细的攻略。 Java连接Oracle数据库 准备工作 在开始之前,我们需要确保已经完成以下准备工作: 安装Oracle数据库:在官网中下载并安装Oracle数据库,安装完成后配置好环境变量。 下载Oracle JDBC驱动:在官网中下载对应版本的JDBC驱动,将其复制到Java项目中。 示例1:使用JDBC API进行数据库操作 以下是连接Oracl…

    Java 2023年6月1日
    00
  • java生成jar包的方法

    生成 Java 的 JAR 包一般有两种方法,下面我会为你详细讲解。 方法一:通过命令行生成 JAR 包 首先,我们需要将我们的 Java 代码编译成字节码文件,使用下列代码将 “Example.java” 编译为 “Example.class”: javac Example.java 接下来,我们需要创建一个 MANIFEST.MF 文件。在此文件中需要包…

    Java 2023年5月19日
    00
  • Maven实战之搭建Maven私服和镜像的方法(图文)

    这里详细讲解一下“Maven实战之搭建Maven私服和镜像的方法(图文)”的完整攻略。 一、搭建Maven私服 1. 下载Nexus3 首先需要从Nexus3的官网上下载最新版的Nexus3,下载地址为:https://www.sonatype.com/nexus-repository-oss。 2. 安装Nexus3 下载完成后需要进行安装,具体步骤为解压…

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