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中写判断逻辑,充分体现了封装、抽象、继承等面向对象编程思想。

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

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

相关文章

  • Java Web中Ajax技术使用方法介绍

    JavaWeb中Ajax技术使用方法介绍 什么是Ajax Ajax全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML。 在Java Web中,Ajax可以让前端页面异步地向后台Java Servlet/Controller发送请求,获取响应数据,更新页面的部分内容,从而提升用户交互的体验。 使用Ajax…

    Java 2023年5月26日
    00
  • Java面试题冲刺第八天–Spring框架2

    Java面试题冲刺第八天–Spring框架2 本文将详细讲解Java面试题冲刺第八天–Spring框架2的完整攻略,包括Spring框架的概述、Spring框架的核心模块、Spring框架的优点、Spring框架的示例说明等。 Spring框架的概述 Spring框架是一个轻量级的Java开发框架,它提供了一系列的工具和框架,用于简化Java开发过程中的…

    Java 2023年5月18日
    00
  • jsp测试函数的运行速度方法

    当我们需要测试一个JSP函数的运行速度时,一种简单有效的方法是使用Java的System.currentTimeMillis()方法,通过计算函数的开始和结束时间来统计函数的执行时间。 下面是实现方法的步骤: 第一步:定义方法 首先,我们需要为即将进行测试的函数添加一个计时器,以便在函数执行开始和结束时记录时间。可以添加一个名为“currentTime”的变…

    Java 2023年6月15日
    00
  • Java毕业设计实战之平行志愿管理系统的实现

    Java毕业设计实战之平行志愿管理系统的实现 一、前言 学习 Java 语言可以说是计算机专业必修的课程,也是众多计算机专业学生的热门课程之一。而毕业设计这一任务则是考核学生对所学课程的掌握程度以及综合运用的能力,于是一个好的毕业设计题目尤为重要,而平行志愿管理系统则是一个非常不错的选择。 二、系统要求 设计一个平行志愿管理系统,管理员登录后可以对平行志愿的…

    Java 2023年5月31日
    00
  • Spring相关知识点的总结与梳理

    针对“spring相关知识点的总结与梳理”,我将给出相应的攻略,包括以下方面: spring framework基础知识概述 spring framework常用模块介绍 spring boot应用开发流程 spring cloud微服务架构配置 案例说明 1. Spring framework基础知识概述 Spring framework是一个轻量级、开源…

    Java 2023年5月31日
    00
  • ajax无刷新分页的简单实现

    实现ajax无刷新分页,需要以下步骤: 步骤一:用ajax获取数据 首先,需要在页面上设置一个分页元素,比如一个分页按钮或者数字列表,当用户点击分页元素时,通过ajax向服务器获取数据。在调用ajax的过程中,需要设定请求方式、请求地址、数据类型等参数,其中请求地址需要根据当前分页数计算。 以下是一个示例代码: $(function() { // 设置分页元…

    Java 2023年5月31日
    00
  • 浅析java中print和println的区别

    浅析Java中print和println的区别 简介 在Java中,print和println是两个常用的输出语句,用于将内容输出到控制台。虽然它们看起来相似,但实际上它们有一些重要的区别。 本文将详细讲解print和println两个输出语句的区别,并通过示例加以说明。 区别 print Java中的print语句用于将给定的文本字符串打印到控制台。它不会…

    Java 2023年5月26日
    00
  • Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)

    AngularJS提供了丰富的表单验证指令,可以轻松实现对用户输入的校验,以保证数据的准确性和完整性。 失去焦点验证 AngularJS通过ng-blur指令可以很方便地实现失去焦点时的表单验证。具体步骤如下: 在HTML表单元素上添加相应的验证指令,如ng-pattern、ng-minlength、ng-maxlength等; 添加一个提示信息的元素或指令…

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