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免登陆文章发布接口使用说 ...
随机推荐
- Shell脚本文件操作
Linux Shell http://baike.baidu.com/link?url=2LxUhKzlh5xBUgQrS0JEc61xi761nvCS7SHJsa1U1SkVbw3CC869AoUC ...
- [Effective C++ --008]别让异常逃离析构函数
这章非常容易理解:因为C++并不禁止析构函数吐出异常,只是不鼓励这样做而已. 一.原因 假设我们有10个装着鸡蛋的容器,而且现在我们还想着把它在析构函数打烂. class Egg { public : ...
- css实现响应式全屏背景
利用css中 background-size:cover 填充整个viewport 注意: 一张背景图像素5000px*5000px在pc端 缩放都基本满足要求 不会出现模糊失真: 但是在移动端使用 ...
- AndroidStudio中安装可自动生成json实体类的jar包
第一步:安装gsonjar包, 这样gson包就下载好了.接下来安装能自动生成实体类的插件: 接下来不要忘了重启: 重启后,就可以通过自定义的快捷键 alt+shift+s来打开generate,从而 ...
- C++第四章循环
学习时候的点: 1.用户来控制是否继续进行的模板: char goonLoop=’y’; while(goonLoop==’y’){ //logic cout<<”输入y 来继续当前逻辑, ...
- 《Mysql 公司职员学习篇》 第二章 小A的惊喜
第二章 小A的惊喜 ---- 认识数据库 吃完饭后,小Y和小A回到了家里,并打开电脑开始学习Mysql. 小Y:"小A,你平时的Excell文件很多的情况下,怎么样存放Exce ...
- 【排障】Outlook Express 2G收件箱大小限制
Outlook Express 2G收件箱大小限制 文:铁乐猫 ----------------------------- Outlook Express(以下简称OE)客户端收件箱大于或接近2G时, ...
- mapping 详解3(Meta-Fields)
文档标识相关元数据字段 _index 当执行多索引查询时,可能需要添加特定的一些与文档有关联的索引的子句. _index 字段可以用在 term.terms 查询,聚合(aggregations)操作 ...
- [转]ORACLE 异常错误处理
本文转自:http://www.cnblogs.com/soundcode/archive/2012/01/10/2318385.html 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义 ...
- systemverilog interface
普通的模块使用法:注意我们这里只实现了部分功能....不是完全的读写模块.... module mem_core( input logic wen, input logic ren, ...