文档章节

struts2与cookie实现自动登录

milin
 milin
发布于 2014/12/15 23:37
字数 906
阅读 24
收藏 1

一、本文主要介绍struts2与cookie结合实现自动登录

struts2与cookie结合时要注意采用.action 动作的方式实现cookie的读取。好了直接看代码:
首先是struts2的配置文件:struts.xml
该配置文件,用户验证成功跳转到success.jsp页面。验证失败跳转到Login.jsp页面
<?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.encoding" value="GBK" />
	<package name="user" namespace="/user" extends="struts-default">
		<!-- 用户登录 -->
		<action name="login" class="cn.edu.pdsu.action.LoginAction">
			<result name="success" type="redirect">/success.jsp</result>
			<result name="login">/login.jsp </result>
		</action>
	</package>
</struts>


接着是action文件,LoginAction.java

package cn.edu.pdsu.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.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;

import cn.edu.pdsu.bean.User;
import cn.edu.pdsu.dao.UserDao;
import cn.edu.pdsu.utils.CookieUtils;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport implements ServletRequestAware,
		ServletResponseAware, SessionAware {
	private static final long serialVersionUID = 6650955874307814247L;
	public static final String USER_SESSION = "user.session";
	private HttpServletResponse response;
	private HttpServletRequest request;
	private Map<String, Object> session;
	private CookieUtils cookieUtils = new CookieUtils();
	private UserDao userDao = new UserDao();
	private String username;
	private String password;
	private boolean userCookie;

	// 用户登录跳转
	public String login() {
		if (cookieUtils.getCookie(request, userDao)) {
			return SUCCESS;
		} else
			return "login";
	}

	@Override
	// 正常登录
	public String execute() throws Exception {
		System.out.println(username + "\t" + password + "\t" + userCookie);
		String username = getUsername().trim();
		if (username != null && !"".equals(username) && password != null
				&& !"".equals(password)) {
			User user = userDao.checkUser(username, password);
			System.out.println(user);
			if (user != null) {
				// 判断是否要添加到cookie中
				if (userCookie) {
					Cookie cookie = cookieUtils.addCookie(user);
					response.addCookie(cookie);// 添加cookie到response中
				}
				// 2.将user 设置到session中
				session.put(USER_SESSION, user);
				return SUCCESS;
			}
		}
		this.addFieldError("username", "用户名或密码错误!");
		return "login";
	}

	// 用户退出
	public String logout() {
		HttpSession 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 boolean getUserCookie() {
		return userCookie;
	}

	public void setUserCookie(boolean userCookie) {
		this.userCookie = userCookie;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}

	public void setSession(Map<String, Object> session) {
		this.session = session;
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

}
接下来是cookie工具类,主要是cookie的添加、删除与查询。CookieUtils.java
package cn.edu.pdsu.utils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;

import cn.edu.pdsu.action.LoginAction;
import cn.edu.pdsu.bean.User;
import cn.edu.pdsu.dao.UserDao;

/**
 * cookie的增加、删除、查询
 */
public class CookieUtils {
	public static final String USER_COOKIE = "user.cookie";

	// 添加一个cookie
	public Cookie addCookie(User user) {
		Cookie cookie = new Cookie(USER_COOKIE, user.getUsername() + ","
				+ user.getPassword());
		System.out.println("添加cookie");
		cookie.setMaxAge(60 * 60 * 24 * 14);// cookie保存两周
		return cookie;
	}

	// 得到cookie
	public boolean getCookie(HttpServletRequest request, UserDao userDAO) {
		Cookie[] cookies = request.getCookies();
		System.out.println("cookies: " + cookies);
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				System.out.println("cookie: " + cookie.getName());
				if (CookieUtils.USER_COOKIE.equals(cookie.getName())) {
					String value = cookie.getValue();
					if (StringUtils.isNotBlank(value)) {
						String[] split = value.split(",");
						String username = split[0];
						String password = split[1];
						User user = userDAO.checkUser(username, 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) {
		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;
	}
}

接着上的是用户信息验证类,UserDao.java
package cn.edu.pdsu.dao;

import cn.edu.pdsu.bean.User;

/**
 * 用户的有效性校验
 */
public class UserDao {

	// 模拟查找用户
	public User checkUser(String username, String password) {
		if (username.equals("hello") && password.equals("123")) {
			User user = new User();
			user.setUsername("hello");
			user.setPassword("123");
			return user;
		}
		return null;
	}

}
接着就是用户登录页面,login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@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>
    <base href="<%=basePath%>">
    <title>登录页面</title>
  </head>
  <body>
   <center>
   <s:form action="login" namespace="/user" method="post">
   <s:textfield label="用户名" name="username"></s:textfield>
   <s:password label="密码" name="password"></s:password>
   <s:checkbox label="自动登录" name="userCookie" value="true"></s:checkbox>
   <s:submit value="提交"></s:submit>
   </s:form>
   </center>
  </body>
</html>
接着是index.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
response.sendRedirect(basePath+"user/login!login.action");
%>

登录成功页面success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@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>
    <base href="<%=basePath%>">
    <title>登录成功!</title>
  </head>
  <body>
    <h1>欢迎您的到来!</h1><br>
    <s:a action="login!logout.action" namespace="/user"> 安全退出</s:a>
  </body>
</html>

项目下载地址:http://download.csdn.net/source/3477755

本文转载自:http://blog.csdn.net/afgasdg/article/details/6642628

milin
粉丝 10
博文 94
码字总数 19598
作品 0
郑州
高级程序员
私信 提问
基于struts2的记住账号密码的登录设计

  一个简单的基于struts2的登录功能,实现的额外功能有记住账号密码,登录错误提示。这里写上我在设计时的思路流程,希望大家能给点建设性的意见,帮助我改善设计。   登录功能的制作,首...

爱莫能助了
2014/04/10
0
0
SpringBoot集成Spring Security(2)——自动登录

在上一章:SpringBoot集成Spring Security(1)——入门程序中,我们实现了入门程序,本篇为该程序加上自动登录的功能。 源码地址:https://github.com/jitwxs/blogsample Step1 修改login.h...

yuanlaijike
2018/05/09
0
0
struts2设置首页也到的很奇怪的问题

struts2设置首页我知道四种方式 1、 2、 3、 4、在根目录下建一个index.do空文件夹,web.xml的然后在struts.xml建一个index的action 我用着第四种,在写自动登陆的时候出现一个问题,我写好拦...

thanatosx
2014/08/28
94
0
cookie实现自动登录,无法删除

使用cookie实现自动登录,登录后 产生2个cookie, 点击退出时,清空cookie 删除完之后,cookie并没有清空,还是可以自动登录,并且cookie的个数还是2个,而这样 也没有用 怎么回事...

ldl123292
2012/10/14
1K
2
Struts2获取request三种方法

复习啊.. struts2里面有三种方法可以获取request,最好使用ServletRequestAware接口通过IOC机制注入Request对象。 在Action中获取request方法一: 在Action中的代码: Map request = (Map)Act...

i33
2012/03/23
7.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

反编译9.png图片还原

本文链接:https://blog.csdn.net/a1140778530/article/details/10528507 经常反编译apk文件找资源,9.png的文件处理起来很麻烦。 最近使用Ant自动编译打包app时,从别处搜罗来的9.png文件导...

shzwork
31分钟前
6
0
Shell脚本应用 – for、while循环语句

一、for循环语句 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如:根据通讯录中的姓名列表创建系统账号等情况。 当面对各种...

linux-tao
31分钟前
5
0
RPA风潮下企业财务工作模式的变革

RPA(机器人流程自动化)在财务领域的应用,正给企业财务带来前所未有的改变。 前RPA时代,财务领域面临的痛点 在RPA机器人应用之前,企业财务工作进程的推进,主要通过财务人员人工操作或信...

UiBot
36分钟前
5
0
Hive之命令行修改表注释

最近遇到一个需求,在不重建表的情况下,修改表的注释,hive有没有类似关系型数据库的SQL命令来修改呢,找了下,亲测有效,如下List-1 List-1 hive>use your_schemahvie>ALTER TABLE tabl...

克虏伯
36分钟前
5
0
是什么,它的作用是什么

在HTML文档的首部往往会有这么一句话<!DOCTYPE html>,许多时候我们忽视了它的存在,它实际上是一个声明,告诉浏览器用哪种HTML版本的规范来解读HTML文档。 尽管我们不给出这句声明浏览器照样...

前端老手
42分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部