(我记得:final定义的方法,子类不可以重写,但是本类可以重载)
login.jsp的功能是:呈现登陆页面
CheckcodeServlet.java的功能是:负责生成验证码的servlet
LoginServlet.java的功能是:判断用户输入的用户名、密码、以及验证码是否正确的servlet
LogoutServlet.java的功能是:销毁session,退出系统,返回到login.jsp页面
第一段代码是login.jsp
这段代码是呈现登陆页面,需要注意的点如下
1、
${error}
在LoginServlet.java中有在输入错误时设置error变量。这里用到el表达式,默认会依次搜索pageScope-->requestScope-->sessionScope-->applicationScope,然后在requestScope中找到error的值
2、
这行代码要实现的功能是如果用户输入的用户名密码或验证码错误(不一定,两句话后qq那种情况也是)然后重定向回login.jsp时,将用户上次输入的用户名、密码默认显示在输入框中,避免再次输入(譬如秋秋登陆时显示上次登陆的账号一样)。实现的方法是value="${param.username}",用到了el表达式中的param隐含对象
注意error是从request中取的,而username是从parameter中取的,因为如果先String username = request.getParameter("username"),然后在request.setAttribute("username",username),然后密码也设,将来可能还有描述也设,就会写很多的request.setAttribute("password",password)~~,太繁琐,而其实只要上次有输入过用户名密码~~就会存在parameter中,且从LoginServlet.java转向login.jsp是通过forward,request对象是继承的,就可以从上次的parameter中取出来了
3、
function reloadcode(){
var verify=document.getElementById('safecode');
verify.setAttribute('src','CheckcodeServlet?'+Math.random());
}
验证码:
当点击图片时,意味着需要重新换一张验证码,这时调用reloadcode()这段javascript代码,即修改img的src,这时系统会重新生成验证码,其实这段代码还可以简化为
function reloadcode(verify){
verify.setAttribute('src','CheckcodeServlet?'+Math.random());
}
验证码:
修改的地方即当img中没有id时(当然有id时也可以不用id,而采用这种方法),直接把this传过去
第二段代码是CheckcodeServlet.java
这段代码是负责生成验证码的servlet,需要注意的点如下:
1、下面这段代码是web.xml中的一部分
在CheckcodeServlet中的
public void init(ServletConfig config) throws ServletException {
width = Integer.parseInt(config.getInitParameter("width"));
height = Integer.parseInt(config.getInitParameter("height"));
number = Integer.parseInt(config.getInitParameter("number"));
codes = config.getInitParameter("codes");
}
即是从wen.xml的配置文件中取出init-param参数
2、//将验证码放到HTTP SESSION中
request.getSession().setAttribute("codes", sb.toString());在LoginServlet.java中检验输入的验证码正确与否时会用到session中的codes(即CheckcodeServlet.java产生的验证码)
第三段代码是LoginServlet.java
这段代码是判断用户输入的用户名、密码、以及验证码是否正确的servlet,需要注意的点如下:
1、String checkcode = request.getParameter("checkcode"); //用户输入的验证码
String sessionCodes = (String)request.getSession().getAttribute("codes");
if(!sessionCodes.equalsIgnoreCase(checkcode)) {
request.setAttribute("error", "验证码错误");
request.getRequestDispatcher("/backend/login.jsp").forward(request, response);
return;
}
首先从parameter中取出用户在login.jsp页面输入的验证码,其次从session中取出codes(即CheckcodeServlet中放入session中的codes),然后两者相比较,这里有个小知识点sessionCodes.equalsIgnoreCase(checkcode),即忽略大小写判断是否相等。
2、 request.setAttribute("error", "验证码错误");
request.getRequestDispatcher("/backend/login.jsp").forward(request, response);
当验证码(或者用户名、密码)输入错误时,设置error,然后会再login.jsp中取出error显示error的具体信息
${error}
3、当验证码正确时,调用"select * from t_admin where username = ?",判断数据库中是否存在此用户,如果存在,则调用"if(!password.equals(psw))",判断密码是否正确
4、request.getSession().setAttribute("LOGIN_ADMIN", username); 把登陆用户的信息存入session中,后面还得补充……
第四段代码是LogoutServlet.java
这段代码是实现销毁session,退出系统,返回到login.jsp页面的servlet,需要注意的点如下:
1、request.getSession().invalidate();通过调用invalidate()方法,把session中的所有数据清空,同时将session销毁