登录功能

  1. 整体思路

  1. 设置欢迎页:设置完欢迎页之后,tomcat启动后会自动跳转到欢迎页而不是index.jsp

  1. 登录的整体步骤:

    • 已经拥有前端页面:login.jsp,登录成功,跳转到业务主页面,登录失败输出提示信息,回到登录页面
    • 编写Dao层:接口和实现类,它的作用是从数据库中获取登录的用户
      //通过userCode从数据库中查询数据,并将其赋值给Java实体类user
      public User getLoginUser(Connection connection, String userCode) throws Exception {
      		PreparedStatement pstm = null;
      		ResultSet rs = null;
      		User user = null;
      		if(null != connection){
      			String sql = "select * from smbms_user where userCode=?";
      			Object[] params = {userCode};
      			rs = BaseDao.execute(connection, pstm, rs, sql, params);
      			if(rs.next()){
      				user = new User();
      				user.setId(rs.getInt("id"));
      				user.setUserCode(rs.getString("userCode"));
      				user.setUserName(rs.getString("userName"));
      				user.setUserPassword(rs.getString("userPassword"));
      				user.setGender(rs.getInt("gender"));
      				user.setBirthday(rs.getDate("birthday"));
      				user.setPhone(rs.getString("phone"));
      				user.setAddress(rs.getString("address"));
      				user.setUserRole(rs.getInt("userRole"));
      				user.setCreatedBy(rs.getInt("createdBy"));
      				user.setCreationDate(rs.getTimestamp("creationDate"));
      				user.setModifyBy(rs.getInt("modifyBy"));
      				user.setModifyDate(rs.getTimestamp("modifyDate"));
      			}
      			//connection设成null不让其关闭,是因为后面业务层还需要数据库连接。
      			BaseDao.closeResource(null, pstm, rs);
      		}
      		return user;
      	}
    
    • 编写Service层:调用Dao层,获取业务所需要的数据,登录的接口及其实现类
      public class UserServiceImpl implements UserService{
      	//创建UserServiceImpl就会实例化userDao
      	private UserDao userDao;
      	public UserServiceImpl(){
      		userDao = new UserDaoImpl();
      	}
        //通过前端传过来的姓名和密码对比数据库中查询到的
      	public User login(String userCode, String userPassword) {
      		Connection connection = null;
      		User user = null;
      		try {
      			connection = BaseDao.getConnection();
      			user = userDao.getLoginUser(connection, userCode);
      		} catch (Exception e) {
      			e.printStackTrace();
      		}finally{
      			BaseDao.closeResource(connection, null, null);
      		}
      		
      		//匹配密码
      		if(null != user){
      			if(!user.getUserPassword().equals(userPassword))
      				user = null;
      		}
      		
      		return user;
      	}
      }
    
    • 编写servlet:接受用户的请求交给业务层去做,这里用户的请求是登录,业务层要做的是在数据库中匹配输入的用户名和密码。
      public class LoginServlet extends HttpServlet {
          //servlet:控制层,接收用户的请求,调用业务层代码。
    
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //从前端获取用户名和密码(接收用户的请求)
              String userCode = req.getParameter("userCode");
              String userPassword = req.getParameter("userPassword");
    
              //接收请求后需处理业务,业务是:和数据库中的数据进行对比,所以需调用业务层
              UserServiceImpl userService = new UserServiceImpl();
              User user = userService.login(userCode, userPassword);//这里已经把登录的人给查出来了
              
              //service层返回的就是user对象
              if(user != null){//查有此人,可以登录
                  //将用户的信息放入Session中
                  req.getSession().setAttribute(Constant.USER_SESSION , user);
                  //跳转主页(跳转到另一个页面,地址变了,所以用重定向)
                  resp.sendRedirect("jsp/frame.jsp");
    
              }else{//查无此人,无法登录
                  //转发会登录页面,顺带提示它,用户名或密码错误。((跳转到本页面,只是在本页面加了些信息(用户名或密码错误),地址没变,所以用请求转发))
                  req.setAttribute("error" , "用户名或密码错误");//请求可以携带数据
                  req.getRequestDispatcher("login.jsp").forward(req , resp);
    
              }
          }
    
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
    
    • 注册servlet
      <!--servlet-->
      <servlet>
          <servlet-name>LoginServlet</servlet-name>
          <servlet-class>com.test.servlet.user.LoginServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>LoginServlet</servlet-name>
          <url-pattern>/login.do</url-pattern>
      </servlet-mapping>
    
    • 登录功能的一些优化:注销功能,登录拦截
    • 注销功能:当用户点击注销之后,移除session,返回登录界面;
      public class LogoutServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              req.getSession().removeAttribute(Constant.USER_SESSION);//将session销毁
              resp.sendRedirect(req.getContextPath() + "/login.jsp");//跳转回登录页面
          }
    
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
    
      <!--注销-->
          <servlet>
              <servlet-name>LogoutServlet</servlet-name>
              <servlet-class>com.test.servlet.user.LogoutServlet</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>LogoutServlet</servlet-name>
              <url-pattern>/jsp/logout.do</url-pattern>
          </servlet-mapping>
    
    • 登陆拦截优化:拦截判断的条件是 session中有无user这个属性,因为在用户注销,或还没登录的情况下,session中没有user这个属性,如果没有,说明不是正常登录,进行拦截;只有当正常登录时,会创建session中user这个属性,此时可以正常登录。
      public class SysFilter implements Filter {
          public void init(FilterConfig filterConfig) throws ServletException {
    
          }
    
          public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
              HttpServletRequest request = (HttpServletRequest) req;
              HttpServletResponse response = (HttpServletResponse) resp;
    
              //过滤器,从session中获取用户
              User user = (User) request.getSession().getAttribute(Constant.USER_SESSION);
              if(user == null){//session已经被移除,或者用户注销,或还没登录
                  response.sendRedirect("error.jsp");
              }else{
                  chain.doFilter(req , resp);
              }
          }
    
          public void destroy() {
    
          }
      }
    
      <!--用户登录过滤器-->
        <filter>
            <filter-name>SysFilter</filter-name>
            <filter-class>com.tong.filter.SysFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>SysFilter</filter-name>
            <url-pattern>/jsp/*</url-pattern>
        </filter-mapping>
    
posted @   Hanyta  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示