在浏览器上登录到学生系统,实现记住用户和密码,再一次的登录时,可以不用输入,自动的登录。
实现这个用到了,Filter过滤器,使用Filter时会需要对配置文件做配置。Cookie一次会话的记录账户和密码的东西。
首先,登录页面login.jsp
因为需要提交数据,交给后台处理操作,所以使用了form表单。
Form表单的action=”/StuMan/LoginServlet”是登录时提交的数据的给的服务器,服务器LoginServlet对数据进行获取和响应的处理操作,LoginServlet前的是项目工程名。Method=”post”是提交的时的保密方式提交。
自动登录的输入标签需要注意:
<input type=”checkbox” name=”auto” value=”auto”/>自动登录<br/>
需要注意,Loginservlet在通过request.getParameter(“auto”)这括号里的auto要和<imput>里的name=”auto”一样。
其次,是LoginServlet,创建这个类是用fileàNewàservlet。
//设置浏览器请求的信息编码 request.setCharacterEncoding("utf-8"); //设置服务器响应给浏览器的信息编码 response.setContentType("text/html;charset=utf-8"); |
//获取login.jsp的form提交的信息 String name =request.getParameter("studentName"); String password =request.getParameter("password"); String auto =request.getParameter("auto"); |
//将获得的request数据放到cookie Cookie cookie =new Cookie("student",name+"&"+password); cookie.setPath(request.getContextPath()); |
//获取数据库的学生名和密码. StudentDao stuDaoImp=new StudentDaoImp(); Student stu=stuDaoImp.findOne(name,password); |
注:New Cookie(key,value); value是值,name和password作为值存放给cookie对象,key是键,这个名字可以自己任取,可看作对值个一个标识统称。当要取出值时,就可以通过key来得到相应的value
Cookie[] cookie=request.getCookies();是得到多个的cookie的key用数组存放,然后在遍历去得值。
得到数据库里的学生和密码,用来和在浏览器上得到的学生名和密码,相比较判断,如果用户在浏览器上输入的信息在数据库是存在的,就可以登录,否则不可以登录。
if(auto!=null) { cookie.setMaxAge(60); }else { cookie.setMaxAge(0); } response.addCookie(cookie); 判断auto是否有值,有的话设置cookie对象保存的时间60秒,否则立即销毁。addCookie(cookie);将登录成功,将用户名,密码给cookie添加保存。 |
//判断获得的表单内容 intflag=0;//标志,使用标志为后面的选择switch做准备
if(stu!=null) { flag=0; }else { flag=1; } //对上面登录时情况的处理 switch(flag){ case 0: request.getSession().setAttribute("stuName",name); response.sendRedirect(request.getContextPath()+"/loginSuccess.jsp"); break; |
case 1: //提示账户和密码错误,3秒后返回到登陆 response.getWriter().write("账户和密码输入错误3秒后跳回到登陆页面"); response.setHeader("refresh","3;url=/StuMan/login.jsp"); break;
} |
再是,过滤器的使用,创建àfileàNewàFilteràLoginFilter过滤器就可创建了。
要使用过滤器还得在web.xml配置它。
-
web.xml配置
<filter> <filter-name>auto</filter-name> <filter-class>com.filter.servlet.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>auto</filter-name> <url-pattern>/login.jsp</url-pattern> </filter-mapping> |
注:<filter-name>上下两个需要一样。
<filter-class>是LoginFilter在项目下的路径。
<url-pattern>是需要过滤的页面。注意login.jsp前有/。
b.LoginFilter
publicvoid doFilter(ServletRequestarg0, ServletResponsearg1, FilterChainchain)throws IOException, ServletException {
HttpServletRequest request =(HttpServletRequest)arg0; HttpServletResponse response=(HttpServletResponse)arg1; Cookie[] cookie=request.getCookies();
if(cookie!=null) { for (Cookiecookie2 :cookie) { String name=cookie2.getName(); //判断之前存的student的名和这次获得的name值是否一样。一样就进一步的获取cookie的value值,否则,就拦截,让他去先登录。 if("student".equals(name)) { String value=cookie2.getValue(); //因有多个值,所以用数组存放,按之前和多个用户值的“&”的连接,现在就以”&”分割。 String[] arr=value.split("&");
//获取数据库的学生名和密码. StudentDao stuDaoImp=new StudentDaoImp(); //根据得到的学生名和密码去数据库查学生是否存在。不存在就拦截,让他去登录页面登陆。 Student stu=stuDaoImp.findOne(arr[0],arr[1]); //判断学生名字和密码是否正确 if(stu!=null) { //将名字存放在共享域,方便其他地方用到。 request.getSession().setAttribute("stuName",arr[0]); // request.getSession().setAttribute("password", arg1); //放行登录页面login.jsp直接重定向到了成功登陆的页面loginSuccess.jsp。 response.sendRedirect(request.getContextPath()+"/loginSuccess.jsp"); }else { chain.doFilter(arg0,arg1); } }else { chain.doFilter(arg0,arg1); } }
}else { chain.doFilter(arg0,arg1); } } |
注:HttpServletRequestrequest =(HttpServletRequest) arg0;
HttpServletResponse response=(HttpServletResponse)arg1;
强制转化类型。
Cookie[]cookie=request.getCookies();
获取这次的cookie