🦁

【初心者向け/ITスクール50日】JSPで会員登録機能とログイン機能作成

2023/09/20に公開

はじめに

今日は、ITスクールに通った50日目の日で、今日学んだ知識を記事にシェアしたいと思います。本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。

50日目は、CookieとSessionを活用することで、直接DBと連携して、会員登録を情報を登録し、
登録した情報を元に、ログイン機能を追加することでした。
今まで学んだことを復習する感じでしたが、難しかったです!

DAO

import java.io.File;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hyon.sep193.db.MemberDBManager;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

public class MemberDAO {

	Connection con = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	MultipartRequest mr = null;
	
	private static final MemberDAO mdao= new MemberDAO();

	private MemberDAO() {}
	
	
	public static MemberDAO getMdao() {
		return mdao;
	}
	
	//Login check
	public boolean loginCheck(HttpServletRequest req) {
		Member member = (Member)req.getSession().getAttribute("member");
		return (member!=null);
	}
	
	//Login method
	public void login(HttpServletRequest req, HttpServletResponse res) {
		try {
		con = MemberDBManager.connect("hyonPool");	

		req.setCharacterEncoding("UTF-8");
		String reqId = req.getParameter("m_id");
		String reqPassword = req.getParameter("m_password");		
			
	
		String sql ="select * from sns_member where m_id=?";
		pstmt = con.prepareStatement(sql);
			
		pstmt.setString(1,reqId);
			
		rs = pstmt.executeQuery();

		if(rs.next()) {
			String dbPw = rs.getString("m_password");
			if(dbPw.equals(reqPassword)) {
			Member member = new Member(rs.getString("m_id"),dbPw, rs.getString("m_name"),
			rs.getString("m_phonenum"),rs.getDate("m_birthday"),
			URLDecoder.decode(rs.getString("m_photo"),"UTF-8"));
				
			req.setAttribute("r","<script>alert('로그인에 성공했습니다!');</script>");
				
			req.getSession().setAttribute("member", member);
			req.getSession().setMaxInactiveInterval(600);
				
			Cookie c = new Cookie("lastLoginID",reqId);
			c.setMaxAge(60*60*24*5);
			res.addCookie(c);
				
			}else {
			req.setAttribute("r","<script>alert('로그인에 실패했습니다!');location.href='HomeController';</script>");
				}
			  }
			
		}catch(Exception e) {
			
		}finally {
			MemberDBManager.close(con, pstmt, rs);
		}
	}
	
	//Logout
	public void logout(HttpServletRequest req) {
		req.getSession().setAttribute("member", null);
		req.setAttribute("r","<script>alert('로그아웃에 성공했습니다!');</script>");
	}
	
	//会員登録
	public void join(HttpServletRequest req) {
		String path =req.getServletContext().getRealPath("img");
		try {
			mr = new MultipartRequest(req, path, 10*1024*1024,"UTF-8",new DefaultFileRenamePolicy());
			//file name 
			
		    con = MemberDBManager.connect("hyonPool");
			
			String m_id = mr.getParameter("m_id");
			String m_password = mr.getParameter("m_password");
			String m_name = mr.getParameter("m_name");
			String m_phonenum = mr.getParameter("m_phonenum");
			int y = Integer.parseInt(mr.getParameter("m_birthYear"));
			int m = Integer.parseInt(mr.getParameter("m_birthMonth"));
			int d = Integer.parseInt(mr.getParameter("m_birthDay"));
			String m_birthday = String.format("%s%02d%02d", y,m,d);			
			String m_photo = mr.getFilesystemName("m_photo");
			m_photo = URLEncoder.encode(m_photo, "UTF-8").replace("+", " ");
			
			String sql = "insert into sns_member values(?,?,?,?,to_date(?,'YYYYMMDD'),?)";
			pstmt=con.prepareStatement(sql); 
			
			pstmt.setString(1,m_id);
			pstmt.setString(2,m_password);
			pstmt.setString(3,m_name);
			pstmt.setString(4,m_phonenum);
			pstmt.setString(5,m_birthday);
			pstmt.setString(6,m_photo);
			
			if(pstmt.executeUpdate()==1) {
				req.setAttribute("r", "회원 가입 성공!");
			}
		}catch(Exception e){ 
			e.printStackTrace();
		
			File f = new File(path + "/" + mr.getFilesystemName("m_photo"));
			f.delete();
			req.setAttribute("r", "회원 가입 실패");
		}finally {
			MemberDBManager.close(con, pstmt, null);
		}
	}

	
}

勉強になったとkろ

Postの場合、TomcatからEncodeができないので、Request際にHttpServletRequestオブジェクトでエンコーディングをしてInsertし、Readする際にはDecodeすること。

inputからencodingをせずに、MultipartRequestからエンコーディングするので、忘れずにすることが需要だと考えました。内容としては知ってましたが、忘れやすいところだと考えました。

また、HttpServletRequestから直接JavaScriptをattributeとして活用することができるため、イベントを設定できることが分かりました!

Discussion