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日

相关文章

  • SSM项目中使用拦截器和过滤器的实现示例

    下面是使用拦截器和过滤器的实现示例的攻略: 拦截器和过滤器的作用 拦截器和过滤器都是Web开发中常用的组件,在SSM项目中也可以使用它们来做许多事情,比如: 对用户请求进行预处理和后处理,比如登录验证、权限验证、日志记录等; 对用户请求进行拦截和过滤,比如防止一些不安全的请求、过滤一些敏感信息等; 修改用户请求或响应,比如对请求或响应头进行修改、对请求或响应…

    Java 2023年6月15日
    00
  • Java如何替换第一个和最后一个字符串

    要替换Java字符串中的第一个和最后一个字符串,我们可以使用Java中的replaceFirst()和replaceLast()函数。 replaceFirst()函数将替换第一个匹配的字符串,而replaceLast()函数将替换最后一个匹配的字符串。 以下是替换Java字符串中第一个和最后一个字符串的完整攻略: 1. 替换第一个字符串 可以使用repla…

    Java 2023年5月27日
    00
  • php好代码风格的阶段性总结

    PHP好代码风格的阶段性总结 为什么需要好的代码风格 良好的代码风格可以方便程序员查看、修改和维护代码。在团队合作开发中,一致的代码风格也有助于协作开发。 好的代码风格应该具备的特点 可读性强,注释清晰明了; 缩进和格式规范化; 变量和函数命名规范化; 代码冗余和复杂度控制; 合理的代码组织结构。 阶段性总结:如何实现好的代码风格 第一阶段:选择适合的代码风…

    Java 2023年5月26日
    00
  • Java中Stringbuild,Date和Calendar类的用法详解

    Java中StringBuilder, Date和Calendar类的用法详解 StringBuilder类的使用 在Java中,String是一个不可变的类,即一旦创建了一个String对象,它的内容就无法更改。如果需要频繁地对字符串进行修改,使用String类型会导致性能问题。这时就可以使用StringBuilder类,它是一个可变的字符串,可以方便地进…

    Java 2023年5月26日
    00
  • JavaWeb购物车项目开发实战指南

    JavaWeb购物车项目开发实战指南 本文将详细介绍JavaWeb购物车项目的开发过程,包括项目需求、概述、功能模块设计、技术选型、代码实现等内容。 项目需求 实现一个购物车系统,主要包含以下几个模块:- 用户登录模块- 商品列表展示模块- 加入购物车模块- 购物车页面展示模块- 订单结算模块 概述 本项目采用JavaWeb技术开发,使用MySQL作为数据库…

    Java 2023年6月15日
    00
  • SpringBoot依赖注入的三种方式

    下面是关于Spring Boot依赖注入的三种方式的详细讲解: 1. 构造器注入 构造器注入是为Bean的属性提供值的一种方式。当容器实例化Bean时,Spring容器会将与Bean依赖关系具有兼容性的Bean传递给它的构造器,并初始化Bean的属性。 这种方式适用于具有重要和必需依赖关系的Bean,并且确保了Bean初始化后的完整性。 下面是一个示例: @…

    Java 2023年5月15日
    00
  • Spring boot从安装到交互功能实现零基础全程详解

    Spring boot从安装到交互功能实现零基础全程详解 本文将详细讲解如何从零开始安装和使用Spring Boot,以及如何实现基本的交互功能,让你从零基础到实现一个Spring Boot应用项目。 安装 首先,你需要安装Java和Maven。 安装Java 访问Oracle官网,下载并安装最新版本的JDK。 安装Maven 访问Apache Maven官…

    Java 2023年5月15日
    00
  • 常见的 JVM 参数有哪些?

    以下是关于常见的 JVM 参数的完整使用攻略: 常见的 JVM 参数 JVM 参数是用来控制 JVM 行为的一些参数,可以通过命令行或配置文件等方式传递给 JVM。常见的 JVM 参数包括堆相关参数、垃圾回收器相关参数、线程相关参数和其他参数。 堆相关参数 堆是 JVM 中存储对象的内存区域,堆相关参数可以用来控制 JVM 的堆大小和堆的分配方式。 -Xms…

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