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. Git之fatal: remote origin already exists

    文件提交到远程分支,我们需要提前表明需要提交到哪个远程分支 比如:git remote add origin git@github.com:wqk66/test.git,表示他提交到远程仓库test ...

  2. UVa OJ 458

     The Decoder  Write a complete program that will correctly decode a set of characters into a valid m ...

  3. 【HEVC帧间预测论文】P1.1 基于运动特征的HEVC快速帧间预测算法

    基于运动特征的 HEVC 快速帧间预测算法/Fast Inter-Frame Prediction Algorithm for HEVC Based on Motion Features <HE ...

  4. C# string日期格式

    百分数格式应该用“p”这个参数. 格式 原始 数据 结 果 "{0:P}" 0.40 40% 数字 {0:N2} 12.36  数字 {0:N0} 13  货币 {0:c2} $1 ...

  5. 推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈

    对于前端开发人员来说,目前的前端框架层出不穷,最受欢迎的莫过于所谓的前端框架三驾马车:Angular, React和Vue.在学习的过程中,肯定好奇现在的互联网公司的网站用的何种前端框架来开发的. C ...

  6. Python 学习日志9月21日

    9月21日 周四 今天是个特殊的日子吗,总感觉9月21这个日子听着怪怪的. 今天早晨看<Head First HTML and CSS>第13章节“表格和更多列表”,内容不多,看完并做了详 ...

  7. 完整卸载MySQL数据库

    1. 关掉mysql服务 右键“我的电脑”,选择“管理”,打开计算机管理,选择“服务” 右键MySQL服务,选择“停止” 2. 卸载mysql程序 开始菜单->控制面板->程序和功能 3. ...

  8. DFS || HDU 2181

    题意:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. 前20行的第i行有3个数,表示与第i个城市相邻的3个城市.第20行以后每 ...

  9. MySQL-07 日志管理

    学习目标 MySQL日志 二进制日志 错误日志 查询通用日志 慢查询日志 MySQL日志 MySQL日志分为四类,说明如下: 错误日志:记录MySQL服务的启动.运行或者停止时出现的问题. 查询日志: ...

  10. day09 10 11 12 三天函数内容

    小括号.中括号名字()函数调用符[] 索引调用符 函数的注释:官方推荐: 查看注释 :funcming.__doc__      funcming.__name__ def func(name, ag ...