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. 第一章、 CLR的执行模型

    1. 概述 本章主要是介绍从源代码到可执行程序的过程中,CLR所做的工作. 2. 名词解释 ① 公共语言运行时(Common Language Runtime, CLR),是一个可由多种语言使用的 运 ...

  2. Docker DOC

    Docker DOC docker是提供给开发或管理人员的容器化部署项目工具 在linux上运行docker 常用命令 docker 安装 #先更新yum yum update; #设置docker仓 ...

  3. AJPFX关于对集合中的元素删除操作和注意点

    import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class ForeTest2 { ...

  4. CCF|中间数|Java

    import java.util.*; public class tyt { public static void main(String[] args) { Scanner in = new Sca ...

  5. iOS 动画(基于Lottie封装)

    一般app中都会带有动画,而如果是一些复杂的动画,不但实现成本比较高,而且实现效果可能还不能达到UI想要的效果,于是我们可以借助lottie来完成我们想要的动画.   lottie动画1.gif   ...

  6. Redis学习笔记(四)集合进阶

    1.组合与关联多个集合 差集: SDIFF key1 [key2...](返回存在于key1但不存在其他集合中的元素) SDIFFSTORE destination key1 [key2...](将存 ...

  7. 洛谷 P1618 三连击(升级版)

    题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”. //感谢黄小U饮品完善题意 输入输出格 ...

  8. leetcode_268.missing number

    给定一个数组nums,其中包含0--n中的n个数,找到数组中没有出现的那个数. 解法一:cyclic swapping algorithm class Solution { public: int m ...

  9. VMware 彻底删除虚拟机操作系统的方法

    方法一 首先,都需要点击左边的虚拟机列表,选中你要删除的操作系统 点击VMwae上方的虚拟机-管理-从硬盘删除. 方法二 右键左侧列表中要删除的系统-移除. 然后在硬盘上找到其所在文件夹,直接按SHI ...

  10. Python3简明教程(三)—— 运算符和表达式

    运算符 什么是运算符? 举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python支持以下类型的运算符: 算术运算符 关系运算符 赋 ...