88-1. 쿠키
쿠키는 F12 > Application에 들어가면 볼 수 있음
Name / Value로 구성되어 있음
아이디 저장이나 팝업창 오늘하루보지않음 같이 보안상 문제가 없는 것들을 저장해 놓음
절대로 중요한 것은 저장하면 안됨! 하지만 빠름
1. 쿠키 만드는 법
new Cookie(name값, value값);
2. expire지정하는 법
new Cookie("", "").setMaxAge(초단위); => 미국시간으로 나옴
3. 보내는법
HttpServletResponse response객체로
response.addCookie(name);
@RequestMapping("create")
public String create(HttpServletResponse response) {
// JavaScript에서도 할 수 있고 Java에서도 할 수 있음
// cookie는 name과 value가 필수!!!!!!! expire는 선택!
// name, value는 마음대로 지정해도 됨
Cookie ck = new Cookie("newjeans", "mycookie");
// name과 value는 무조건!!! 모두 문자열만!!! 가능!!!(아스키코드)
// 쿠카는 객체를 생성한 다음 응답정보에 첨부해야 발급!
// setMaxAge() == 만료시간
ck.setMaxAge(24*60*60);
// 아이디 저장 쿠키
Cookie saveId = new Cookie("saveId", "newjeans");
saveId.setMaxAge(60*60*24*28);
response.addCookie(ck);
response.addCookie(saveId);
return "cookie/create";
}
4. 쿠키 지우는 법
똑같이 Cookie객체를 만들어 => 지울 쿠키의 name값만 같으면 됨
setMaxAge(0)으로 response에 담아 보내기
@RequestMapping("delete")
public String delete(HttpServletResponse response) {
// 쿠키는 삭제 명령이 따로 없음
// 만료시간을 0초로 설정해서 덮어씌워줌
Cookie ck = new Cookie("newjeans", "delete"); // name속성만 같으면 끝
ck.setMaxAge(0);
response.addCookie(ck);
// 아이디 저장 쿠키 지우기
Cookie saveIddd = new Cookie("saveId", "delete"); // name속성만 같으면 끝
saveIddd.setMaxAge(0);
response.addCookie(saveIddd);
return "cookie/create";
}
5. JSP에서 쿠키 사용법
${ cookie.newjeans } => EL구문으로 cookie.name값으로 사용할 수 있음
<div>
쿠키 : ${ cookie.newjeans }
뉴진스 쿠키 있나요?? : ${ cookie.newjeans != null } <br>
뉴진스 쿠키 있나요?? : ${ not empty cookie.newjeans } <br> <!-- cookie.newjeans != null && cookie.newjeans != '' -->
쿠키 값 : ${ cookie.newjeans.value }
</div>
6. JSP에서 쿠키 value값 가져오기
${ cookie.newjeans.value } => 쿠키객체.name명.value
<form>
<c:choose>
<c:when test="${ not empty cookie.saveId }">
아이디 : <input type="text" value="${ cookie.saveId.value }" /> <br>
<input type="checkbox" checked>아이디저장</input>
</c:when>
<c:otherwise>
아이디 : <input type="text" /> <br>
<input type="checkbox">아이디저장</input>
</c:otherwise>
</c:choose>
</form>
<c:if test="${ not empty cookie.saveId }">
<script>
window.open("http://www.naver.com", "나는 광고야", "width=400, height=400");
</script>
</c>
88-2. 메일 인증
pom.xml에 라이브러리 추가
<!-- 6. 메일 관련 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
// 직접 객체를 생성해서 이메일을 보내는 객체
// 필요한 의존성 목록
// - spring-context-support
// - java mail-api
public class TestMail1 {
public static JavaMailSenderImpl sender;
public static void main(String[] args) {
JavaMailSenderImpl impl = new JavaMailSenderImpl();
// - 계정 설정
impl.setHost("smtp.gmail.com");
impl.setPort(587);
impl.setUsername("kh@gmail.com");
impl.setPassword("password");
// - 옵션 설정
Properties prop = new Properties();
prop.put("mail.smtp.auth", true);
prop.put("mail.smtp.starttls.enable", true);
impl.setJavaMailProperties(prop);
sender = impl;
// 메시지 생성
SimpleMailMessage message = new SimpleMailMessage();
// 메시지 정보 설정 : 제목, 내용, 첨부파일(Simple에선 불가), 받는사람, 참조, 숨은참조
message.setSubject("행운의편지");
message.setText("봇) 이 편지는 영국에서 최초로 시작되어 일년에 한 바퀴 돌면서 받는 사람에게 행운을 주었고 지금은 당신에게로 옮겨진 이 편지는 4일 안에 당신 곁을 떠나야 합니다. 이 편지를 포함해서 7통을 행운이 필요한 사람에게 보내 주셔야 합니다. 복사를 해도 좋습니다. 혹 미신이라 하실지 모르지만 사실입니다. 영국에서 HGXWCH이라는 사람은 1930년에 이 편지를 받았습니다. 그는 비서에게 복사해서 보내라고 했습니다. 며칠 뒤에 복권이 당첨되어 20억을 받았습니다. 어떤 이는 이 편지를 받았으나 96시간 이내 자신의 손에서 떠나야 한다는 사실을 잊었습니다. 그는 곧 사직되었습니다. 나중에야 이 사실을 알고 7통의 편지를 보냈는데 다시 좋은 직장을 얻었습니다. 미국의 케네디 대통령은 이 편지를 받았지만 그냥 버렸습니다. 결국 9일 후 그는 암살 당했습니다. 기억해 주세요. 이 편지를 보내면 7년의 행운이 있을 것이고 그렇지 않으면 3년의 불행이 있을 것입니다. 그리고 이 편지를 버리거나 낙서를 해서는 절대로 안됩니다. 7통입니다. 이 편지를 받은 사람은 행운이 깃들 것입니다. 힘들겠지만 좋은게 좋다고 생각하세요. 7년의 행운을 빌면서...");
String[] to = {1@gmail.com", "2@gmail.com", "3@gmail.com", "4@gmail.com"};
// 한명한테만 보낼거면 배열말고 String으로 보내면 됨
message.setTo(to);
/*
* 참조
*
* 메시지객체.setCc(참조할주소)
*
* 숨은 참조
*
* 메시지객체.setBcc(숨은 참조할 주소)
*/
// 전송
sender.send(message);
}
}
*** 객체를 bean으로 등록하는 법
root-context.xml에 등록
<!-- 메일 전송 도구 등록 -->
<bean id="sender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.gmail.com" />
<property name="port" value="587" />
<property name="username" value="kh@gmail.com" />
<property name="password" value="password" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
</props>
</property>
</bean>
@Autowired 하여
private JavaMailSender sender;로 지정하여 사용가능
SimpleMail은 html태그를 보낼 수 없음
=> MimeMassage사용
88-3. 이메일 인증
1. 인증번호 보내고 DB에 저장
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메일인증~</title>
</head>
<body>
<h1>이메일을 입력해 주세요~</h1>
<form action="mail" method="POST">
<input type="text" name="email">
<input type="submit" value="인증번호받기">
</form>
</body>
</html>
Controller
@GetMapping("inputmail")
public String inputMail() {
return "member/input";
}
// 이메일 인증
// PostMapping => Mapping값이 값아도 Post면 이리로 옴
@PostMapping("mail")
public String mail(String email, HttpServletRequest request) throws MessagingException {
MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
// 요청을 보낸 친구의 요청을 알 수 있음
String ip = request.getRemoteAddr();
// Math.random();
// 이게 더 편함↓
Random r = new Random();
int i = r.nextInt(100000);
// 자리수가 0으로 채워짐
Format f = new DecimalFormat("000000");
String secret = f.format(i);
// VO에 @Builder => 객체를 생성하면서 필드명과 같은 메소드를 실행하면서 setter의 역할을 해줌
// 내가 원하는 형태로 값을 만들어서 넣을 수 있음
CertVO certVo = CertVO.builder()
.who(ip)
.secret(secret)
.build();
memberService.sendMail(certVo);
helper.setTo(email);
helper.setSubject("인증번호를 보내드립니다.");
helper.setText("인증번호 : " + secret);
sender.send(message);
return "redirect:/";
}
Service, DAO
// Service
// 메일 인증 서비스
void sendMail(CertVO certVo);
// ServiceImpl
// 인증번호
@Override
public void sendMail(CertVO certVo) {
memberDao.sendMail(sqlSession, certVo);
}
// DAO
// 인증번호
public void sendMail(SqlSessionTemplate sqlSession, CertVO certVo) {
sqlSession.insert("memberMapper.insertSecret", certVo);
}
mapper
<!-- 메일인증 -->
<insert id="insertSecret" parameterType="com.kh.spring.member.model.vo.CertVO">
INSERT INTO CERT(who, secret, when)
VALUES (#{who}, #{secret}, sysdate)
</insert>
VO
package com.kh.spring.member.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
// Builder : 빌더 패턴. => 실무에서 볼 수 있는 디자인 패턴 2개 중 1개 (하나는 MVC패던, 하나는 Builder패턴)
// 생성자에 매개변수를 하나 지우거나(수정), 매개변수가 너무 많아서 어떤게 어떤값인지 헷갈리는 문제를 해결해줌
@Data @AllArgsConstructor @Builder
public class CertVO {
private String who, secret, when;
}
2. 인증번호 검증
JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>검증화면</title>
</head>
<body>
<h1>인증번호를 내놔라</h1>
<form action="check" method="post">
<input type="text" name="secret" />
<input type="submit" value="인증하기" />
</form>
</body>
</html>
Controller
// 인증번호 입력할 페이지
@RequestMapping("checkPage")
public String checkPage() {
return "member/check";
}
// 인증번호 맞니?
@ResponseBody
@PostMapping("check")
public String checkCode(String secret, HttpServletRequest reqeust) {
CertVO certVo = CertVO.builder()
.who(reqeust.getRemoteAddr())
.secret(secret)
.build();
boolean result = memberService.validate(certVo);
return "result:" + result;
}
Service, DAO
// Service
boolean validate(CertVO certVo);
// SerivceImpl
// 인증번호 검증
@Override
public boolean validate(CertVO certVo) {
boolean result = memberDao.validate(sqlSession, certVo);
// 인증번호가 맞으면 컬럼을 삭제
if(result != false) {
memberDao.deleteCert(sqlSession, certVo);
}
return result;
}
// DAO
// 인증번호가 맞으면 해당 컬럼을 지워줌
public void deleteCert(SqlSessionTemplate sqlSession, CertVO certVo) {
sqlSession.delete("memberMapper.deleteCert", certVo);
}
mapper
<!-- 검증된 인증번호 삭제 -->
<delete id="deleteCert" parameterType="com.kh.spring.member.model.vo.CertVO">
delete cert where who = #{who} and secret = #{secret}
</delete>
협업툴
https://www.jandi.com/landing/kr
JANDI - 가장 쉬운 업무용 협업툴 잔디
업무용 협업툴 잔디와 함께라면 신속하고 효율적인 협업을 할 수 있습니다.
www.jandi.com