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. 动手实现 React-redux(五):Provider

    我们要把 context 相关的代码从所有业务组件中清除出去,现在的代码里面还有一个地方是被污染的.那就是 src/index.js 里面的 Index: ... class Index extend ...

  2. mvc报( 检测到有潜在危险的 request.form 值 )错的解决方案

    今天在做项目中遇到了报( 检测到有潜在危险的 request.form 值 )错,百度过后解决了该问题,出此问题主要还是因为提交的Form中有HTML字符串,例如你在TextBox中输入了html标签 ...

  3. Linux系统使用iftop查看带宽占用情况

    Linux系统下如果服务器带宽跑满了,查看跟哪个ip通信占用带宽比较多,可以通过iftop命令进行查询,使用方法如下: 1 安装方法[软件官网地址:http://www.ex-parrot.com/~ ...

  4. 应用-如何使不同的企业使用独自的数据源。使用ejb3.0+jboss6.2EAP+JPA

    摘要:                如何使不同的企业使用独自的数据源.使用ejb3.0+jboss6.2EAP+JPA10C应用系统被多个企业同时使用,为了提供个性化服务,如何使不同的企业使用独自的 ...

  5. 洛谷 P2515 [HAOI2010]软件安装

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...

  6. MongoDB最简单的入门教程之五-通过Restful API访问MongoDB

    通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通过MongoDB Compass查看到了 ...

  7. jxcel - 好用的Excel与Java对象转换工具

    更多精彩博文,欢迎访问我的个人博客 Jxcel简介 Jxcel是一个支持Java对象与Excel(目前仅xlsx.xls)互相转换的工具包. 项目地址:https://github.com/jptan ...

  8. roi pooling层

    roi pooling是先进行roi projection(即映射)然后再池化 映射是把用来训练的图片的roi映射到最后一层特征层(即卷积层).方法其实很简单,图片经过特征提取后,到最后一层卷积层时, ...

  9. VS2015提示:未安装Style的Visual Studio语言支持,代码编辑Intellisense将不可用。服务器控件的标记Intellisense可能不起作用

    一.问题 最近在VS2015打开文件,提示未安装Style的Visual Studio语言支持,代码编辑Intellisense将不可用.服务器控件的标记Intellisense可能不起作用. Int ...

  10. bzoj 3555 企鹅QQ

    https://www.lydsy.com/JudgeOnline/problem.php?id=3555 枚举每一位字符,计算字符两侧的哈希值,然后进行比较,用map或排序记录出与其相同的字符串数量 ...