实现自动登录和验证码验证是网站开发中比较常见的需求。在 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技术站