1.简介
用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等。如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问。
二、简单设计及实现
本程序是基于Java的SSH框架进行的。
1.数据库设计

我们应该设计一个用户表,其Userinfo表,对应的SQL语句为(Oracle数据库):

  1. create table userinfo
  2. (
  3. id                        varchar2(36) primary key,
  4. username                 varchar2(50) not null,
  5. password                 varchar2(50) not null,
  6. auth_limit               varchar2(10) not null,
  7. register_time           varchar2(40),
  8. create_time             varchar2(40),
  9. remarks                  varchar2(1024)
  10. );
create table userinfo
(
id varchar2(36) primary key,
username varchar2(50) not null,
password varchar2(50) not null,
auth_limit varchar2(10) not null,
register_time varchar2(40),
create_time varchar2(40),
remarks varchar2(1024)
);

分别是id,也就是UUID,用户名、密码、权限、注册时间、记录插入数据库的时间、备注等几个字段。

2.使用MyEclipse的Hibernate逆向工具,生成对应的Java
Bean和相应的hibernate的xml配置文件Userinfo.hbm.xml

  1. package edu.njupt.zhb.bean;
  2. /**
  3. * Userinfo entity. @author MyEclipse Persistence Tools
  4. */
  5. public class Userinfo implements java.io.Serializable {
  6. // Fields
  7. private String id;
  8. private String username;
  9. private String password;
  10. private String authLimit;
  11. private String registerTime;
  12. private String createTime;
  13. private String remarks;
  14. // Constructors
  15. /** default constructor */
  16. public Userinfo() {
  17. }
  18. /** minimal constructor */
  19. public Userinfo(String id, String username, String password,
  20. String authLimit) {
  21. this.id = id;
  22. this.username = username;
  23. this.password = password;
  24. this.authLimit = authLimit;
  25. }
  26. /** full constructor */
  27. public Userinfo(String id, String username, String password,
  28. String authLimit, String registerTime, String createTime,
  29. String remarks) {
  30. this.id = id;
  31. this.username = username;
  32. this.password = password;
  33. this.authLimit = authLimit;
  34. this.registerTime = registerTime;
  35. this.createTime = createTime;
  36. this.remarks = remarks;
  37. }
  38. // Property accessors
  39. public String getId() {
  40. return this.id;
  41. }
  42. public void setId(String id) {
  43. this.id = id;
  44. }
  45. public String getUsername() {
  46. return this.username;
  47. }
  48. public void setUsername(String username) {
  49. this.username = username;
  50. }
  51. public String getPassword() {
  52. return this.password;
  53. }
  54. public void setPassword(String password) {
  55. this.password = password;
  56. }
  57. public String getAuthLimit() {
  58. return this.authLimit;
  59. }
  60. public void setAuthLimit(String authLimit) {
  61. this.authLimit = authLimit;
  62. }
  63. public String getRegisterTime() {
  64. return this.registerTime;
  65. }
  66. public void setRegisterTime(String registerTime) {
  67. this.registerTime = registerTime;
  68. }
  69. public String getCreateTime() {
  70. return this.createTime;
  71. }
  72. public void setCreateTime(String createTime) {
  73. this.createTime = createTime;
  74. }
  75. public String getRemarks() {
  76. return this.remarks;
  77. }
  78. public void setRemarks(String remarks) {
  79. this.remarks = remarks;
  80. }
  81. }
package edu.njupt.zhb.bean;

/**
* Userinfo entity. @author MyEclipse Persistence Tools
*/ public class Userinfo implements java.io.Serializable { // Fields private String id;
private String username;
private String password;
private String authLimit;
private String registerTime;
private String createTime;
private String remarks; // Constructors /** default constructor */
public Userinfo() {
} /** minimal constructor */
public Userinfo(String id, String username, String password,
String authLimit) {
this.id = id;
this.username = username;
this.password = password;
this.authLimit = authLimit;
} /** full constructor */
public Userinfo(String id, String username, String password,
String authLimit, String registerTime, String createTime,
String remarks) {
this.id = id;
this.username = username;
this.password = password;
this.authLimit = authLimit;
this.registerTime = registerTime;
this.createTime = createTime;
this.remarks = remarks;
} // Property accessors public String getId() {
return this.id;
} public void setId(String id) {
this.id = id;
} public String getUsername() {
return this.username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} public String getAuthLimit() {
return this.authLimit;
} public void setAuthLimit(String authLimit) {
this.authLimit = authLimit;
} public String getRegisterTime() {
return this.registerTime;
} public void setRegisterTime(String registerTime) {
this.registerTime = registerTime;
} public String getCreateTime() {
return this.createTime;
} public void setCreateTime(String createTime) {
this.createTime = createTime;
} public String getRemarks() {
return this.remarks;
} public void setRemarks(String remarks) {
this.remarks = remarks;
} }

3.新建一个UserInfoService接口

  1. /*
  2. * $filename: VideoInfoService.java,v $
  3. * $Date: 2014-1-2  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb.service;
  8. import edu.njupt.zhb.bean.Userinfo;
  9. /*
  10. *@author: ZhengHaibo
  11. *web:     http://blog.csdn.net/nuptboyzhb
  12. *GitHub   https://github.com/nuptboyzhb
  13. *mail:    zhb931706659@126.com
  14. *2014-1-2  Nanjing,njupt,China
  15. */
  16. public interface UserInfoService {
  17. String getUserInfoList(int page, int rows);
  18. String addUser(Userinfo userinfo);
  19. String deleteUser(String userId);
  20. String editUser(Userinfo userinfo);
  21. Userinfo getUserInfoByName(String username);
  22. }
/*
* $filename: VideoInfoService.java,v $
* $Date: 2014-1-2 $
* Copyright (C) ZhengHaibo, Inc. All rights reserved.
* This software is Made by Zhenghaibo.
*/
package edu.njupt.zhb.service; import edu.njupt.zhb.bean.Userinfo; /*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*GitHub https://github.com/nuptboyzhb
*mail: zhb931706659@126.com
*2014-1-2 Nanjing,njupt,China
*/
public interface UserInfoService { String getUserInfoList(int page, int rows); String addUser(Userinfo userinfo); String deleteUser(String userId); String editUser(Userinfo userinfo); Userinfo getUserInfoByName(String username); }

4.新建一个UserInfoServiceImpl类

  1. /*
  2. * $filename: VideoInfoServiceImpl.java,v $
  3. * $Date: 2014-1-2  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb.service.impl;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import net.sf.json.JSONObject;
  11. import edu.njupt.zhb.bean.Userinfo;
  12. import edu.njupt.zhb.dao.BaseDao;
  13. import edu.njupt.zhb.service.UserInfoService;
  14. import edu.njupt.zhb.utils.DataGrid;
  15. import edu.njupt.zhb.utils.Tips;
  16. import edu.njupt.zhb.view.ViewUser;
  17. /*
  18. *@author: ZhengHaibo
  19. *web:     http://blog.csdn.net/nuptboyzhb
  20. *GitHub   https://github.com/nuptboyzhb
  21. *mail:    zhb931706659@126.com
  22. *2014-1-2  Nanjing,njupt,China
  23. */
  24. public class UserInfoServiceImpl implements UserInfoService{
  25. private BaseDao<Userinfo> userinfoBaseDao;
  26. public BaseDao<Userinfo> getUserBaseDao() {
  27. return userinfoBaseDao;
  28. }
  29. public void setUserBaseDao(BaseDao<Userinfo> userinfoBaseDao) {
  30. this.userinfoBaseDao = userinfoBaseDao;
  31. }
  32. @Override
  33. public String getUserInfoList(int page, int rows) {
  34. // TODO Auto-generated method stub
  35. System.out.println("page="+page+",rows="+rows);
  36. String hql = "from Userinfo";
  37. try {
  38. List<Userinfo> list = userinfoBaseDao.find(hql,page,rows);
  39. List<ViewUser> resultList = new ArrayList<ViewUser>();
  40. for(Userinfo userinfo:list){
  41. ViewUser viewUser = new ViewUser();
  42. viewUser.setBz(userinfo.getRemarks());
  43. viewUser.setId(userinfo.getId());
  44. viewUser.setPwd(userinfo.getPassword());
  45. viewUser.setYhm(userinfo.getUsername());
  46. viewUser.setYhqx(userinfo.getAuthLimit());
  47. viewUser.setZcsj(userinfo.getRegisterTime());
  48. resultList.add(viewUser);
  49. }
  50. DataGrid<ViewUser> dataGrid = new DataGrid<ViewUser>();
  51. dataGrid.setRows(resultList);
  52. dataGrid.setTotal(userinfoBaseDao.total(hql));
  53. String result = JSONObject.fromObject(dataGrid).toString();
  54. return result;
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. return null;
  58. }
  59. }
  60. public String addUser(Userinfo userinfo) {
  61. // TODO Auto-generated method stub
  62. Tips tips = new Tips();
  63. String hql = "from Userinfo where username = '"+userinfo.getUsername()+"'";
  64. try {
  65. List<Userinfo> list =  userinfoBaseDao.find(hql);
  66. if(list!=null&&list.size()>0){
  67. tips.setMsg("添加失败!用户名已经存在!");
  68. return JSONObject.fromObject(tips).toString();
  69. }
  70. } catch (Exception e) {
  71. // TODO Auto-generated catch block
  72. e.printStackTrace();
  73. }
  74. try {
  75. userinfoBaseDao.save(userinfo);
  76. } catch (Exception e) {
  77. // TODO Auto-generated catch block
  78. e.printStackTrace();
  79. tips.setMsg("添加失败");
  80. return JSONObject.fromObject(tips).toString();
  81. }
  82. tips.setMsg("添加成功");
  83. return JSONObject.fromObject(tips).toString();
  84. }
  85. public String deleteUser(String userid) {
  86. // TODO Auto-generated method stub
  87. Tips tips = new Tips();
  88. try {
  89. userinfoBaseDao.executeHql("delete from Userinfo where id = '"+userid+"'");
  90. } catch (Exception e) {
  91. // TODO Auto-generated catch block
  92. e.printStackTrace();
  93. tips.setMsg("删除失败");
  94. return JSONObject.fromObject(tips).toString();
  95. }
  96. tips.setMsg("删除成功");
  97. return JSONObject.fromObject(tips).toString();
  98. }
  99. public String editUser(Userinfo userinfo) {
  100. // TODO Auto-generated method stub
  101. Tips tips = new Tips();
  102. String hql = "from Userinfo where username = '"+userinfo.getUsername()+"'";
  103. try {
  104. List<Userinfo> list =  userinfoBaseDao.find(hql);
  105. if(list!=null&&list.size()>0){
  106. tips.setMsg("更新失败!用户名已经存在!");
  107. return JSONObject.fromObject(tips).toString();
  108. }
  109. } catch (Exception e) {
  110. // TODO Auto-generated catch block
  111. e.printStackTrace();
  112. }
  113. try {
  114. userinfoBaseDao.update(userinfo);
  115. } catch (Exception e) {
  116. // TODO Auto-generated catch block
  117. e.printStackTrace();
  118. tips.setMsg("编辑失败");
  119. return JSONObject.fromObject(tips).toString();
  120. }
  121. tips.setMsg("编辑成功");
  122. return JSONObject.fromObject(tips).toString();
  123. }
  124. @Override
  125. public Userinfo getUserInfoByName(String username) {
  126. // TODO Auto-generated method stub
  127. Userinfo  userinfo = null;
  128. String hql = "from Userinfo where username = '"+username+"'";
  129. try {
  130. List<Userinfo> list =  userinfoBaseDao.find(hql);
  131. if(list == null || list.size()==0){
  132. return null;
  133. }
  134. userinfo = list.get(0);
  135. return userinfo;
  136. } catch (Exception e) {
  137. // TODO Auto-generated catch block
  138. e.printStackTrace();
  139. }
  140. return null;
  141. }
  142. }
/*
* $filename: VideoInfoServiceImpl.java,v $
* $Date: 2014-1-2 $
* Copyright (C) ZhengHaibo, Inc. All rights reserved.
* This software is Made by Zhenghaibo.
*/
package edu.njupt.zhb.service.impl; import java.util.ArrayList;
import java.util.List; import net.sf.json.JSONObject; import edu.njupt.zhb.bean.Userinfo;
import edu.njupt.zhb.dao.BaseDao;
import edu.njupt.zhb.service.UserInfoService;
import edu.njupt.zhb.utils.DataGrid;
import edu.njupt.zhb.utils.Tips;
import edu.njupt.zhb.view.ViewUser; /*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*GitHub https://github.com/nuptboyzhb
*mail: zhb931706659@126.com
*2014-1-2 Nanjing,njupt,China
*/
public class UserInfoServiceImpl implements UserInfoService{
private BaseDao<Userinfo> userinfoBaseDao;
public BaseDao<Userinfo> getUserBaseDao() {
return userinfoBaseDao;
}
public void setUserBaseDao(BaseDao<Userinfo> userinfoBaseDao) {
this.userinfoBaseDao = userinfoBaseDao;
}
@Override
public String getUserInfoList(int page, int rows) {
// TODO Auto-generated method stub
System.out.println("page="+page+",rows="+rows);
String hql = "from Userinfo";
try {
List<Userinfo> list = userinfoBaseDao.find(hql,page,rows);
List<ViewUser> resultList = new ArrayList<ViewUser>();
for(Userinfo userinfo:list){
ViewUser viewUser = new ViewUser();
viewUser.setBz(userinfo.getRemarks());
viewUser.setId(userinfo.getId());
viewUser.setPwd(userinfo.getPassword());
viewUser.setYhm(userinfo.getUsername());
viewUser.setYhqx(userinfo.getAuthLimit());
viewUser.setZcsj(userinfo.getRegisterTime());
resultList.add(viewUser);
}
DataGrid<ViewUser> dataGrid = new DataGrid<ViewUser>();
dataGrid.setRows(resultList);
dataGrid.setTotal(userinfoBaseDao.total(hql));
String result = JSONObject.fromObject(dataGrid).toString();
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
} public String addUser(Userinfo userinfo) {
// TODO Auto-generated method stub
Tips tips = new Tips();
String hql = "from Userinfo where username = '"+userinfo.getUsername()+"'";
try {
List<Userinfo> list = userinfoBaseDao.find(hql);
if(list!=null&&list.size()>0){
tips.setMsg("添加失败!用户名已经存在!");
return JSONObject.fromObject(tips).toString();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
userinfoBaseDao.save(userinfo);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
tips.setMsg("添加失败");
return JSONObject.fromObject(tips).toString();
}
tips.setMsg("添加成功");
return JSONObject.fromObject(tips).toString();
}
public String deleteUser(String userid) {
// TODO Auto-generated method stub
Tips tips = new Tips();
try {
userinfoBaseDao.executeHql("delete from Userinfo where id = '"+userid+"'");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
tips.setMsg("删除失败");
return JSONObject.fromObject(tips).toString();
}
tips.setMsg("删除成功");
return JSONObject.fromObject(tips).toString();
}
public String editUser(Userinfo userinfo) {
// TODO Auto-generated method stub
Tips tips = new Tips();
String hql = "from Userinfo where username = '"+userinfo.getUsername()+"'";
try {
List<Userinfo> list = userinfoBaseDao.find(hql);
if(list!=null&&list.size()>0){
tips.setMsg("更新失败!用户名已经存在!");
return JSONObject.fromObject(tips).toString();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
userinfoBaseDao.update(userinfo);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
tips.setMsg("编辑失败");
return JSONObject.fromObject(tips).toString();
}
tips.setMsg("编辑成功");
return JSONObject.fromObject(tips).toString();
}
@Override
public Userinfo getUserInfoByName(String username) {
// TODO Auto-generated method stub
Userinfo userinfo = null;
String hql = "from Userinfo where username = '"+username+"'";
try {
List<Userinfo> list = userinfoBaseDao.find(hql);
if(list == null || list.size()==0){
return null;
}
userinfo = list.get(0);
return userinfo;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }

5.新建UserInfoAction类,(当然,我们的BaseAction肯定是从struts2中的ActionSupport派生出来的)

  1. /*
  2. * $filename: VideoInfoAction.java,v $
  3. * $Date: 2014-1-2  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb.action;
  8. import java.util.UUID;
  9. import net.sf.json.JSONArray;
  10. import net.sf.json.JSONObject;
  11. import edu.njupt.zhb.bean.Userinfo;
  12. import edu.njupt.zhb.service.UserInfoService;
  13. import edu.njupt.zhb.utils.Tips;
  14. import edu.njupt.zhb.utils.TipsMsg;
  15. import edu.njupt.zhb.utils.Utils;
  16. /*
  17. *@author: ZhengHaibo
  18. *web:     http://blog.csdn.net/nuptboyzhb
  19. *GitHub   https://github.com/nuptboyzhb
  20. *mail:    zhb931706659@126.com
  21. *2014-1-2  Nanjing,njupt,China
  22. */
  23. public class UserInfoAction extends BaseAction {
  24. /**
  25. *
  26. */
  27. private static final long serialVersionUID = 3321845277376234101L;
  28. private Userinfo userinfo;
  29. private String userId;
  30. private String username;
  31. private String password;
  32. public String getPassword() {
  33. return password;
  34. }
  35. public void setPassword(String password) {
  36. this.password = password;
  37. }
  38. public String getUsername() {
  39. return username;
  40. }
  41. public void setUsername(String username) {
  42. this.username = username;
  43. }
  44. public String getUserId() {
  45. return userId;
  46. }
  47. public void setUserId(String userId) {
  48. this.userId = userId;
  49. }
  50. public Userinfo getUserinfo() {
  51. return userinfo;
  52. }
  53. public void setUserinfo(Userinfo userinfo) {
  54. this.userinfo = userinfo;
  55. }
  56. private UserInfoService userInfoService;
  57. public UserInfoService getUserInfoService() {
  58. return userInfoService;
  59. }
  60. public void setUserInfoService(UserInfoService userInfoService) {
  61. this.userInfoService = userInfoService;
  62. }
  63. public void getUserInfoList() {
  64. String jsonResult = userInfoService.getUserInfoList(page, rows);
  65. System.out.println(jsonResult);
  66. super.writeStr(jsonResult);
  67. }
  68. /**
  69. * 添加用户
  70. *
  71. * @return
  72. */
  73. public void addUser() {
  74. if (userinfo == null) {
  75. Tips tips = new Tips();
  76. tips.setMsg("添加失败!对象为空");
  77. getPrintWriter().write(JSONArray.fromObject(tips).toString());
  78. return;
  79. }
  80. userinfo.setId(UUID.randomUUID() + "");
  81. userinfo.setCreateTime(Utils.getNowTime());
  82. String jsonResult = userInfoService.addUser(userinfo);
  83. getPrintWriter().write(jsonResult);
  84. }
  85. /**
  86. * 删除用户
  87. *
  88. * @return
  89. */
  90. public void deleteUser() {
  91. if (userId == null) {
  92. Tips tips = new Tips();
  93. tips.setMsg("删除失败!学号无效");
  94. getPrintWriter().write(JSONArray.fromObject(tips).toString());
  95. return;
  96. }
  97. String jsonResult = userInfoService.deleteUser(userId);
  98. getPrintWriter().write(jsonResult);
  99. }
  100. /**
  101. * 编辑用户
  102. *
  103. * @return
  104. */
  105. public void editUser() {
  106. if (userinfo == null) {
  107. Tips tips = new Tips();
  108. tips.setMsg("编辑失败!对象为空");
  109. getPrintWriter().write(JSONArray.fromObject(tips).toString());
  110. return;
  111. }
  112. userinfo.setId(userId);
  113. String jsonResult = userInfoService.editUser(userinfo);
  114. getPrintWriter().write(jsonResult);
  115. }
  116. public void login() {
  117. TipsMsg tipsMsg = new TipsMsg();
  118. if(username==null){
  119. tipsMsg.setId("1");
  120. tipsMsg.setMsg("用户名为空!");
  121. String result = JSONObject.fromObject(tipsMsg).toString();
  122. super.writeStr(result);
  123. return;
  124. }
  125. Userinfo userinfo = userInfoService.getUserInfoByName(username);
  126. if(userinfo==null){
  127. tipsMsg.setId("1");
  128. tipsMsg.setMsg("用户名不存在");
  129. String result = JSONObject.fromObject(tipsMsg).toString();
  130. super.writeStr(result);
  131. return;
  132. }
  133. if(!userinfo.getPassword().equals(password)){
  134. tipsMsg.setId("1");
  135. tipsMsg.setMsg("用户名或密码错误");
  136. String result = JSONObject.fromObject(tipsMsg).toString();
  137. super.writeStr(result);
  138. return;
  139. }
  140. super.setCurrentUser(userinfo);
  141. tipsMsg.setId("2");
  142. tipsMsg.setMsg("登录成功");
  143. String result = JSONObject.fromObject(tipsMsg).toString();
  144. super.writeStr(result);
  145. return;
  146. }
  147. }
/*
* $filename: VideoInfoAction.java,v $
* $Date: 2014-1-2 $
* Copyright (C) ZhengHaibo, Inc. All rights reserved.
* This software is Made by Zhenghaibo.
*/
package edu.njupt.zhb.action; import java.util.UUID; import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import edu.njupt.zhb.bean.Userinfo;
import edu.njupt.zhb.service.UserInfoService;
import edu.njupt.zhb.utils.Tips;
import edu.njupt.zhb.utils.TipsMsg;
import edu.njupt.zhb.utils.Utils; /*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*GitHub https://github.com/nuptboyzhb
*mail: zhb931706659@126.com
*2014-1-2 Nanjing,njupt,China
*/
public class UserInfoAction extends BaseAction { /**
*
*/
private static final long serialVersionUID = 3321845277376234101L;
private Userinfo userinfo;
private String userId;
private String username;
private String password;
public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getUserId() {
return userId;
} public void setUserId(String userId) {
this.userId = userId;
} public Userinfo getUserinfo() {
return userinfo;
} public void setUserinfo(Userinfo userinfo) {
this.userinfo = userinfo;
} private UserInfoService userInfoService; public UserInfoService getUserInfoService() {
return userInfoService;
} public void setUserInfoService(UserInfoService userInfoService) {
this.userInfoService = userInfoService;
} public void getUserInfoList() {
String jsonResult = userInfoService.getUserInfoList(page, rows);
System.out.println(jsonResult);
super.writeStr(jsonResult);
} /**
* 添加用户
*
* @return
*/
public void addUser() {
if (userinfo == null) {
Tips tips = new Tips();
tips.setMsg("添加失败!对象为空");
getPrintWriter().write(JSONArray.fromObject(tips).toString());
return;
}
userinfo.setId(UUID.randomUUID() + "");
userinfo.setCreateTime(Utils.getNowTime());
String jsonResult = userInfoService.addUser(userinfo);
getPrintWriter().write(jsonResult);
} /**
* 删除用户
*
* @return
*/
public void deleteUser() {
if (userId == null) {
Tips tips = new Tips();
tips.setMsg("删除失败!学号无效");
getPrintWriter().write(JSONArray.fromObject(tips).toString());
return;
}
String jsonResult = userInfoService.deleteUser(userId);
getPrintWriter().write(jsonResult);
} /**
* 编辑用户
*
* @return
*/
public void editUser() {
if (userinfo == null) {
Tips tips = new Tips();
tips.setMsg("编辑失败!对象为空");
getPrintWriter().write(JSONArray.fromObject(tips).toString());
return;
}
userinfo.setId(userId);
String jsonResult = userInfoService.editUser(userinfo);
getPrintWriter().write(jsonResult);
} public void login() {
TipsMsg tipsMsg = new TipsMsg();
if(username==null){
tipsMsg.setId("1");
tipsMsg.setMsg("用户名为空!");
String result = JSONObject.fromObject(tipsMsg).toString();
super.writeStr(result);
return;
}
Userinfo userinfo = userInfoService.getUserInfoByName(username);
if(userinfo==null){
tipsMsg.setId("1");
tipsMsg.setMsg("用户名不存在");
String result = JSONObject.fromObject(tipsMsg).toString();
super.writeStr(result);
return;
}
if(!userinfo.getPassword().equals(password)){
tipsMsg.setId("1");
tipsMsg.setMsg("用户名或密码错误");
String result = JSONObject.fromObject(tipsMsg).toString();
super.writeStr(result);
return;
}
super.setCurrentUser(userinfo);
tipsMsg.setId("2");
tipsMsg.setMsg("登录成功");
String result = JSONObject.fromObject(tipsMsg).toString();
super.writeStr(result);
return;
}
}

6.配置Spring的applicationContext.xml文件,依次注入Dao、Service和Action。

  1. <bean id="baseDao" class="edu.njupt.zhb.dao.BaseDao">
  2. <property name="sessionFactory" ref="sessionFactory"></property>
  3. </bean>
<bean id="baseDao" class="edu.njupt.zhb.dao.BaseDao">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
  1. <bean id="userInfoService" class="edu.njupt.zhb.service.impl.UserInfoServiceImpl">
  2. <property name="userBaseDao" ref="baseDao"></property>
  3. </bean>
<bean id="userInfoService" class="edu.njupt.zhb.service.impl.UserInfoServiceImpl">
<property name="userBaseDao" ref="baseDao"></property>
</bean>
  1. <bean id="userInfoAction" class="edu.njupt.zhb.action.UserInfoAction" scope="prototype">
  2. <property name="userInfoService" ref="userInfoService"></property>
  3. </bean>
<bean id="userInfoAction" class="edu.njupt.zhb.action.UserInfoAction" scope="prototype">
<property name="userInfoService" ref="userInfoService"></property>
</bean>

7.配置Spring的Hibernate的Java Bean的映射文件

  1. <bean id="sessionFactory"
  2. class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  3. <property name="dataSource" ref="dataSource" />
  4. <property name="hibernateProperties">
  5. <props>
  6. <prop key="hibernate.show_sql">true</prop>
  7. <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
  8. <prop key="current_session_context_class">thread</prop>
  9. </props>
  10. </property>
  11. <property name="mappingResources">
  12. <list>
  13. ...
  14. <value>edu/njupt/zhb/bean/Userinfo.hbm.xml</value>
  15. </list>
  16. </property>
  17. </bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="current_session_context_class">thread</prop>
</props>
</property>
<property name="mappingResources">
<list>
...
<value>edu/njupt/zhb/bean/Userinfo.hbm.xml</value>
</list>
</property>
</bean>

8.配置Struts2文件,增加相应的Action,login等

  1. <action name="getUserInfoList" class="userInfoAction" method="getUserInfoList"></action>
  2. <action name="addUser" class="userInfoAction" method="addUser"></action>
  3. <action name="deleteUser" class="userInfoAction" method="deleteUser"></action>
  4. <action name="editUser" class="userInfoAction" method="editUser"></action>
  5. <action name="login" class="userInfoAction" method="login"></action>
<action name="getUserInfoList" class="userInfoAction" method="getUserInfoList"></action>
<action name="addUser" class="userInfoAction" method="addUser"></action>
<action name="deleteUser" class="userInfoAction" method="deleteUser"></action>
<action name="editUser" class="userInfoAction" method="editUser"></action>
<action name="login" class="userInfoAction" method="login"></action>

9.登录页面login.jsp中的ajax请求:

  1. $("#btnLogin").click(function(){
  2. var message = "";
  3. var userName=$('input[name="userName"]').val();
  4. var userPass=$('input[name="userPass"]').val();
  5. if(userName == ""){
  6. alert("请输入用户名!");
  7. return;
  8. }else if(userPass == ""){
  9. alert("请输入密码!");
  10. return;
  11. }
  12. $.ajax({
  13. type:"post",
  14. url:'login.action?username='+userName+'&password='+userPass,
  15. dateType:"json",
  16. success:function(data){
  17. var json=eval("("+data+")");
  18. if(json.id=='1'){
  19. alert(json.msg);
  20. return;
  21. }else{
  22. $("#frm").submit();
  23. }
  24. }
  25. });
  26. });
 $("#btnLogin").click(function(){
var message = "";
var userName=$('input[name="userName"]').val();
var userPass=$('input[name="userPass"]').val();
if(userName == ""){
alert("请输入用户名!");
return;
}else if(userPass == ""){
alert("请输入密码!");
return;
}
$.ajax({
type:"post",
url:'login.action?username='+userName+'&password='+userPass,
dateType:"json",
success:function(data){
var json=eval("("+data+")");
if(json.id=='1'){
alert(json.msg);
return;
}else{
$("#frm").submit();
}
}
});
});

10.为了防止用户在不登陆的情况下,访问其他页面,我们在每一个jsp页面中添加如下代码:

  1. <%if(null == request.getSession().getAttribute("user")){
  2. response.getWriter().write("<script>window.location.href = 'login.jsp'</script>");
  3. }
  4. %>
<%if(null == request.getSession().getAttribute("user")){
response.getWriter().write("<script>window.location.href = 'login.jsp'</script>");
}
%>

思考:
完成上述复杂的功能之后,我们是不是就完成任务了呢?显然不是,我们经过测试我们就会发现,在我们没有登录的情况下,我们确实没有办法访问其他的JSP页面,但是我们可以直接在浏览器中访问struts中配置的action!这依然有很大的漏洞,那我们怎么对action进行拦截呢?也即是对非login.action进行拦截判断,如果用户已经登录,就正常登录,如果用户没有登录,就返回login,让其登录。因此我们需要使用struts2的拦截器。

11.拦截器的Java代码

  1. /*
  2. * $filename: CheckLoginInterceptor.java,v $
  3. * $Date: 2014-1-15  $
  4. * Copyright (C) ZhengHaibo, Inc. All rights reserved.
  5. * This software is Made by Zhenghaibo.
  6. */
  7. package edu.njupt.zhb.utils;
  8. import java.util.Map;
  9. import com.opensymphony.xwork2.ActionInvocation;
  10. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
  11. import edu.njupt.zhb.action.UserInfoAction;
  12. import edu.njupt.zhb.bean.Userinfo;
  13. /*
  14. *@author: ZhengHaibo
  15. *web:     http://blog.csdn.net/nuptboyzhb
  16. *GitHub   https://github.com/nuptboyzhb
  17. *mail:    zhb931706659@126.com
  18. *2014-1-15  Nanjing,njupt,China
  19. */
  20. public class CheckLoginInterceptor extends AbstractInterceptor{
  21. /**
  22. *
  23. */
  24. private static final long serialVersionUID = 2092930262572782343L;
  25. @Override
  26. public String intercept(ActionInvocation actionInvocation) throws Exception {
  27. // TODO Auto-generated method stub
  28. //System.out.println("begin check login interceptor!");
  29. // 对LoginAction不做该项拦截
  30. Object action = actionInvocation.getAction();
  31. if (action instanceof UserInfoAction) {
  32. //System.out.println("exit check login, because this is login action.");
  33. //UserInfoAction userinfoAction = (UserInfoAction)action;
  34. return actionInvocation.invoke();
  35. }
  36. // 确认Session中是否存在User
  37. Map<String,Object> session = actionInvocation.getInvocationContext().getSession();
  38. Userinfo user = (Userinfo) session.get("user");
  39. if (user != null) {
  40. // 存在的情况下进行后续操作。
  41. //System.out.println("already login!");
  42. return actionInvocation.invoke();
  43. } else {
  44. // 否则终止后续操作,返回LOGIN
  45. System.out.println("no login, forward login page!");
  46. return "login";
  47. }
  48. }
  49. }
/*
* $filename: CheckLoginInterceptor.java,v $
* $Date: 2014-1-15 $
* Copyright (C) ZhengHaibo, Inc. All rights reserved.
* This software is Made by Zhenghaibo.
*/
package edu.njupt.zhb.utils; import java.util.Map; import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; import edu.njupt.zhb.action.UserInfoAction;
import edu.njupt.zhb.bean.Userinfo; /*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*GitHub https://github.com/nuptboyzhb
*mail: zhb931706659@126.com
*2014-1-15 Nanjing,njupt,China
*/
public class CheckLoginInterceptor extends AbstractInterceptor{ /**
*
*/
private static final long serialVersionUID = 2092930262572782343L; @Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
// TODO Auto-generated method stub
//System.out.println("begin check login interceptor!");
// 对LoginAction不做该项拦截
Object action = actionInvocation.getAction();
if (action instanceof UserInfoAction) {
//System.out.println("exit check login, because this is login action.");
//UserInfoAction userinfoAction = (UserInfoAction)action;
return actionInvocation.invoke();
}
// 确认Session中是否存在User
Map<String,Object> session = actionInvocation.getInvocationContext().getSession();
Userinfo user = (Userinfo) session.get("user");
if (user != null) {
// 存在的情况下进行后续操作。
//System.out.println("already login!");
return actionInvocation.invoke();
} else {
// 否则终止后续操作,返回LOGIN
System.out.println("no login, forward login page!");
return "login";
}
} }

12.拦截器在Struts2中的配置

  1. <interceptor name="loginIntercepter"
  2. class="edu.njupt.zhb.utils.CheckLoginInterceptor">
  3. </interceptor>
  4. <!-- 拦截器栈 -->
  5. <interceptor-stack name="loginStack">
  6. <interceptor-ref name="defaultStack" />
  7. <interceptor-ref name="loginIntercepter" />
  8. </interceptor-stack>
<interceptor name="loginIntercepter"
class="edu.njupt.zhb.utils.CheckLoginInterceptor">
</interceptor>
<!-- 拦截器栈 -->
<interceptor-stack name="loginStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="loginIntercepter" />
</interceptor-stack>

为每一个action配置拦截器,比如:

  1. <action name="getStudentList" class="dataGridDemoAction"
  2. method="getStudentList">
  3. <result type="httpheader"></result>
  4. <interceptor-ref name="loginStack" />
  5. <result name="login">/login.jsp</result>
  6. </action>
  7. <action name="addStudent" class="dataGridDemoAction" method="addStudent">
  8. <result type="httpheader"></result>
  9. <interceptor-ref name="loginStack" />
  10. <result name="login">/login.jsp</result>
  11. </action>
  12. <action name="deleteStudent" class="dataGridDemoAction" method="deleteStudent">
  13. <result type="httpheader"></result>
  14. <interceptor-ref name="loginStack" />
  15. <result name="login">/login.jsp</result>
  16. </action>
  17. <action name="editStudent" class="dataGridDemoAction" method="editStudent">
  18. <result type="httpheader"></result>
  19. <interceptor-ref name="loginStack" />
  20. <result name="login">/login.jsp</result>
  21. </action>
<action name="getStudentList" class="dataGridDemoAction"
method="getStudentList">
<result type="httpheader"></result>
<interceptor-ref name="loginStack" />
<result name="login">/login.jsp</result>
</action>
<action name="addStudent" class="dataGridDemoAction" method="addStudent">
<result type="httpheader"></result>
<interceptor-ref name="loginStack" />
<result name="login">/login.jsp</result>
</action>
<action name="deleteStudent" class="dataGridDemoAction" method="deleteStudent">
<result type="httpheader"></result>
<interceptor-ref name="loginStack" />
<result name="login">/login.jsp</result>
</action>
<action name="editStudent" class="dataGridDemoAction" method="editStudent">
<result type="httpheader"></result>
<interceptor-ref name="loginStack" />
<result name="login">/login.jsp</result>
</action>

当然,对于用户登录的action,我们也配置相应的拦截器:

  1. <!-- 用户信息Action -->
  2. <action name="getUserInfoList" class="userInfoAction" method="getUserInfoList">
  3. <interceptor-ref name="loginStack" />
  4. <result name="login">/login.jsp</result>
  5. </action>
  6. <action name="addUser" class="userInfoAction" method="addUser">
  7. <interceptor-ref name="loginStack" />
  8. <result name="login">/login.jsp</result>
  9. </action>
  10. <action name="deleteUser" class="userInfoAction" method="deleteUser">
  11. <interceptor-ref name="loginStack" />
  12. <result name="login">/login.jsp</result>
  13. </action>
  14. <action name="editUser" class="userInfoAction" method="editUser">
  15. <interceptor-ref name="loginStack" />
  16. <result name="login">/login.jsp</result>
  17. </action>
  18. <action name="login" class="userInfoAction" method="login">
  19. <interceptor-ref name="loginStack" />
  20. </action>
		<!-- 用户信息Action -->
<action name="getUserInfoList" class="userInfoAction" method="getUserInfoList">
<interceptor-ref name="loginStack" />
<result name="login">/login.jsp</result>
</action>
<action name="addUser" class="userInfoAction" method="addUser">
<interceptor-ref name="loginStack" />
<result name="login">/login.jsp</result>
</action>
<action name="deleteUser" class="userInfoAction" method="deleteUser">
<interceptor-ref name="loginStack" />
<result name="login">/login.jsp</result>
</action>
<action name="editUser" class="userInfoAction" method="editUser">
<interceptor-ref name="loginStack" />
<result name="login">/login.jsp</result>
</action>
<action name="login" class="userInfoAction" method="login">
<interceptor-ref name="loginStack" />
</action>

总结:

以上步骤完成之后,我们基本上就完成了一个简单的用户登录模块的设计和实现了。而且我们可以根据用户的权限,显示不同的内容。比如管理员和普通操作员等具有不同的操作权限。

说明:

以上代码只是一些代码片段,我这里主要介绍的是思路。以上代码还有一些小小的漏洞,比如,我们在没有登录的情况下,还是可以直接访问getUserinfoList、deleteUser、editUser等与login在同一个Action类中的action。因此,我们设计的时候,要尽量将login和logout单独一个action。还有:上面写的getUserinfoList等一些action,目的是管理员对用户表进行增删改查等操作的,和本博客关系不大。本文主要注意的是:一个是在jsp页面中对未登陆用户的拦截,还有就是通过配置Struts2的拦截器,对未登录用户直接访问action方式进行拦截的。

Java SSH框架系列:用户登录模块的设计与实现思路的更多相关文章

  1. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  2. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  3. java.net.URL 模拟用户登录网页并维持session

    java.net.URL 模拟用户登录网页并维持session 半成品,并非完全有用 import java.io.BufferedReader; import java.io.InputStream ...

  4. java.net.URL 模拟用户登录网页并维持session【转】

    java.net.URL 模拟用户登录网页并维持session 半成品,并非完全有用 import java.io.BufferedReader; import java.io.InputStream ...

  5. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  6. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  7. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  8. Java 之 cookie 记住用户登录时间案例

    需求: 1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问. 2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串 分析: 1. 可以采用Cookie ...

  9. java日志框架系列(4):logback框架xml配置文件语法

    1.xml配置文件语法 由于logback配置文件语法特别灵活,因此无法用DTD或schema进行定义. 1.配置文件基本结构 配置文件基本结构:以<configuration>标签开头, ...

随机推荐

  1. hdu1513 Palindrome

    思路: dp+滚动数组. 实现: #include <iostream> #include <cstdio> #include <string> #include ...

  2. sprintf使用时需要注意的问题

  3. HDU 5416 CRB and Tree (技巧)

    题意:给一棵n个节点的树(无向边),有q个询问,每个询问有一个值s,问有多少点对(u,v)的xor和为s? 注意:(u,v)和(v,u)只算一次.而且u=v也是合法的. 思路:任意点对之间的路径肯定经 ...

  4. asp.net mvc 5 微信接入VB版 - 获取AccessToken

    获取AccessToken是微信接入的又一个基础操作.很多微信接口需要这个2小时一刷新的AccessToken作为参数. 转载请说明作者Nukepayload2 首先根据开发文档把获取AccessTo ...

  5. HttpClient 接口调用

    String url = "http://127.0.0.1:8080/api"; //然后根据表名获取公司信息 HttpPost httppost = new HttpPost( ...

  6. dzzoffice网盘应用有着最强大的团队、企业私有网盘功能,并且全开源无功能限制。

    企业,团队多人使用dzzoffice的网盘应用,灵活并且功能强大. 支持个人网盘,机构部门,群组,并可根据使用情况开启关闭.例如可只开启群组功能.   可通过后缀,标签自定义类型进行快捷筛选   全面 ...

  7. import downloadjs from 'downloadjs' 如果是自己写的函数 没用默认导出 记得加花括号 例如 import { download } from './data.js'

    import downloadjs from 'downloadjs' 如果是自己写的函数 没用默认导出 记得加花括号 例如 import { download } from './data.js'

  8. Java中wait()方法为什么要放在同步块中?(lost wake-up 问题)

    问题起源 事情得从一个多线程编程里面臭名昭著的问题"Lost wake-up problem"说起. 这个问题并不是说只在Java语言中会出现,而是会在所有的多线程环境下出现. 假 ...

  9. DI:Defect Index(缺陷率)

    DI:Defect Index(缺陷率) 定义:DI值是衡量软件质量的高低的指标之一. 公式:DI= 致命级别的问题个数*10+严重级别的问题个数*3+一般级别的问题个数*1+提示级别的问题个数*0. ...

  10. win手动编译JAVA 未完成(系统path未加入文章)

    java 下面存.BAT dir /s /B *.java > sources.txtjavac @sources.txt -bootclasspath "C:\Users\88797 ...