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日

相关文章

  • Java Lambda表达式实例解析原理

    Java Lambda表达式实例解析原理 什么是Lambda表达式 Lambda表达式是Java8引入的一个重要特性,它可以用更简洁的语法来定义内联函数,并与函数式接口一起使用,使得我们可以更方便地编写简洁、优美的代码。 Lambda表达式的完整语法包含三个部分:参数列表、箭头符号、函数体,它们的组合形成了一个完整的Lambda表达式,如下所示: (para…

    Java 2023年5月26日
    00
  • 如何基于Java实现对象List排序

    当我们需要对一个对象List进行排序时,可以使用Java提供的Collections.sort()方法来完成排序操作。以下是基于Java实现对象List排序的完整攻略: 1. 定义一个对象类 首先,我们需要定义一个对象类,并实现Comparable接口。比较方式可以根据具体需求进行定义。假设我们要对学生对象进行排序,比较方式为按照学生年龄从小到大排序,则可以…

    Java 2023年5月26日
    00
  • Spring配置数据源流程与作用详解

    Spring配置数据源流程与作用详解 什么是数据源 在编写Java Web应用时,我们经常需要连接数据库。而Spring提供了JdbcTemplate等API帮助我们对数据库进行操作。但是在使用这些API之前我们需要先获得一个数据源(DataSource)对象。数据源是一个能够建立数据库连接的工厂,它将数据库的连接细节封装了起来,同时提供了有效,可重复的数据…

    Java 2023年5月19日
    00
  • Spring向页面传值和接受页面传过来的参数详解

    下面是“Spring向页面传值和接受页面传过来的参数详解”的完整攻略。 Spring向页面传值和接受页面传过来的参数详解 一、向页面传值 1.使用ModelAndView 步骤 在Controller中使用ModelAndView对象,并设置页面名称。 使用addObject方法,将需要传递的数据添加到ModelAndView中。 示例代码如下: @Requ…

    Java 2023年6月15日
    00
  • Spring实战之Bean的作用域request用法分析

    Spring实战之Bean的作用域request用法分析 什么是Bean作用域 在Spring中,Bean作用域指的是一个Bean实例的创建和存在方式。Spring框架中有多种Bean作用域,包括“singleton”、“prototype”、“request”等。 singleton:Bean在整个应用程序中只有一个实例,即在容器启动时,Spring IO…

    Java 2023年5月19日
    00
  • 一文探索Java文件读写更高效方式

    针对Java文件读写更高效方式的攻略,我可以提供以下内容: 1. 使用NIO NIO(New I/O),即为非阻塞 IO。相比于传统的 IO,它可以提供更高效的文件读写方式。其主要的类库为java.nio。使用NIO的关键是Buffer和Channel两个概念。其中Buffer为缓冲区,用来读写数据;Channel则代表数据源,如文件或网络连接,我们从Cha…

    Java 2023年5月20日
    00
  • java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    关于Java环境变量配置的详细攻略,我将为你提供如下步骤: 1. 下载安装JDK(Java Development Kit) 在安装JDK之前,请确认已经下载了适合你操作系统版本的JDK安装程序。可以在Oracle官网上下载最新版的JDK。 安装过程就是一般的软件安装过程,按照提示一步步操作即可。 2. 配置JAVA_HOME环境变量 安装完JDK后,我们需…

    Java 2023年5月24日
    00
  • SpringMVC 向jsp页面传递数据库读取到的值方法

    首先需要说明的是,SpringMVC向JSP页面传递数据库读取到的值的方法有很多种,这里介绍一种基本的方法。 控制层(Controller) 在控制层中我们需要注入一个由Service层封装好的Map对象,并将这个Map对象存入ModelAndView中,然后返回给View层(即JSP页面)。 示例: @Controller public class Use…

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