①创建数据库,创建用户表;
②实现登录功能,查询用户表进行校验;
数据访问层:
- public class UserDaoImpl implements IUserDao {
- @Override
- public Integer selectUser(String userName, String password) {
- String sql="select userId from user where userName = ? and password = ?";
- BaseDao.setPst(sql,new Object[]{userName,password});
- List
- if(rows.size()>0){
- return (Integer) rows.get(0).get("userId");
- }
- return -1;
- }
- }
事务逻辑层:
- public class IUserServiceImpl implements IUserService {
- IUserDao userDao = new UserDaoImpl();
- @Override
- public Boolean login(String userName, String password) {
- return userDao.selectUser(userName,password)>0;
- }
- }
servlet :
- @WebServlet(urlPatterns = "/LoginServlet")
- public class LoginServlet extends HttpServlet {
- IUserService userService = new IUserServiceImpl();
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String userName = req.getParameter("userName");
- String password = req.getParameter("password");
- if(userService.login(userName,password)){
- System.out.println("登录成功");
- HttpSession session =req.getSession();
- session.setAttribute("userName",userName);
- session.setAttribute("password",password);
- System.out.println(session.getId());
- req.getRequestDispatcher("/success.jsp").forward(req,resp);
- }else {
- System.out.println("登录失败");
- req.getRequestDispatcher("/fail.jsp").forward(req,resp);
- }
- }
- }
会话技术,可以实现会话跟踪,不同请求发送的数据能够进行共享。
目的:对于http协议来说每一次请求之间相互独立,互不关联,无法在多次请求之间共享数据,cookie和session就是用来解决共享数据问题。
区别:
cookie:在客户端(浏览器)存储数据,用户多次请求的数据跟踪(数据共享);
session:在服务器端的内存中存储数据,用于在一次会话的多次请求间共享数据,进行数据跟踪。
- //创建cookie对象
- Cookie ck = new Cookie(String name,String value);
-
- //将cookie对象添加到浏览器
- resp.addCookie(ck);
-
- //获取浏览器请求中的cookie对象
- Cookie[] cookies = request.getCookies()
-
- //获取cookie的name
- ck.getName();
-
- //获取cookie的value
- ck.getValue();
通过Http协议中的响应头set-cookie和请求头cookie完成的。
cookie 是由服务器设置到浏览器中的。
①cookie的保存时间:
默认情况下是瞬时的,关闭浏览器后销毁;
通过 ck.setMaxAge(60*2); 方法设置时间;(参数:正数,保存时间(/秒) ;负数:默认(瞬时cookie);0:删除cookie)
②cookie中存储的是字符串,并且不能有其他的特殊的符号,如:” ,“,中文内容在Tomcat8之前的版本也不可以;
③浏览器对单个cookie的数据大小也有限制(<=4k)。
过程:
①在访问登录页面前判断浏览器中的cookie是否已经保存有登录的信息,在信息匹配成功的情况下通过转发的方式到成功登录的页面,否则继续访问登录页面;
②登录页面,先判断账号密码是否正确,再判断是否勾选了自动登录,是 则创建一个新的cookie并设置到浏览器,否 则不创建,直接转发到新页面。
访问登录页面时:
- @WebServlet(urlPatterns = "/ToLoginServlet")
- public class ToLoginServlet extends HttpServlet {
- StudentDaoImpl studentDao = new StudentDaoImpl();
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- Cookie[] cks = req.getCookies();
- if(cks!=null){
- for (Cookie ck:cks) {
- System.out.println(ck);
- for (Student stu:studentDao.selectAllStu()) {
- if (stu.getStuName().equals(ck.getValue())){
- req.getRequestDispatcher("/main.jsp").forward(req,resp);
- return;
- }
- }
- }
- }
- req.getRequestDispatcher("/login.jsp").forward(req,resp);
- }
- }
登录页面:
- @WebServlet(urlPatterns = "/LoginServlet")
- public class LoginServlet extends HttpServlet {
- ILoginAndRegisterService loginAndRegisterService = new LoginAndRegisterService();
- IStudentDao studentDao = new StudentDaoImpl();
- Student student = null;
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String userName = req.getParameter("userName");
- String password = req.getParameter("password");
- System.out.println(userName);
- System.out.println(password);
- int userId = loginAndRegisterService.userLogin(userName,password);
- if(userId>0){
- System.out.println("登录成功!");
- System.out.println(userId);
- System.out.println(student.toString());
- Cookie ck = new Cookie(String.valueOf(userId),student.getStuName());
-
- ck.setMaxAge(60*2);//存活 2min
- resp.addCookie(ck);
- RequestDispatcher rd = req.getRequestDispatcher("/main.jsp");
- rd.forward(req,resp);
- }else {
- System.out.println("登录失败!");
- req.setAttribute("message","登录失败!");
- req.getRequestDispatcher("/login.jsp").forward(req,resp);
- }
- }
- }
- //直接获取session,不存在就创建一个
- HttpSession session =req.getSession();
-
- //设置session的值
- session.setAttribute("userName",userName);
- session.setAttribute("password",password);
-
- //获取session ID
- System.out.println(session.getId());
-
- //根据session的name获取session的值
- String userName = (String)req.getSession().getAttribute("userName");
- String password = (String)req.getSession().getAttribute("password");
-
- //删除session
- req.getSession().removeAttribute("userName");
-
- //销毁session
- session.invalidate();
只在一次对话的多次请求之间共享数据,cookie的数据存储在浏览器上容易被修改,session更加安全,而且如果使用重定向的方式跳转页面,由于不能通过request传输数据,cookie就不能进行数据共享。
①session 的实现是依赖于cookie的;
②session是在服务器的内存中开辟空间存储的。
当客户端关闭之后再次打开获得session不是同一个,原因是浏览器上存储的cookie是瞬时的,可以通过设置cookie来实现相同。
- Cookie ck = new Cookie("JSESSINOID",session.getId());
- ck.setMaxAge(60*60);
- resp.addCookie(ck);
默认的失效时间是30min
查看路径:
tomcat的位置\apache-tomcat-9.0.38-windows-x64\apache-tomcat-9.0.38\conf\web.xml
实现过程和cookie的相同,只是把cookie换成了session。
ToLoginServlet :
- @WebServlet("/ToLoginServlet")
- public class ToLoginServlet extends HttpServlet {
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //根据session的name获取session的值
- String userName = (String)req.getSession().getAttribute("userName");
- String password = (String)req.getSession().getAttribute("password");
- System.out.println(userName);
- System.out.println(password);
-
- System.out.println(req.getSession().getId());
- if(userName!=null&&password!=null){
- req.getRequestDispatcher("/success.jsp").forward(req,resp);
- }else {
- req.getRequestDispatcher("/login.jsp").forward(req,resp);
- }
- }
- }
LoginServlet:
- @WebServlet(urlPatterns = "/LoginServlet")
- public class LoginServlet extends HttpServlet {
- IUserService userService = new IUserServiceImpl();
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String userName = req.getParameter("userName");
- String password = req.getParameter("password");
- if(userService.login(userName,password)){
- System.out.println("登录成功");
- //直接获取session,不存在就创建一个
- HttpSession session =req.getSession();
- //设置session的值
- session.setAttribute("userName",userName);
- session.setAttribute("password",password);
- //获取session ID
- System.out.println(session.getId());
-
- req.getRequestDispatcher("/success.jsp").forward(req,resp);
- }else {
- System.out.println("登录失败");
- req.getRequestDispatcher("/fail.jsp").forward(req,resp);
- }
- }
- }