J2EE Web组件课程设计实训项目——《BBS论坛系统》——构建J2EE Listener监听器组件以实现显示在线用户总数
- 格式:pdf
- 大小:139.87 KB
- 文档页数:6
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建系统数据库连接组件及对应的单元测试用例(第3/4部分)1.1.1应用观察者模式重构(Refactor)系统中的日志处理功能实现1、什么是重构?为什么要重构?----改进?如何重构?---利用IDE工具实现2、观察者模式(1)什么是观察者模式(2)应用的目的:将日志记录功能从业务类或者DAO类中分离出来,减少“重复”!(3)编程实现的方法1)采用观察者模式实现----如何编程实现2)采用Spring框架中AOP(面向切面(方面)编程)技术3、改进ConnectDBBean和DBCPConnectDBBean、ConnectDBFactory等类中“藕合”有日志处理功能实现下面以DBCPConnectDBBean类为例说明,如何具体地应用观察者模式重构系统中的日志处理功能实现。
对于ConnectDBBean类和ConnectDBFactory类的修改,基本相同。
4、定义被观察者----也就是数据库连接类(ConnectDBBean或者DBCPConnectDBBean)该类作为被观察者类,应该继承于java.util 包中的Observable类package com.px1987.webbbs.dao;import java.sql.Connection;import java.sql.SQLException;import java.util.Observable;import mons.dbcp.BasicDataSource;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.exception.WebBBSException;public class DBCPConnectDBBean extends Observable implements ConnectDBInterface { String JDBC_DBDriver= null;String JDBC_URL = null;String dbUserName=null;String dbUserPassWord=null;String dbcp_maxActive=null;private java.sql.Connection con = null;BasicDataSource oneDataSourceImple=null;public DBCPConnectDBBean() throws WebBBSException {JDBC_DBDriver = ClassNameConfig.getProperty("JDBC_DBDriver");JDBC_URL = ClassNameConfig.getProperty("JDBC_URL");dbUserName = ClassNameConfig.getProperty("dbUserName");dbUserPassWord = ClassNameConfig.getProperty("dbUserPassWord");dbcp_maxActive = ClassNameConfig.getProperty("dbcp_maxActive");oneDataSourceImple=new BasicDataSource();oneDataSourceImple.setDriverClassName(JDBC_DBDriver);oneDataSourceImple.setUrl(JDBC_URL);oneDataSourceImple.setUsername(dbUserName);oneDataSourceImple.setPassword(dbUserPassWord);//最大的连接数目oneDataSourceImple.setMaxActive(Integer.parseInt(dbcp_maxActive));oneDataSourceImple.setDefaultAutoCommit(true);try {con=oneDataSourceImple.getConnection();}catch (java.sql.SQLException e) {int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点this.notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地连接数据库并且出现SQLException");}}public void closeDBCon() throws WebBBSException {try{con.close();con = null;}catch (SQLException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点this.notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地关闭数据库连接");}}public Connection getConnection() throws WebBBSException {return con;}}5、定义观察者类的接口(1)添加观察者类LogObserver的接口ExceptionLogInterface包名称为com.px1987.webbbs.util(2)设计该接口package com.px1987.webbbs.util;public interface ExceptionLogInterface {public void logInfo(String logInfoText);}6、添加观察者类(1)该类实现java.util包中的Observer接口和前面的ExceptionLogInterface接口,并且对异常进行观察。
J2EE课程设计及项目实训教学中的项目需求分析——《BBS论坛系统》的需求说明1.1.1BBS论坛需求说明1、该网站建设包含以下子系统2、用户脚色划分(1)普通用户普通用户以游客身份登录,只具有察看帖子的功能,不能留言。
(2)注册用户具备普通用户所有的能力。
并且是已经注册了的用户,可以登录、修改个人信息,并且可以发表留言。
(3)管理员管理员登录以后可以对论坛系统进行管理,包括论坛的基本信息、用户设置,还可以修改管理员密码。
3、前台服务系统修改帖子(from Use Case View)3.1、注册主要是指除管理员以外的用户角色,在网上在线填写一些会员的注册信息。
注册后即可成为BBS论坛会员。
会员注册信息如下:注册确认用户通过网上在线注册后,由系统管理员收集相应的资料,核实后,进行用户注册确认,确认后用户成为会员正式生效,可以享受网站提供的各种服务。
3.2、登录用户输入登录信息,如用户名、密码、验证码,以会员的身份进入本论坛。
或者以游客身份登录,不需要输入任何信息即可。
3.3、修改信息会员登录成功后,可以修改自己的信息,如密码等。
3.4、留言管理会员有发布,回复帖子的功能。
但只有注册并且登录成功的会员才具有这一功能。
会员可以修改自己的留言和查看、删除、自己的帖子。
4、后台管理系统(1)各个子模块(2)系统管理员及其职责5、后台管理系统系统管理员登陆: 系统管理员提交用户名和密码,系统验证用户名和密码的合法性,系统显示系统管理员管理页面(包含管理员的信息)6、论坛基本信息管理:对网站参数、通行证设置、COOKIE设置、公告设置进行管理。
7、管理用户:管理员设置一些用户的信息,如:用户权限、封锁用户、用户级别设置等等。
8、发帖设置:对用户的帖子设置、上传文件设置、全文检索设置、缓存设置进行管理。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建控制层中实现BBS信息查询管理的Action程序类1.1.1添加实现BBS信息查询管理的Action程序类1、添加一个实现页面跳转的 Action类BBSSearchInfoAction(1)新建一个Action类(2)设置其配置参数1)/bbsSearchInfoAction2)org.apache.struts.actions.DispatchAction3)com.px1987.webbbs.action.BBSSearchInfoAction4)bbsSearchInfoActionForm5)/showValidatorError.do(3)在parameter中输入action(4)最后将产生出下面的状态2、编程BBSSearchInfoAction 程序类package com.px1987.webbbs.action;import java.util.ArrayList;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction;import com.px1987.webbbs.actionform.BBSInfoActionForm;import com.px1987.webbbs.actionform.BBSSearchInfoActionForm;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.model.BBSInfoManageInterface;import com.px1987.webbbs.util.BBSInfoManageFactory;import org.apache.struts.validator.DynaValidatorForm;public class BBSSearchInfoAction extends DispatchAction {BBSInfoManageInterface bbsInfoManagerBean=null;public void setBbsInfoManagerBean(BBSInfoManageInterface bbsInfoManagerBean) { this.bbsInfoManagerBean = bbsInfoManagerBean;}public BBSSearchInfoAction(){//本构造方法是在利用 Spring IOC获得目标对象时被应用super();}/*String bbsInfoManageBeanClassName=null;public BBSSearchInfoAction() throws WebBBSException {//本构造方法是在利用可配置化的工厂时被应用super();newUserAndBBSManageBean();}public void newUserAndBBSManageBean() throws WebBBSException{bbsInfoManageBeanClassName=ClassNameConfig.getProperty("bbsInfoManageImple.className");bbsInfoManagerBean=BBSInfoManageFactory.newBBSInfoManageBean(bbsInfoManageBeanClassName);}*/public ActionForward goSearchBBSInfoInIndexPage(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) { boolean okOrnot=false;ArrayList searchResultArrayList=null;/* 没有采用validator技术时BBSSearchInfoActionForm bbsSearchInfoActionForm =(BBSSearchInfoActionForm) form;*///下面采用org.apache.struts.validator.DynaValidatorForm时DynaValidatorForm bbsSearchInfoActionForm = (DynaValidatorForm) form;String searchKind=(String)bbsSearchInfoActionForm.get("searchKind");String keyText=(String)bbsSearchInfoActionForm.get("keyText");// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try{// 此时在ArrayList中将包含有BBSInfoVO类型的对象雃合searchResultArrayList=bbsInfoManagerBean.doSeacherBBSInfo(searchKind,keyText);}catch (WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}if(searchResultArrayList.size()!=0){request.setAttribute("searchResultArrayList",searchResultArrayList);return (mapping.findForward("searchSuccess"));}else{request.setAttribute("errorText","没有找到满足您的查询条件的结果信息!");return mapping.findForward("showWebAppError");}}}。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——重构基于Hibernate框架的数据库连接方式并进行单元测试(第1/2部分)1.1.1Hibernate中的各种数据库连接池的支持类1、org.hibernate.connection.DriverManagerConnectionProvider(1)主要的作用DriverManagerConnectionProvider 类是Hibernate系统中内带的数据库连接池的实现类,并且DriverManagerConnectionProvider类继承了ConnectionProvider接口,主要是使用用户提供的JDBC驱动程序及与数据库有关的各种连接参数来连接数据库,或者使用连接池的方式来连接数据库。
(2)DriverManagerConnectionProvider这个类只是初始化了最基本的连接配置1)hibernate.connection.driver_class(JDBC驱动类)2)hibernate.connection.pool_size(连接池容量的上限数目)3)hibernate.connection.autocommit(允许被缓存的JDBC连接开启自动自动提交)4)hibernate.connection.isolation(设置JDBC事务隔离级别,可查看java.sql.Connection来了解各个值的具体意义,但请注意多数数据库都不支持所有的隔离级别,取值1,2,4,8)。
因此,无论你是使用JDBC还是使用连接池方式,这几个最基本的设置都是要先初始化的。
其中pool_size的默认值为20。
2、org.hibernate.connection.DatasourceConnectionProvider它通过JNDI的方式来查找数据源来获得连接。
3、org.hibernate.connection.C3P0ConnectionProvider对C3P0连接池的支持类。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建系统数据库连接组件及对应的单元测试用例(第1/4部分)1.1.1构造基于JDBC技术实现的数据访问层中的数据库连接组件1、编程优化的原则(1)谨用异常,因此应该只用于错误处理,而不应该用于控制程序执行的方向(2)不要重复初始化变量(3)使用合适的数据类型String.intern()-----equal()(4)用final类(5)避免在for语句中使用复杂的表达式(6)try/catch应该在循环外(7)缩短session的超时时间2、依赖管理不良的依赖管理将会导致代码难以改变、易被破坏,而且不可重用。
从另一方面来说,如果依赖经过了良性的管理,代码就可以保持灵活性、健壮性和重用性。
而什么样的设计结果是可依赖管理的呢?(1)类的设计原则1)SRP,单一职责原则,一个类应该有且只有一个改变的理由。
2)OCP,开放封闭原则,你应该能够不用修改原有类就能扩展一个类的行为。
3)LSP,Liskov替换原则,派生类要与其基类自相容。
4)DIP,依赖倒置原则,依赖于抽象而不是实现-----应该让接口稳定性低的模块调用接口稳定性高的模块。
5)ISP,接口隔离原则,客户只要关注它们所需的接口。
3、添加一个属性配置文件 classNameConfig.properties(1)为什么要采用配置文件?作用是什么?----灵活地满足变化!如何对配置文件中的项目进行读写?(2)在项目中添加属性配置文件 classNameConfig.properties(3)目前的内容如下JDBC_DBDriver= com.mysql.jdbc.DriverJDBC_URL = jdbc:mysql://localhost:3306/bbsdatabasedbUserName=rootdbUserPassWord=rootdbcp_maxActive=10dbcp_maxActive=10connectDBBean.className=com.px1987.webbbs.dao.ConnectDBBean注意:也可以采用XML形式的配置文件。
目录1.1BBS论坛系统项目完整实现实例(业务层UserInfo相关的功能类) (2)1.1.1实现系统的业务层中的各个业务实体组件类 (2)1.1.2实现系统的业务层中的各个业务功能处理的接口 (15)1.1.3实现系统的业务层中的各个业务功能处理接口的实现类 (17)1.1BBS论坛系统项目完整实现实例(业务层UserInfo相关的功能类)1.1.1实现系统的业务层中的各个业务实体组件类1、业务实体UserInfoBaseVO(1)业务实体UserInfoBaseVO,包名称为com.px1987.webbbs.model,并且实现java.io.Serializable接口(2)添加下面的属性private String userName;private String userPassWord;private Integer userType;private String aliaoName;private String passWordAsk;private String userImage;private String userMail;private String registerTime;private int userID;private String userResume;private Integer type_User_Admin; //该成员主要是区分用户的类型-----注册用户(=1)还是管理员(=2)(3)并为它们提供get/set方法(4)最后为下面的内容package com.px1987.webbbs.model;import java.io.Serializable;public class UserInfoBaseVO implements Serializable{private String userName;private Integer userType;private String aliaoName;private String passWordAsk;private String userImage;private String passWordAnswer;private String userMail;private String registerTime;private int userID;private String userResume;private Integer type_User_Admin; //该成员主要是区分用户的类型-----注册用户(=1)还是管理员(=2)public UserInfoBaseVO() {// TODO 自动生成构造函数存根}public String getAliaoName() {return aliaoName;}public void setAliaoName(String aliaoName) {this.aliaoName = aliaoName;}public String getPassWordAnswer() {return passWordAnswer;}public void setPassWordAnswer(String passWordAnswer) {this.passWordAnswer = passWordAnswer;}public String getPassWordAsk() {return passWordAsk;}public void setPassWordAsk(String passWordAsk) { this.passWordAsk = passWordAsk;}public String getRegisterTime() {return registerTime;}public void setRegisterTime(String registerTime) { this.registerTime = registerTime;}public Integer getType_User_Admin() {return type_User_Admin;}public void setType_User_Admin(Integer type_User_Admin) { this.type_User_Admin = type_User_Admin;}public int getUserID() {return userID;}public void setUserID(int userID) {erID = userID;}public String getUserImage() {return userImage;}public void setUserImage(String userImage) {erImage = userImage;}public String getUserMail() {return userMail;}public void setUserMail(String userMail) { erMail = userMail;}public String getUserName() {return userName;}public void setUserName(String userName) { erName = userName;}public String getUserPassWord() {return userPassWord;}public void setUserPassWord(String userPassWord) { erPassWord = userPassWord;}public String getUserResume() {return userResume;}public void setUserResume(String userResume) { erResume = userResume;}public Integer getUserType() {return userType;}public void setUserType(Integer userType) {erType = userType;}}2、业务实体UserInfoBaseVO 的子类UserInfoVO(1)业务实体UserInfoVO,包名称为com.px1987.webbbs.model,并且继承UserInfoBaseVO 类,同时也实现java.io.Serializable接口(2)添加下面的属性//下面的属性来自于UserInfoBasePO类private int userSex;private String userBirthDay;private String userComeFrom;// 下面的属性来自于UserInfoPO类private Map contactMethod = new HashMap();// 下面的属性主要是对注册用户的联系方式进行分离private String userICQCode;private String userMSNCode;private String userQQCode;private String userSign;private int emailVisible;private int acceptAdvise;// 下面的属性来自于AdminUserInfoPO类private String workUnit;private String studyHistory;private String studySchool;private String idCardNo;private int type_User_Admin; //该成员主要是区分用户的类型-----注册用户(=1)还是管理员(=2)// 下面的属性来自于AdminUserInfoPO类private String workUnit;private String studyHistory;private String studySchool;private String idCardNo;(3)并为它们提供get/set方法(4)最后为下面的状态内容package com.px1987.webbbs.model;import java.io.Serializable;import java.util.*;public class UserInfoVO extends UserInfoBaseVO implements Serializable {//下面的属性来自于UserInfoBasePO类private int userSex;private String userBirthDay;private String userComeFrom;// 下面的属性来自于UserInfoPO类private Map contactMethod = new HashMap();// 下面的属性主要是对注册用户的联系方式进行分离private String userICQCode;private String userMSNCode;private String userQQCode;private String userSign;private int emailVisible;private int acceptAdvise;// 下面的属性来自于AdminUserInfoPO类private String workUnit;private String studyHistory;private String studySchool;private String idCardNo;public UserInfoVO(){super();userSex=1;userBirthDay="";userComeFrom="";userSign="";emailVisible=1;acceptAdvise=1;userICQCode="";userMSNCode="";userQQCode="";workUnit="";studyHistory="";studySchool="";idCardNo="";}public int getAcceptAdvise() {return acceptAdvise;}public void setAcceptAdvise(int acceptAdvise) { this.acceptAdvise = acceptAdvise;}public Map getContactMethod() {return contactMethod;}public void setContactMethod(Map contactMethod) { this.contactMethod = contactMethod;}public int getEmailVisible() {return emailVisible;}public void setEmailVisible(int emailVisible) { this.emailVisible = emailVisible;}public String getIdCardNo() {return idCardNo;}public void setIdCardNo(String idCardNo) { this.idCardNo = idCardNo;}public String getStudyHistory() {return studyHistory;}public void setStudyHistory(String studyHistory) { this.studyHistory = studyHistory;}public String getStudySchool() {return studySchool;}public void setStudySchool(String studySchool) { this.studySchool = studySchool;}public String getUserBirthDay() {return userBirthDay;}public void setUserBirthDay(String userBirthDay) { erBirthDay = userBirthDay;}public String getUserComeFrom() {return userComeFrom;}public void setUserComeFrom(String userComeFrom) { erComeFrom = userComeFrom;}public String getUserICQCode() {return (String)contactMethod.get("userICQCode");}/** 下面的各个方法为“帮助方法”*/public void setUserICQCode(String userICQCode) {contactMethod.put("userICQCode", userICQCode);}public String getUserMSNCode() {return (String)contactMethod.get("userMSNCode");}public void setUserMSNCode(String userMSNCode) {contactMethod.put("userMSNCode", userMSNCode);}public String getUserQQCode() {return (String)contactMethod.get("userQQCode");}public void setUserQQCode(String userQQCode) {contactMethod.put("userQQCode", userQQCode);}public void addOneContactMethod(String oneContactMethodKey,String oneContactMethodValue) //该方法为“帮助方法”{contactMethod.put(oneContactMethodKey,oneContactMethodValue);}public String getOneContactMethod(String oneContactMethodKey) {return (String)contactMethod.get(oneContactMethodKey);}public int getUserSex() {return userSex;}public void setUserSex(int userSex) {erSex = userSex;}public String getUserSign() {return userSign;}public void setUserSign(String userSign) {erSign = userSign;}public String getWorkUnit() {return workUnit;}public void setWorkUnit(String workUnit) {this.workUnit = workUnit;}}1.1.2实现系统的业务层中的各个业务功能处理的接口1、接口UserInfoManageInterface,包名称为com.px1987.webbbs.model2、设计该接口中的相关功能方法package com.px1987.webbbs.model;import com.px1987.webbbs.exception.*;import java.util.*;public interface UserInfoManageInterface{public boolean doUserLogin(UserInfoVO oneUserInfoVO) throws WebBBSException;public boolean doUserRegister(UserInfoVO oneUserInfoVO) throws WebBBSException;public boolean doUpdateOneUserInfo(UserInfoVO oneUserInfoVO) throws WebBBSException;public boolean doUpdateOneRegisterUserPassWord(UserInfoVO oneUserInfoVO,String newPassWord) throws WebBBSException;public boolean doUpdateOneAdminUserPassWord(UserInfoVO oneUserInfoVO,StringnewPassWord) throws WebBBSException;public boolean doCheckUserNameExist(String userName,Integer type_User_Admin) throws WebBBSException;public String doGetOneRegisterUserPassWord(UserInfoVO oneRegisterUserInfoVO) throws WebBBSException;public String doGetOneAdminUserPassWord(UserInfoVO oneAdminUserInfoVO) throws WebBBSException;public UserInfoVO doGetOneRegisterUserInfo(String registerUserID) throws WebBBSException;public UserInfoVO doGetOneRegisterUserInfo(UserInfoVO oneRegisterUserInfoVO) throws WebBBSException;public UserInfoVO doGetOneAdminUserInfo(String adminUserID) throws WebBBSException;public UserInfoVO doGetOneAdminUserInfo(UserInfoVO oneAdminUserInfoVO) throws WebBBSException;public UserInfoBaseVO doGetOneUserInfo(String userName,String userPassWord, Integer type_User_Admin) throws WebBBSException;public ArrayList doGetAllUserNameInfo(String userName) throws WebBBSException;public boolean doDeleteOneRegisterUserInfo(String registerUserID) throws WebBBSException;public boolean doDeleteOneRegisterUserInfo(UserInfoVO oneRegisterUserInfoVO) throws WebBBSException;public boolean doDeleteOneAdminUserInfo(String adminUserID) throws WebBBSException;public boolean doDeleteOneAdminUserInfo(UserInfoVO oneAdminUserInfoVO) throws WebBBSException;public ArrayList doGetAllRegisterUserInfo() throws WebBBSException;public ArrayList doGetSomeRegisterUserInfo(Map registerUserInfos) throws WebBBSException;public ArrayList doGetAllAdminUserInfo() throws WebBBSException;public ArrayList doGetSomeAdminUserInfo(Map adminUserInfos) throws WebBBSException;}1.1.3实现系统的业务层中的各个业务功能处理接口的实现类1、接口UserInfoManageInterface的实现类UserInfoManageImple,包名称为com.px1987.webbbs.model2、编程该业务组件类package com.px1987.webbbs.model;import erInfoPO;import erManageDAOInterface;import erManageDAOJDBCImple;import com.px1987.webbbs.exception.WebBBSException;public class UserInfoManageImple implements UserInfoManageInterface { public UserInfoManageImple(){}public UserInfoVO doGetMaxIDUserInfo() throws WebBBSException { return null;}public int doGetTotalUserCounter() throws WebBBSException {return 0;}public String doGetUserPassWord(String userName, String passWordAnswer, String passWordAsk) throws WebBBSException {return null;}public UserInfoVO doShowOneUserInfo(int userID) throws WebBBSException { return null;}public boolean doTestUserNameValid(String userName) throws WebBBSException { return false;}public boolean doUpdateUserInfo(UserInfoVO oneUserInfo)throws WebBBSException {return false;}public boolean doUserLogin(UserInfoVO oneUserInfo) throws WebBBSException {String userName=oneUserInfo.getUserName();String userPassWord=oneUserInfo.getUserPassWord();boolean okOrNot=false;UserManageDAOInterface oneUserManageDAOJDBCImple=new UserManageDAOJDBCImple();UserInfoPO oneUserInfoPO=oneUserManageDAOJDBCImple.SelectOneUserInfoData(userName, userPassWord);if(oneUserInfoPO==null){okOrNot=false;}else{okOrNot=true;}return okOrNot;}public boolean doUserRegister(UserInfoVO oneUserInfo)throws WebBBSException{return false;}。
目录1.1BBS论坛系统项目完整实现实例(对持久层中的相关组件的代码进行优化) (2)1.1.1关于如何防止SQL注入的问题 (2)1.1.2测试SQL 注入式攻击的功能实现效果 (6)1.1.3关于JDBC中的事务控制技术在项目中的应用 (6)1.1BBS论坛系统项目完整实现实例(对持久层中的相关组件的代码进行优化)1.1.1关于如何防止SQL注入的问题1、SQL 注入式攻击概述(1)SQL 注入式攻击SQL 注入式攻击是将其他的(恶意的)SQL 代码传递到某个应用程序中的行为,该代码通常被附加到该应用程序包含的合法SQL 代码中。
所有SQL 数据库都在不同程度上容易遭受SQL 注入式攻击,下面主要以SQL Server 数据库作为示例数据库来说明上述问题。
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
(2)系统将出现下面的错误提示(3)SQL 注入式攻击出现的场合当处理作为SQL 命令组成部分的用户输入时,应当特别注意可能发生的SQL 注入式攻击。
如果您的身份验证方案用于为SQL 数据库验证用户(比如,您对SQL Server 使用表单身份验证),则必须防止SQL 注入式攻击。
如果您使用未筛选的输入构建SQL 字符串,则应用程序可能会遭受恶意用户输入(注意,千万不要信任用户输入)的攻击。
危险在于,当您将用户输入插入一个将要成为可执行语句的字符串中时,恶意用户可以利用转义符将SQL 命令附加到您想用的SQL 语句中。
(4)SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看系统日志的习惯,可能被入侵很长时间都不会发觉。
2、SQL 注入式攻击的应用示例下面的代码片段使用 SQL Server 中的某个数据库中的userInfo数据库表来说明 SQL 注入式攻击的示例。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——重构基于Hibernate框架的数据库连接方式并进行单元测试(第2/2部分)1.1.1重构基于Hibernate的C3P0数据库连接方式为Proxool并测试其效果---整合Hibernate和Proxool1、Proxool连接池相关介绍Proxool连接池是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。
开源项目地址是: / 配置连接池比较的简单。
并且有自动KILL不活动的连接的功能,因为开发时经常是在程序中有很多打开的连接没有关闭,不能正常地放回到连接池中去,而造成连接数不够的问题。
注意:但是如果连接数过多,而不及时KILL的话,对网站的连接是有很大的影响的,建议还是手工KILL。
2、下载proxool系统包(proxool作为数据库pool。
它有自动连接功能)(1)/(2)将proxool-0.9.1.jar和proxool-cglib.jar导入到项目的WEB-INF/lib目录中注意:在Hibernate3.3中也已经带有该系统包文件(3)为什么要应用它3、在hibernate.cfg.xml文件中添加下面的属性项目<property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property> <property name="proxool.pool_alias">DBPool</property><property name="proxool.xml">proxool.xml</property>其中的“proxool.pool_alias”是提供一个连接池的别名,而“proxool.xml”是向Hibernate声明连接池的配置文件位置,可以用相对或绝对路径,用相对路径时要注意一定在要Path范围内!不然会抛出异常。
基于J2EE Web组件技术的课程设计实训项目——《BBS论坛系统》——设置Web应用中的缺省的首页面1.1.1设置Web应用中的缺省的首页面1、设计系统的缺省首页(1)设计两个文件index.html、index.htm其内容都相同。
注意下面的黑体的内容,实际跳转到系统中的真正的首页中。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><meta http-equiv="refresh" content="0;url='/WebBBS/pageForwordAction?action=showIndexContent'"><meta name="keywords" content="BBS论坛"><meta name="description" content="中科院计算所培训中心成立于1987年,已经有20年培训经历。
培训中心从普及与发展全国IT技术人才的迫切需要出发,以建立中国最优秀的专业培训机构为目标,借鉴世界著名培训企业的成功办学经验,积极致力于国民经济各个领域的建设"><title>中科院计算所培训中心BBS论坛</title></head><body style="font-family: 宋体; font-size: 9pt"><p>正在加载主页面,请等待....<br></p></body></html>(2)再设计另一个index.jsp文件其内容与前面的文件相同,但多了一个<%@ page contentType="text/html;charset=gb2312" %>指令。
基于J2EE Web组件技术的课程设计实训项目——《BBS论坛系统》——构建J2EE Listener监听器组件以实现显示在线用户总数
1.1.1添加Listener组件显示在线用户数
1、添加一个在线用户计数的组件
(1)类名称为OnLineCounter,包名称为com.px1987.webbbs.util
(2)编程该OnLineCounter组件
package com.px1987.webbbs.util;
import java.util.*;
import erInfoVO;
import com.px1987.webbbs.listener.CounterOnLineVisitorListener;
public class OnLineCounter{
private static int onLine = 0;
public static int getOnLine() {
return onLine;
}
public static void addOneUser() {
onLine++;
}
public static void reduceOneUser() {
onLine--;
}
public static List getOnLineUserNameList(){
Iterator onLineUserList=CounterOnLineVisitorListener.getOnLineUserList().iterator();
List onLineUserNameList=new ArrayList();
while(onLineUserList.hasNext()) {
UserInfoVO oneLoginUserInfoVO=(UserInfoVO)onLineUserList.next();
onLineUserNameList.add(oneLoginUserInfoVO.getUserName());
}
return onLineUserNameList;
}
public static int getOnLineMemberUserNumber() {
return CounterOnLineVisitorListener.getOnLineUserList().size();
}
}
2、添加CounterOnLineVisitorListener组件
(1)类名称为CounterOnLineVisitorListener,包名称为com.px1987.webbbs.listener,并且实现javax.servlet.http.HttpSessionListener和HttpSessionAttributeListener等接口
(2)部署该CounterOnLineVisitorListener组件
<listener>
<listener-class>
com.px1987.webbbs.listener.CounterOnLineVisitorListener </listener-class>
</listener>
(3)编程该Listener
package com.px1987.webbbs.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.px1987.webbbs.util.OnLineCounter;
import erInfoVO;
import java.util.*;
public class CounterOnLineVisitorListener implements HttpSessionListener, HttpSessionAttributeListener{
private static List onLineUserList=new ArrayList();
public void sessionCreated(HttpSessionEvent se){
OnLineCounter.addOneUser();
}
public void sessionDestroyed(HttpSessionEvent se){
OnLineCounter.reduceOneUser();
}
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent){ //识别该用户是否已经登录
if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")) { UserInfoVO nowLoginUserInfo=
(UserInfoVO)httpSessionBindingEvent.getValue();
onLineUserList.add(nowLoginUserInfo);
}
}
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent){
if(httpSessionBindingEvent.getName().equals("oneUserInfoVO")){
UserInfoVO nowLoginUserInfo=
(UserInfoVO)httpSessionBindingEvent.getValue();
onLineUserList.remove(nowLoginUserInfo);
}
}
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent){
}
public static List getOnLineUserList(){
return onLineUserList;
}
}
3、在页面中定位显示计数的标签
<SPAN class=bold><%=OnLineCounter.getOnLine()%> </SPAN>
<span class="bold">人在线 - <%=OnLineCounter.getOnLineMemberUserNumber()%> 位会员(0 隐身), <%=readWriteCookieBean.getOnLineGuestCounter()%>
4、对每个页面的<body>标签添加onbeforeunload事件方法
<SCRIPT language=JavaScript>
function RunOnBeforeUnload(){
window.location.href=
"/WebBBS/pageForwordAction.do?action=showUserLogoutForDWR";
}
</script>
<BODY leftMargin=0 topMargin=0 rightMargin=0
onbeforeunload="RunOnBeforeUnload()">
</BODY>
在该事件方法中对后台发送浏览器窗口正在关闭的事件请求,从而使得后台能够知道浏览器窗口现在正在关闭。
这样session的close事件能够正常地被捕获。
5、测试在线计数功能是否正常。