struts2与cookie 实现自动登录和验证码验证实现代码

实现自动登录和验证码验证是网站开发中比较常见的需求。在 Struts2 中,可以通过 Cookie 实现自动登录,在用户下次访问网站时,可以直接读取 Cookie 中的登录信息,将用户登录状态自动恢复。验证码则是为了保证网站的安全性,防止自动化程序暴力攻击登录页面。下面介绍基于 Struts2 框架的自动登录和验证码验证的实现方法。

自动登录实现方法

在用户登录成功之后,将登录信息保存到 Cookie 中。下次用户访问网站时,检查 Cookie 中是否存在登录信息,如果存在,则直接恢复用户登录状态。

保存登录信息到 Cookie

在登录成功之后,可以将用户名和密码保存到 Cookie 中。这里为了安全考虑,建议保存用户名和一个加密后的密码串。

public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    // 省略其他代码

    public String login() {
        // 登录验证代码

        // 保存登录信息到 Cookie 中
        Cookie usernameCookie = new Cookie("username", URLEncoder.encode(username, "UTF-8"));
        Cookie passwordCookie = new Cookie("password", URLEncoder.encode(encryptPassword(password), "UTF-8"));
        // 设置 Cookie 的过期时间为一天
        usernameCookie.setMaxAge(86400);
        passwordCookie.setMaxAge(86400);

        ServletActionContext.getResponse().addCookie(usernameCookie);
        ServletActionContext.getResponse().addCookie(passwordCookie);
        return SUCCESS;
    }

    private String encryptPassword(String password) {
        // TODO: 对密码进行加密
        return password;
    }
}

恢复自动登录状态

在用户访问网站时,可以检查 Cookie 中是否存在登录信息,如果存在,则自动登录。这里需要验证保存在 Cookie 中的用户名和密码是否正确。

public class AutoLoginInterceptor extends MethodFilterInterceptor {
    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();

        String username = null;
        String password = null;

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("username".equals(cookie.getName())) {
                    username = URLDecoder.decode(cookie.getValue(), "UTF-8");
                } else if ("password".equals(cookie.getName())) {
                    password = URLDecoder.decode(cookie.getValue(), "UTF-8");
                }
            }
        }

        if (username != null && password != null) {
            // TODO: 校验用户名和密码是否正确,正确则自动登录
        }

        return invocation.invoke();
    }
}

验证码验证实现方法

验证码是为了防止自动化程序暴力攻击登录页面,防止账户被恶意破解。在用户提交登录表单之前,需要生成验证码,并将验证码显示在页面上。用户在填写完用户名和密码之后,还需要填写验证码,并提交验证码进行校验。如果验证码输入正确,则可以进行登录操作。

生成验证码

生成验证码可以使用开源的 Java Web 应用程序框架 Struts2 自带的验证码插件,将验证码生成代码放在登录表单页面中。

<s:form action="login" method="post">
  <s:textfield name="username" label="用户名"/>
  <s:password name="password" label="密码"/>
  <s:image name="captchaImage" value="%{generateCaptcha}" id="captchaImage" alt="验证码"/>
  <s:textfield name="captcha" label="验证码"/>
  <s:submit value="登录"/>
</s:form>
public class LoginAction extends ActionSupport implements CaptchaAware {
    private String username;
    private String password;
    private String captcha;
    private String captchaImage;

    public String generateCaptcha() {
        captchaImage = CaptchaUtil.generateCaptchaImage(getSession());
        return "captchaImage";
    }

    // 省略其他代码
}

验证验证码

在用户提交登录表单之前,需要校验验证码是否正确。验证码校验代码可以放在拦截器中。

public class CaptchaInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();

        // 验证码校验
        String captcha = request.getParameter("captcha");
        if (!CaptchaUtil.matchesCaptcha(getSession(), captcha)) {
            // 验证码不正确,返回错误提示
            addActionError("验证码错误");
            return Action.LOGIN;
        }

        return invocation.invoke();
    }
}

示例代码

这里提供了两个示例代码,可以放在 Struts2 的配置文件 struts.xml 中使用。

自动登录示例代码

<package name="example" namespace="/" extends="struts-default">
    <interceptors>
        <interceptor name="autoLogin" class="example.AutoLoginInterceptor"/>

        <interceptor-stack name="stack1">
            <interceptor-ref name="autoLogin"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="stack1"/>

    <action name="login" class="example.LoginAction">
        <result name="success">/index.jsp</result>
        <result name="input">/login.jsp</result>
    </action>
</package>

验证码验证示例代码

<package name="example" namespace="/" extends="struts-default">
    <interceptors>
        <interceptor name="captcha" class="example.CaptchaInterceptor"/>

        <interceptor-stack name="stack1">
            <interceptor-ref name="captcha"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="stack1"/>

    <action name="login" class="example.LoginAction">
        <result name="success">/index.jsp</result>
        <result name="input">/login.jsp</result>
    </action>
</package>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:struts2与cookie 实现自动登录和验证码验证实现代码 - Python技术站

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

相关文章

  • SpringBoot深入分析webmvc和webflux的区别

    下面是关于“SpringBoot深入分析webmvc和webflux的区别”的完整攻略,包含两个示例说明。 SpringBoot深入分析webmvc和webflux的区别 SpringBoot是一个流行的Java开发框架,它提供了许多功能和特性来简化Java应用程序的开发。其中,SpringBoot的Web框架有两种选择:webmvc和webflux。本文将…

    Java 2023年5月17日
    00
  • Java中字符数组、String类、StringBuffer三者之间相互转换

    Java中字符数组、String类、StringBuffer三者之间可以互相转换,下面分别介绍其转换方法。 1、字符数组与String类之间的转换 1.1、字符数组转String char[] charArray = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’}; String str = new String(charArray); 1.2、Stri…

    Java 2023年5月27日
    00
  • JDK14性能管理工具之jstack使用介绍

    JDK14性能管理工具之jstack使用介绍 简介 jstack 是 JDK 自带的一款性能分析工具,可以用来查看 Java 进程中每个线程的状态、堆栈信息等,来帮助我们定位问题并进行性能分析。 jstack 命令语法 jstack 的使用非常简单,语法如下: jstack [ option ] <pid> 其中,option 表示可选参数, 表…

    Java 2023年5月26日
    00
  • string类和LocalDateTime的相互转换方式

    下面是详细讲解“string类和LocalDateTime的相互转换方式”的完整攻略。 string类和LocalDateTime的相互转换方式 在Java编程中,因为工作所需,我们经常需要将String类型的数据和LocalDateTime类型的数据进行相互转换。在这里,我将为大家介绍基于Java8的两种常用的字符串与LocalDateTime之间的相互转…

    Java 2023年6月1日
    00
  • JAVA 对象创建与对象克隆

    JAVA 对象创建与对象克隆 在 Java 中,对象创建与对象克隆是非常重要的知识点。 对象创建 Java 中的对象常见的有以下几种创建方式: 使用 new 关键字 使用 new 关键字创建对象是最常见的一种方式,通过这种方式创建出来的对象是一个新的对象实例,具有独立的地址空间。例子如下: public class Person { private Stri…

    Java 2023年5月26日
    00
  • Spring依赖注入(DI)两种方式的示例详解

    下面我将为你详细讲解“Spring依赖注入(DI)两种方式的示例详解”的完整攻略。 1. 什么是Spring依赖注入(DI) Spring依赖注入(Dependency Injection,简称 DI)是指一个对象依赖于另一个对象。通俗一些的说法就是对象 A 需要对象 B 的协助完成某些功能,但是对象 A 并不负责创建对象 B,而是由 Spring 容器来创…

    Java 2023年5月20日
    00
  • Spring源码:Bean的生命周期(二)

    前言 让我们继续讲解Spring的Bean实例化过程。在上一节中,我们已经讲解了Spring是如何将Bean定义加入到IoC容器中,并使用合并的Bean定义来包装原始的Bean定义。接下来,我们将继续讲解Spring的 getBean() 方法,特别是针对 FactoryBean 的解析。 在 getBean() 方法中,Spring还支持对 Factory…

    Java 2023年5月1日
    00
  • java获取两个数组中不同数据的方法

    下面是讲解“java获取两个数组中不同数据的方法”的攻略: 概述 有时候,我们需要比较两个数组,找出它们中的不同数据。Java中有多种方式可以实现这个目的,例如使用循环遍历、使用Set集合、使用Stream API等等。接下来,我们将逐一介绍这些方法的使用,同时给出示例说明。 方法一:循环遍历法 这种方法时常使用,它需要用到两个嵌套循环来比较两个数组中的每一…

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