struts2,登录功能模块实现
功能:
·UserLogin作为控制登录的Action,校验密码成功后记录session,可以选择记住登陆状态,登陆成功后自动跳转到登陆前的URL;
·UserLogout作为控制登录推出的Action,移除session,删除cookie;
·MainInfo和HeadInfo模拟了两个相对独立的Action用于展示页面内容;
·LoginInterceptor作为检查登录状态的拦截器,先检查session,后检查本地cookie;
·mainInfo.action和headInfo.action被配置通过LoginInterceptor拦截器检查。
struts.xml配置文件
<struts>
<package name="common-web" extends="struts-default">
<interceptors>
<interceptor name="loginInterceptor" class="loginInterceptor" /> <interceptor-stack name="loginDefaultStack">
<interceptor-ref name="loginInterceptor" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors> <default-interceptor-ref name="loginDefaultStack" /> <global-results>
<result name="login" type="redirect">userLogin.action</result>
</global-results> <action name="userLogin" class="userLoginAction">
<result type="redirect">${goingToURL}</result>
<result name="input">/page/user_login.jsp</result>
<interceptor-ref name="defaultStack" />
</action> <action name="userLogout" class="userLogoutAction"></action> <action name="mainInfo" class="mainInfoAction">
<result name="success">/page/main.jsp</result>
</action> <action name="headInfo" class="headInfoAction">
<result name="success">/page/head.jsp</result>
</action>
</package>
</struts>
struts.xml遇到的问题:
1、拦截器与Action必须配置在一个package下,否则拦截器不会对其他package下的Action生效。
2、暂无。
UserLogin.java主要源码
public class UserLogin extends ActionSupport implements ServletResponseAware, SessionAware {
private String name;
private String password;
private boolean rememberMe;
private HttpServletResponse response;
private Map<String, Object> session;
private String goingToURL;//登录前的URL
public String execute() throws Exception {
//...
if (isLoginSucc) {
//成功登录后记录session和cookie
if (rememberMe) {
String t = name + "," + password;
Cookie cookie = new Cookie(CommonConstants.COOKIE_KEY_REMEMBER_LOGIN, t);
cookie.setMaxAge(CommonConstants.COOKIE_AGE);//设置cookie存活时间
response.addCookie(cookie);
}
//设置session中的登录用户信息
session.put(CommonConstants.SESSION_KEY_USER_NAME, name);
//从session中获取登陆前URL,获取后移除session中的这个值
String goingToURL = (String) session.get(CommonConstants.SESSION_KEY_URL_BEFORE_LOGIN);
setGoingToURL(goingToURL);
session.remove(CommonConstants.SESSION_KEY_URL_BEFORE_LOGIN);
logger.info("登录成功[" + name + "]");
return SUCCESS;
} else {
logger.error("登录失败[" + name + "][" + password + "]");
return INPUT;
}
}
//... getter & setter methods
}
UserLogin.java遇到的问题:
1、cookie.setDomain(),cookie.setPath()设置错误会导致cookie写入失败;
2、cookie.Value中有分号“;”时,会导致cookie写入失败,改为逗号解决;
LoginInterceptor.java主要源码
public class LoginInterceptor extends AbstractInterceptor {
/* (non-Javadoc)
* @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext actionContext = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) actionContext
.get(StrutsStatics.HTTP_REQUEST);
Map<String, Object> session = actionContext.getSession();
//首先判断session,查找是否登录成功,通过拦截器
if (session != null && session.get(CommonConstants.SESSION_KEY_USER_NAME) != null) {
logger.info("通过拦截器,session中有记录[" + session.get(CommonConstants.SESSION_KEY_USER_NAME)
+ "]");
return invocation.invoke();
}
//其次cookie验证,是否有记住的登录状态
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (logger.isDebugEnabled())
logger.debug("读取cookie项[" + cookie.getName() + "]");
if (CommonConstants.COOKIE_KEY_REMEMBER_LOGIN.equals(cookie.getName())) {
String value = cookie.getValue();
if (StringUtils.isNotBlank(value)) {
String[] split = value.split(",");
String name = split[0];
String password = split[1];
if (userLoginManager.checkLogin(name, password)) {
//check name/password from cookie success
logger.info("通过拦截器,cookie中有记录[" + name + "]");
session.put(CommonConstants.SESSION_KEY_USER_NAME, name);
return invocation.invoke();
} else {
//check name/password from cookie failure
setGoingToURL(session, invocation);
return Action.LOGIN;
}
} else {
setGoingToURL(session, invocation);
return Action.LOGIN;
}
}
}
}
setGoingToURL(session, invocation);
return Action.LOGIN;
}
private void setGoingToURL(Map<String, Object> session, ActionInvocation invocation) {
String url = "";
String namespace = invocation.getProxy().getNamespace();
if (StringUtils.isNotBlank(namespace) && !namespace.equals("/")) {
url = url + namespace;
}
String actionName = invocation.getProxy().getActionName();
if (StringUtils.isNotBlank(actionName)) {
url = url + "/" + actionName + ".action";
}
if (logger.isDebugEnabled())
logger.debug("拼接登录前URL,结果:" + CommonConstants.SESSION_KEY_URL_BEFORE_LOGIN + "[" + url
+ "]");
session.put(CommonConstants.SESSION_KEY_URL_BEFORE_LOGIN, url);
}
//... getter & setter methods
}
LoginInterceptor.java遇到的问题:
转载:http://blog.csdn.net/welken/article/details/5587068
struts2,登录功能模块实现的更多相关文章
- Struts2整合Hibernate3实现用户登录功能
所用技术:struts2 ,hibernate,jsp,mysql 本DEMO仅仅实现用户登录功能,采用MVC思想,自己也觉得相对是比较简单,比较容易理解数据流向的一个例子,通过整合这个过程,能够清晰 ...
- Struts2+Spring+Hibernate实现员工管理增删改查功能(一)之登录功能
昨天的博客中我分享了个人关于ssh实现员工管理的框架整合,今天我在分享管理员登录功能的实现. 转载请注明出处"http://www.cnblogs.com/smfx1314/p/78013 ...
- 使用struts2进行登录功能的开发
使用struts2进行登录功能的开发 一. 设计需求 使用idea和maven开发具有登录功能的web应用,java语言,使用struts2框架. 二. 设计步骤 1.使用idea创建maven应用, ...
- Spring+Hibernate+Struts2整合之实现登录功能
前端代码: <form id="loginForm" action="${ pageContext.request.contextPath }/user_login ...
- Struts+Hibernate+Spring实现用户登录功能
通过登录案例实现三大框架之间的整合,登录功能是任何系统和软件必不可少的一个模块,然而通过这个模块来认识这些复杂的框架技术,理解数据流向和整个设计思路是相当容易的.只有在掌握了这些小模块的应用后,才能轻 ...
- 一步步开发自己的博客 .NET版(3、注册登录功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- iOS开发一个用户登录注册模块需要解决的坑
最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...
- 10天学会phpWeChat——第二天:hello world!我的第一个功能模块
今天我们开始进入<10天学会phpWeChat>系列教程的第二天:创建我的第一个hello world! 功能模块. 1.登录后台,进入 系统设置--自定义模块,如图: 自定义模块参数说明 ...
- 火车采集器 帝国CMS7.2免登录发布模块
帝国cms7.2增加了金刚模式,登录发布有难度.免登录发布模块配合火车采集器,完美解决你遇到的问题. 免登录直接获取栏目列表 通过文件内设置密码免登录发布数据 帝国cms7.2免登陆文章发布接口使用说 ...
随机推荐
- php递归无限极分类
递归无限级分类有几种形式,我这里仅仅举例比較经常使用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'p ...
- android124 zhihuibeijing 新闻中心-新闻 -北京页签 下拉刷新
缓存工具类:以url为key,json数据为value, package com.itheima.zhbj52.utils; import com.itheima.zhbj52.global.Glob ...
- OpenCms Application dev-ref
OpenCms Application Overview Before undertaking development, it will be helpful to understand the ba ...
- iOS-制作Framework
步骤 打开Xcode,创建新工程.手下留情,请先看图! 在TARGETS下选中工程,在Build Settings下更改几个参数. 更改参数 在Architectures下增加armv7s,并选中.将 ...
- Spring任务调度
任务调度是大多数应用系统的常见需求之一,拿论坛来说:每个半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行对锁定过期的用户进行解锁.以上都是以时间为关注点的调度,事实上 ...
- PHP微信开发ReplyModel(封装验证,数据获取,信息返回)
<?phpclass ReplyModel{ //验证token, public function ValidationToken($token){ if(isset($_GET["e ...
- Python 文件操作模块 shutil 详解
1.导入模块 shutil import shutil 2.shutil方法 2.1 shutil.copy(src,dst) //将 src 复制到 dst 保留文件权限 例:将Alan复制到 ...
- 关于JSP异常的处理
jsp中错误处理页面-isErrorPage="true" 举例说明:mustBeError.jsp <%@ page contentType="text/html ...
- h2database源码浅析:SQL语句的执行
最近想好好了解一下数据库的原理,下载了h2database的源码,准备好好看看.此过程的一些想法,暂且记下来,权当做读码笔记吧! 为了调试准备的测试用例: @Test public void test ...
- 【C#4.0图解教程】笔记(第19章~第25章)
第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板. 2.声明 ...