首页 > 编程 > Java > 正文

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

2019-11-26 13:41:20
字体:
来源:转载
供稿:网友

主要介绍struts2与cookie结合实现自动登录

struts2与cookie结合时要注意采用.action 动作的方式实现cookie的读取

struts2的jar包

 链接数据库文件 db.properties

dbDriver = oracle.jdbc.driver.OracleDriverurl = jdbc:oracle:thin:@localhost:1521:orcluserName=testpassword=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>

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表