21.02.25~27 Untact프로젝트(회원가입~인터셉터 도입까지)
2021. 2. 27. 16:51ㆍJAVA/Spring & Vue APP 프로젝트(백엔드)
<UsrMemberController.java>
@Controller
public class UsrMemberController {
@Autowired
private MemberService memberService;
@RequestMapping("/usr/member/doJoin")
@ResponseBody
public ResultData doJoin(@RequestParam Map<String, Object> param) {
if (param.get("loginId") == null) {
return new ResultData("F-1", "loginId를 입력해주세요.");
}
Member existingMember = memberService.getMemberByLoginId((String) param.get("loginId"));
if (existingMember != null) {
return new ResultData("F-2", String.format("%s (은)는 이미 사용중인 로그인아이디 입니다.", param.get("loginId")));
}
if (param.get("loginPw") == null) {
return new ResultData("F-1", "loginPw를 입력해주세요.");
}
if (param.get("name") == null) {
return new ResultData("F-1", "이름을 입력해주세요.");
}
if (param.get("nickname") == null) {
return new ResultData("F-1", "nickname을 입력해주세요.");
}
if (param.get("cellphoneNo") == null) {
return new ResultData("F-1", "연락처를 입력해주세요.");
}
if (param.get("email") == null) {
return new ResultData("F-1", "email을 입력해주세요.");
}
return memberService.join(param);
}
@RequestMapping("/usr/member/doLogin")
@ResponseBody
public ResultData doLogin(String loginId, String loginPw, HttpSession session) {
//HttpSession session
//servlet에서와는 달리 스프링에선 session을 바로 요청해서 가져올 수 있다.
// ex) servlet에서는 requst를 통해 session을 요청하고 다시 HttpSession로 session 값을 가져왔었다.
if (loginId == null) {
return new ResultData("F-1", "loginId를 입력해주세요.");
}
Member existingMember = memberService.getMemberByLoginId(loginId);
if (existingMember == null) {
return new ResultData("F-2", "존재하지 않는 로그인아이디 입니다.", "loginId", loginId);
}
if (loginPw == null) {
return new ResultData("F-1", "loginPw를 입력해주세요.");
}
if (existingMember.getLoginPw().equals(loginPw) == false) {
return new ResultData("F-3", "비밀번호가 일치하지 않습니다.");
}
//세션에 로그인 회원 id 등록
session.setAttribute("loginedMemberId", existingMember.getId());
return new ResultData("S-1", String.format("%s님 환영합니다.", existingMember.getNickname()));
}
@RequestMapping("/usr/member/doLogout")
@ResponseBody
public ResultData doLogout(HttpSession session) {
session.removeAttribute("loginedMemberId");
return new ResultData("S-1", "로그아웃 되었습니다.");
}
@RequestMapping("/usr/member/doModify")
@ResponseBody
public ResultData doModify(@RequestParam Map<String, Object> param, HttpSession session) {
if (param.isEmpty()) {
return new ResultData("F-2", "수정할 회원정보를 입력해주세요.");
}
int loginedMemberId = (int) session.getAttribute("loginedMemberId");
param.put("id", loginedMemberId);
return memberService.modifyMember(param);
}
}
<MemberDao.xml>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sbs.untact.dao.MemberDao">
<!-- public void join(String title, String body); -->
<insert id="join" useGeneratedKeys="true" keyProperty="id">
INSERT INTO member
<set> <!-- SET 대신 set으로 감싸주는 것이 관례 -->
regDate = NOW(),
updateDate = NOW(),
loginId = #{loginId},
loginPw = #{loginPw},
`name` = #{name},
`nickname` = #{nickname},
`email` = #{email},
`cellphoneNo` = #{cellphoneNo}
</set>
</insert>
<!-- public Member getMember(@Param(value = "id") int id); -->
<select id="getMember" resultType="Member">
SELECT *
FROM `member`
WHERE loginId = #{id}
</select>
<!-- public Member getMemberByLoginId(@Param(value = "loginId") String loginId); -->
<select id="getMemberByLoginId" resultType="Member">
SELECT *
FROM `member`
WHERE loginId = #{loginId}
</select>
<!-- public void modifyMember(Map<String, Object> param); -->
<update id="modifyMember">
UPDATE member
<set>
<if test="loginPw != null || name != null || nickname != null || cellphoneNo != null || email != null">
updateDate = NOW(),
</if>
<if test="loginPw != null">
loginPw = #{loginPw},
</if>
<if test="name != null">
`name` = #{name},
</if>
<if test="nickname != null">
nickname = #{nickname},
</if>
<if test="cellphoneNo != null">
cellphoneNo = #{cellphoneNo},
</if>
<if test="email != null">
email = #{email},
</if>
</set>
WHERE id = #{id}
</update>
</mapper>
<BeforeActionIntercepter.java>
@Component("beforeActionInterceptor") // 컴포넌트 이름 설정
public class BeforeActionInterceptor implements HandlerInterceptor {
@Autowired
private MemberService memberService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
// 로그인 여부에 관련된 정보를 request에 담는다.
boolean isLogined = false;
boolean isAdmin = false;
int loginedMemberId = 0;
Member loginedMember = null;
if (session.getAttribute("loginedMemberId") != null) {
loginedMemberId = (int) session.getAttribute("loginedMemberId");
isLogined = true;
loginedMember = memberService.getMember(loginedMemberId);
isAdmin = memberService.isAdmin(loginedMemberId);
}
request.setAttribute("loginedMemberId", loginedMemberId);
request.setAttribute("isLogined", isLogined);
request.setAttribute("isAdmin", isAdmin);
request.setAttribute("loginedMember", loginedMember);
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
<NeedToLoginIntercepter.java>
@Component("needToLoginInterceptor") // 컴포넌트 이름 설정
public class NeedToLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 이 인터셉터 실행 전에 beforeActionInterceptor 가 실행되고 거기서 isLogined 라는 속성 생성
// 그래서 여기서 단순히 request.getAttribute("isLogined"); 이것만으로 로그인 여부 알 수 있음
boolean isLogined = (boolean) request.getAttribute("isLogined");
// 이 인터셉터 실행 전에 beforeActionInterceptor 가 실행되고 거기서 isAjax 라는 속성 생성
// 그래서 여기서 단순히 request.getAttribute("isAjax"); 이것만으로 해당 요청이 ajax인지 구분 가능
boolean isAjax = true;
if (isLogined == false) {
if (isAjax == false) {
response.setContentType("text/html; charset=UTF-8");
response.getWriter().append("<script>");
response.getWriter().append("alert('로그인 후 이용해주세요.');");
response.getWriter().append("location.replace('/usr/member/login?redirectUri="
+ request.getAttribute("encodedAfterLoginUri") + "');");
response.getWriter().append("</script>");
// 리턴 false;를 이후에 실행될 인터셉터와 액션이 실행되지 않음
} else {
response.setContentType("application/json; charset=UTF-8");
response.getWriter().append("{\"resultCode\":\"F-A\",\"msg\":\"로그인 후 이용해주세요.\"}");
}
return false;
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
<NeedToLogoutIntercepter.java>
@Component("needToLogoutInterceptor") // 컴포넌트 이름 설정
public class NeedToLogoutInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 이 인터셉터 실행 전에 beforeActionInterceptor 가 실행되고 거기서 isLogined 라는 속성 생성
// 그래서 여기서 단순히 request.getAttribute("isLogined"); 이것만으로 로그인 여부 알 수 있음
boolean isLogined = (boolean) request.getAttribute("isLogined");
boolean isAjax = true;
if (isLogined) {
if (isAjax == false) {
response.setContentType("text/html; charset=UTF-8");
response.getWriter().append("<script>");
response.getWriter().append("location.replace('/usr/home/main');");
response.getWriter().append("</script>");
} else {
response.setContentType("application/json; charset=UTF-8");
response.getWriter().append("{\"resultCode\":\"F-A\",\"msg\":\"로그아웃 상태에서 이용해주세요.\"}");
}
// 리턴 false;를 이후에 실행될 인터셉터와 액션이 실행되지 않음
return false;
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
'JAVA > Spring & Vue APP 프로젝트(백엔드)' 카테고리의 다른 글
21.03.04 Untact프로젝트(파일업로드 ajax방식으로 처리, 파일 반복문 처리, 파일 저장까지) (0) | 2021.03.04 |
---|---|
21.03.02 Untact프로젝트(관리자 메인화면 구현 ~ 첨부파일 업로드 및 리스팅시 섬네일 노출까지) (0) | 2021.03.02 |
21.02.28~03.01 Untact프로젝트(페이징~history.back(), location.replace() 도입까지) (0) | 2021.03.01 |
21.02.24 Untact프로젝트(게시물 삭제, 수정, 현재날짜 적용 등) (0) | 2021.02.24 |
21.02.23 Untact프로젝트(개발환경 셋팅부터 게시물 추가까지 구현) (0) | 2021.02.23 |