struts2与cookie 实现自动登录和验证码验证实现代码
投稿:lqh
这篇文章主要介绍了struts2与cookie 实现自动登录和验证码验证实现代码的相关资料,需要的朋友可以参考下
主要介绍struts2与cookie结合实现自动登录
struts2与cookie结合时要注意采用.action 动作的方式实现cookie的读取
struts2的jar包
链接数据库文件 db.properties
dbDriver = oracle.jdbc.driver.OracleDriver url = jdbc:oracle:thin:@localhost:1521:orcl userName=test password=password
dao层类代码,通过登录名获取用户信息
package com.struts.dao.impl; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.struts.dao.UserDao; import com.struts.proj.User; import com.struts.util.BeanConnection; public class UserDaoImpl implements UserDao { private BeanConnection dbconn = new BeanConnection(); public User login(String loginname) { Connection conn = dbconn.getConnection(); ResultSet rs = null ; String selsql = "select * from t_scoa_sys_user where f_loginname='"+loginname+"'"; //System.out.println(selsql); PreparedStatement pstmt = null; User user = null; try { pstmt = conn.prepareStatement(selsql); //pstmt.setString(3, loginname); rs = pstmt.executeQuery(); while(rs.next()){ user = new User(); user.setId(rs.getLong(1)); user.setF_username(rs.getString(2)); user.setF_loginname(rs.getString(3)); user.setF_sex(rs.getString(4)); user.setF_state(rs.getString(5)); user.setF_email(rs.getString(6)); user.setF_mobilephone(rs.getString(7)); user.setF_secretaryid(rs.getLong(8)); user.setF_password(rs.getString(9)); user.setF_order(rs.getLong(10)); user.setF_note(rs.getString(11)); user.setF_infomodifytemplateid(rs.getLong(12)); } } catch (SQLException e) { e.printStackTrace(); } return user; } public void save(User user) { } public static void main(String[] args) { UserDaoImpl daoimpl = new UserDaoImpl(); daoimpl.login("admin"); } }
工具类 CookieUtils类
package com.struts.util; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.lang.xwork.StringUtils; import org.apache.struts2.ServletActionContext; import com.struts.action.LoginAction; import com.struts.proj.User; import com.struts.service.UserService; import com.struts.service.impl.UserServiceImpl; public class CookieUtils { public static final String USER_COOKIE = "user.cookie"; // 增加cookie public Cookie addCookie(User user) { Cookie cookie = new Cookie(USER_COOKIE, user.getF_loginname() + "," + DESEDE.decryptIt(user.getF_password())); cookie.setMaxAge(60 * 60 * 24 * 365); return cookie; } // 得到cookie public boolean getCookie(HttpServletRequest request, UserService userService) { request = ServletActionContext.getRequest(); Cookie[] cookies = request.getCookies(); userService = new UserServiceImpl(); if (cookies != null) { for (Cookie cookie : cookies) { if (CookieUtils.USER_COOKIE.equals(cookie.getName())) { String value = cookie.getValue(); // 判断字符是否为空 if (StringUtils.isNotBlank(value)) { String[] spilt = value.split(","); String loginname = spilt[0]; String password = spilt[1]; User user = userService.login(loginname, password); if (user != null) { HttpSession session = request.getSession(); session .setAttribute(LoginAction.USER_SESSION, user);// 添加用户到session中 return true; } } } } } return false; } // 删除cookie public Cookie delCookie(HttpServletRequest request) { request = ServletActionContext.getRequest(); Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (USER_COOKIE.equals(cookie.getName())) { cookie.setValue(""); cookie.setMaxAge(0); return cookie; } } } return null; } }
service层代码,验证用户名和密码是否正确,密码我本地用了加密算法,需要解密,友友们可以去掉
package com.struts.service.impl; import com.struts.dao.UserDao; import com.struts.dao.impl.UserDaoImpl; import com.struts.proj.User; import com.struts.service.UserService; import com.struts.util.DESEDE; public class UserServiceImpl implements UserService { UserDao userDao = new UserDaoImpl(); public User login(String loginname, String password) { User user = userDao.login(loginname); if (user == null) { System.out.println("用户名不存在,请检查后重新登录!"); } if (!DESEDE.decryptIt(user.getF_password()).equals(password)) { System.out.println("密码错误"); } return user; } public static void main(String[] args) { UserServiceImpl useimp = new UserServiceImpl(); System.out.println(useimp.login("admin", "1234")); } }
struts2的配置文件struts.xml,loginAction和ValidateCodeAction验证码的验证
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.i18n.reload" value="true" /> <constant name="struts.devMode" value="true" /> <package name="loginResult" extends="struts-default" namespace="/"> <action name="loginAction" class="com.struts.action.LoginAction"> <result name="success" type="redirect">/success.jsp</result> <result name="error">/error.jsp</result> <result name="login" type="redirect">/login.jsp</result> </action> <!-- 验证码 --> <action name="validate" class="com.struts.action.ValidateCodeAction"> <param name="width">60</param> <param name="height">20</param> <param name="fontSize">18</param> <param name="codeLength">4</param> <result type="stream"> <param name="contentType">image/jpeg</param> <param name="inputName">inputStream</param> </result> </action> </package> </struts>
action文件类 LoginAction
package com.struts.action; import java.util.Map; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.struts.proj.User; import com.struts.service.UserService; import com.struts.service.impl.UserServiceImpl; import com.struts.util.CookieUtils; import com.struts.util.DESEDE; public class LoginAction extends ActionSupport { private static final long serialVersionUID = 6650955874307814247L; private String f_loginname; private String f_password; private HttpServletResponse response; private HttpServletRequest request; private Map<String, Object> session; private CookieUtils cookieUtils = new CookieUtils(); private boolean userCookie; private String validateCode; public static final String USER_SESSION = "user.session"; UserService userService = new UserServiceImpl(); public String autoLogin() throws Exception { request = ServletActionContext.getRequest(); if (cookieUtils.getCookie(request, userService)) { return "success"; } else return "login"; } @Override public String execute() throws Exception { HttpSession session = ServletActionContext.getRequest().getSession(); try { String code = (String) session.getAttribute("validateCode"); if (validateCode == null || !validateCode.equals(code)) { System.out.println("验证码输入有误,请正确输入"); return "error"; } if (f_loginname != null && !"".equals(f_loginname) && !"".equals(f_password) && f_password != null) { User user = userService.login(f_loginname, f_password); // 判断是否要添加到cookie中 String psswd = DESEDE.decryptIt(user.getF_password()); if (user != null && psswd.equals(f_password)) { if (userCookie) { Cookie cookie = cookieUtils.addCookie(user); ActionContext.getContext().get("response"); ServletActionContext.getResponse().addCookie(cookie); } session.setAttribute(USER_SESSION, user); return "success"; } } } catch (Exception e) { e.printStackTrace(); } return "login"; } // 用户退出 public String logout() { request = ServletActionContext.getRequest(); response = ServletActionContext.getResponse(); HttpSession session = ServletActionContext.getRequest().getSession(); session = request.getSession(false); if (session != null) session.removeAttribute(USER_SESSION); Cookie cookie = cookieUtils.delCookie(request); if (cookie != null) response.addCookie(cookie); return "login"; } public static void main(String[] args) { LoginAction login = new LoginAction(); try { login.execute(); } catch (Exception e) { e.printStackTrace(); } } public Map<String, Object> getSession() { return session; } public void setSession(Map<String, Object> session) { this.session = session; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public boolean isUserCookie() { return userCookie; } public void setUserCookie(boolean userCookie) { this.userCookie = userCookie; } public String getF_loginname() { return f_loginname; } public void setF_loginname(String fLoginname) { f_loginname = fLoginname; } public String getF_password() { return f_password; } public void setF_password(String fPassword) { f_password = fPassword; } public String getValidateCode() { return validateCode; } public void setValidateCode(String validateCode) { this.validateCode = validateCode; } }
验证码 ValidataCodeAction ,网上很多验证码的例子,可以选择自己的方式来写验证码
package com.struts.action; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Random; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class ValidateCodeAction extends ActionSupport { private static final long serialVersionUID = 1L; private ByteArrayInputStream inputStream; private int width; private int height; private int fontSize; private int codeLength; public ValidateCodeAction() { } public void setCodeLength(int codeLength) { this.codeLength = codeLength; } public void setFontSize(int fontSize) { this.fontSize = fontSize; } public void setHeight(int height) { this.height = height; } public void setWidth(int width) { this.width = width; } public ByteArrayInputStream getInputStream() { return inputStream; } public void setInputStream(ByteArrayInputStream inputStream) { this.inputStream = inputStream; } public String execute() throws Exception { BufferedImage bimage = new BufferedImage(width, height, 1); Graphics g = bimage.getGraphics(); Random random = new Random(); g.setColor(getRandomColor(random, 200, 255)); g.fillRect(0, 0, width, height); g.setFont(new Font("Times New Roman", 0, fontSize)); g.setColor(getRandomColor(random, 160, 200)); for (int i = 0; i < 155; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x, y, x + xl, y + yl); } StringBuffer str = new StringBuffer(); for (int i = 0; i < codeLength; i++) { String randomStr = String.valueOf(random.nextInt(10)); str.append(randomStr); g.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110))); int x = (width / codeLength - 1) * i + random.nextInt(width / (codeLength * 2)); int y = random.nextInt(height - fontSize) + fontSize; g.drawString(randomStr, x, y); } ActionContext.getContext().getSession().put("validateCode", str.toString()); g.dispose(); ByteArrayOutputStream output = new ByteArrayOutputStream(); ImageOutputStream iout = ImageIO.createImageOutputStream(output); ImageIO.write(bimage, "JPEG", iout); iout.close(); output.close(); ByteArrayInputStream in = new ByteArrayInputStream(output.toByteArray()); setInputStream(in); return "success"; } private Color getRandomColor(Random random, int fc, int bc) { if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } }
登录成功页面success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@page import="com.struts.util.CookieUtils"%> <%@page import="org.apache.commons.lang.xwork.StringUtils"%> <%@ taglib uri="/struts-tags" prefix="s"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>success page</title> </head> <body> <% Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (CookieUtils.USER_COOKIE.equals(cookie.getName())) { String value = cookie.getValue(); // 判断字符是否为空 if (StringUtils.isNotBlank(value)) { String[] spilt = value.split(","); String loginname = spilt[0]; String password = spilt[1]; out.println(loginname + "欢迎登陆"); } } } } %> <s:a action="loginAction!logout.action" namespace="/"> 安全退出</s:a> </body> </html>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!