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>

web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name></display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

 

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);
    }

}

index.jsp页面,如果cookie登录直接进入登录成功页面,没有则跳转到login.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
response.sendRedirect(basePath+"loginAction!autoLogin.action");
%>

login.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
    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>
        <title>登录界面</title>
        <base href="<%=basePath%>">
        <script type="text/javascript" src="<%=path%>/js/jquery-1.4.2.min.js"></script>
        <script type="text/javascript">
    function check() {
        if ($('#f_loginname').val() == "") {
            alert("用户名不能为空!");
            $('#f_loginname').focus();
            return false;
        }
        if ($('#f_password').val() == "") {
            alert("密码不能为空!");
            $('#f_password').focus();
            return false;
        }
        if($('#validateCode').val()==""){
            alert("验证码不能为空!");
            $('#validateCode').focus();
            return false;
        }
    }
</script>
    </head>
    <body>
        <form name="loginForm" id="loginForm" action="loginAction.action" method="post">
            用户名:
            <input name="f_loginname" id="f_loginname">
            <br>&nbsp;&nbsp;&nbsp;&nbsp;码:
            <input type="password" name="f_password" id="f_password">
            <font color="red">自动登录</font>
            <input id="userCookie" type="checkbox" name="userCookie" value="true" />
            <br/>
            验证码:
            <input name="validateCode" type="text" id="validateCode">
            <img src="<%=path %>/validate" width="60" height="20">
            <a href="javascript:location.reload();">看不清?</a>
            <!-- false表示不自动登录,为默认值   true表示自动登录,表示选中-->
            <br>
            <input type="submit" value="提 交" id="login" onclick="return check()">
            <input type="reset" value="取 消">
        </form>
    </body>
</html>

登录成功页面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>

 

posted @ 2016-10-19 11:14  HanZongBo  阅读(2057)  评论(0编辑  收藏  举报