**인터셉터 

게시글쓰기, 상세보기, 수정, 삭제 등은 로그인 되어 있지 않은 유저는 작업을 수행할 수 없도록 하고자 하는 경우 이러한 코드를 Controller, Service, Dao 등에 작성하는 것은 이상합니다.

스프링에서는 Interceptor 나 AOP 등을 이용해서 구현 할 수 있습니다.

Interceptor는 URL을 설정해서 URL 요청이 왔을 때 메소드를 호출하도록 할 수 있습니다.


1. 로그인이 되어 있지 않으면 로그인 페이지로 이동시키고 로그인을 하면 작업을 할 수 있는 페이지로 이동하도록 만들어봅시다. 


=> Interceptor : url 요청이 왔을 때 Controller 보내기 전이나 Controller가 작업한 후에 수행할 내용을 작성할 수 있는 Spring이

제공하는 기능 

=>HandlerInterceptor 인터페이스나 HandlerInterceptorAdapter 클래스를 상속받는 클래스를 만들어서 메소드를 재정의 하고 

dispatcher-servlet(Servlet-Context.xml)에 interceptors 태그를 이용해서 설정하면 됩니다.

=> HandlerInterceptorAdapter인터페이스는 모든 메소드가 추상메소드라서 전부 재정의 해야하고 

HandlerInterceptorAdapter 클래스는 모든 메소드가 내용이 없는 상태로 구현되어 있어서 필요한 메소드만 재정의 하면 되는데 

메소드 이름을 기억하기 어려우므로 인터페이스를 이용합시;다. 



2.HandlerInterceptorAdapter를 implements 한 클래스 안의 재정의 된 메소드 설명 

=> com.seunghoo.na.AuthenticationInerceptor


1. preHandle 메소드 : Controller가 처리하기 전에 호출되는 메소드 


2. postHandle 메소드 : Controller가 사용자의 요청을 정상적으로 처리하고 난 후 호출되는 메소드 


3. afterCompletion메소드 :  Controller에서 예외 발생여부에 상관없이 호출되는 메소드 



3.HandlerInterceptorAdapter를 implements 한 클래스를 생성 

@Component

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {


// 로그인을 확인하기 위해서 session 가져오기

HttpSession session = request.getSession();

// 로그인 정보는 session의 user 속성에 저장되어 있습니다.

if (session.getAttribute("user") == null) {

// 사용자의 요청을 session에 dest라는 속성에 저장

// 로그인이 되면 원래의 요청을 처리하기 위해서

// 클라이언트 요청 전체 주소

String requestURI = request.getRequestURI();

// 현재 프로젝트 경로 가져오기

String contextPath = request.getContextPath();

String uri = requestURI.substring(contextPath.length() + 1);

// 주소 뒤에 파라미터를 가져오기

String query = request.getQueryString();

System.out.println("쿼리"+query);

System.out.println("URI"+uri);

// 실제 주소만들기

if (query == null || query.equals("null")) {

query = "";

} else {

query = "?" + query;

}

//세션에 주소 저장하기 

session.setAttribute("dest", uri+query);

//세션에 메시지 저장하기 

session.setAttribute("msg","로그인을 하셔야 이용할 수 있는 서비스 입니다.");


response.sendRedirect(contextPath + "/user/login");

return false;

}

// 로그인된 경우에는 Controller가 처리합니다.


return true;

}

4. UserController 에서 로그인을 처리하는 메소드를 수정 

=> 이전에는 무조건 시작 페이지로 가도록 되어 있었지만 요청이 있는 경우 그페이지로 이동하도록 코드를 수정 

session.setAttribute("user", user);

//이전 요청을 가져오기 

Object dest = session.getAttribute("dest");

//이전 요청이 없으면 시작페이지로 이동 

if(dest==null) {

return "redirect:/";

//이전 요청이 있으면 그 페이지로 이동 

}else {

return "redirect:/"+dest.toString();

}

**게시물 삭제

1.detail.jsp 파일에 삭제를 위한 UI 와 이벤트를 작성

=>jquery ui의 dialog 기능을 이용

1)삭제 버튼(deletebtn)을 눌렀을 때 수행되는 코드가 있으면 제거


2)파일의 하단에 대화상자로 사용할 내용 만들기

<c:if test="${user.email == vo.email}">

<link rel="stylesheet"

href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>


<div id="dialog-confirm" title="정말로 삭제?" style="display: none">

<p>삭제하시면 복구할 수 없습니다. 그래도 삭제하실 건가요?</p>

</div>


<script>

//삭제 버튼을 눌렀을 때 처리

document.getElementById("deletebtn").addEventListener(

"click", function(){

$("#dialog-confirm").dialog({

      resizable: false,

      height: "auto",

      width: 400,

      modal: true,

      buttons: {

        "삭제": function() {

          $(this).dialog("close");

          location.href="delete?bno=${vo.bno}";

        },

        "취소": function() {

          $(this).dialog("close");

        }

      }

    });

});

</script>

</c:if>


2.board.xml 파일에 게시글을 삭제하는 SQL을 작성

<!-- 게시글 삭제를 위한 SQL -->

<delete id="delete" parameterType="java.lang.Integer">

delete from springboard

where bno=#{bno}

</delete>


3.BoardDao 클래스에 게시글을 삭제하는 메소드를 생성

//글번호에 해당하는 데이터를 삭제를 하는 메소드

public void delete(int bno) {

sqlSession.delete("board.delete", bno);

}


4.BoardService 인터페이스에 게시글을 삭제하는 메소드를 선언

//게시글 삭제를 처리해 줄 메소드를 선언

public void delete(HttpServletRequest request);


5.BoardServiceImpl 클래스에 게시글을 삭제하는 메소드를 구현

@Override

public void delete(HttpServletRequest request) {

//파라미터 읽기

String bno = request.getParameter("bno");

//Dao 메소드 호출

boardDao.delete(Integer.parseInt(bno));

}


6.Controller 에 게시물 삭제를 처리해주는 메소드 생성 


@RequestMapping(value = "board/delete", method = RequestMethod.GET)

public String delete(HttpServletRequest request, RedirectAttributes attr) {

boardService.delete(request);

attr.addFlashAttribute("msg", "삭제");

return "redirect:list";

}

















 

[메일보내기]

 


1. 네이버메일 

비밀번호 전송이나 인증받기에 메일 보내는 기능을 많이 사용합니다.

POP3/SMTP 사용이 되야합니다. - 다른 곳에서 메일 받을 수 있음 



1. pom.xml 파일에 의존성 라이브러리 설정


<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

<version>${org.springframework-version}</version>

</dependency>


<dependency>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

<version>1.5.6</version>

</dependency>

 

 

 

2.list.jsp 파일의 이름을 출력하는 부분에 이메일 링크를 추가

<a href="../user/sendmail?email=${vo.email}">${vo.nickname}</a>


3.servlet-context.xml 파일에 이메일 서버 설정을 위한 bean을 생성

<!-- 메일 서버 설정 -->

<beans:bean

class="org.springframework.mail.javamail.JavaMailSenderImpl"

id="mailSender">

<beans:property value="smtp.naver.com" name="host" />

<beans:property value="587" name="port" />

<beans:property name="username" value="ggangpae3" />

<beans:property name="password" value="wnddkd"></beans:property>

<beans:property value="utf-8" name="defaultEncoding" />

<beans:property name="javaMailProperties">

<beans:props>

<beans:prop key="mail.transport.protocol">smtp</beans:prop>

<beans:prop key="mail.smtp.auth">true</beans:prop>

<beans:prop key="mail.smtp.starttls.enable">true</beans:prop>

<beans:prop key="mail.debug">true</beans:prop>

</beans:props>

</beans:property>

</beans:bean>


4.UserController 클래스에 user/sendmail 요청이 오면 메일 보내기 화면으로 이동하는 메소드를 생성


//메일 보내기 링크를 눌렀을 때 메일 보내기 화면으로 이동하는 메소드

@RequestMapping(value="user/sendmail", method=RequestMethod.GET)

public String sendmail(@RequestParam("email")String email,

Model model) {

//model에 email 저장

model.addAttribute("email", email);

return "user/sendmail";

}


5.메일 보내기 화면으로 사용할 화면을 user 디렉토리에 sendmail.jsp 파일로 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>


<%@ include file="../include/header.jsp"%>

<div class="container">

<form method="post">

<div class="form-group">

<label for="receiver">받는 사람 이메일</label> 

<input type="email" id="email"

name="receiver" value="${email}" readonly="readonly"

class="form-control" />

</div>


<div class="form-group">

<label for="title">메일 제목</label> 

<input type="text"

name="title"  

class="form-control" />

</div>

<div align="center">

<label for="contents">메일 제목</label>

<textarea class="form-control" rows="5" name="contents"></textarea>

</div>

<div align="center">

<input type="submit" value="메일 보내기" class="btn btn-warning">

</div>

</form>

</div>


<script>

email = document.getElementById("email");

email.addEventListener("click", function(e){

email.removeAttribute("readonly");

});

email.addEventListener("blur", function(e){

email.setAttribute("readonly","readonly")

})


</script>

<%@ include file="../include/footer.jsp"%>








6. userService인터페이스에 메일 보내기를 위한 메소드를 선언 

public void sendEmail(HttpServletRequest request) ;



7.userServiceImple 클래스에 메일 보내기를 위한 메소드를 구현 

@Override

public void sendEmail(HttpServletRequest request) {

String receiver =request.getParameter("receiver");

String title = request.getParameter("title");

String content = request.getParameter("content");

try {

SimpleMailMessage message = new SimpleMailMessage();

message.setFrom("ggangpae3@naver.com");

//받는 사람 설정 

message.setTo(receiver);

//메이제목설정 

message.setSubject(title);

//메일 내용설정 

message.setText(content);

//메일 보내기 

mailSender.send(message);

}catch(Exception e) {

System.out.println("email 예외 "+e.getMessage());

e.printStackTrace();

}

}


8.UserController 클래스에 메일 보내기를 눌렀을 때 처리를 위한 메소드를 생성

@RequestMapping(

value="user/sendmail", method=RequestMethod.POST)

public String sendmail(HttpServletRequest request,

RedirectAttributes attr) {

userService.sendmail(request);

attr.addFlashAttribute("msg", "메일 보내기 성공");

return "redirec:/";

}

 

log.txt




1) Map의 특징 

=> key 와 Value를 쌍으로 저장하는 자료구

=> 중복된 Key는 저장될 수 없어서 동일한 Key에 데이터를 삽입하면 수정이 발생합니다. 

=> 메소드 

=> Object 자료형은 형변환 해주어야한다. 

=> Object get(key)  : key에 해당하는 value리턴 없으면 null을 리턴 

=> void put(key, value) : key에 Value 저장

=> set keyset :  Map의 모든 key를 Set으로 리턴 



package log;


import java.io.BufferedReader;

import java.io.FileReader;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Map;

import java.util.Set;


public class LoMain4 {


public static void main(String[] args) {


// log.txt file의 내용을 읽을 수 있는 객체를 생성

// log. txt 파일은 문자열로 구성된 파일이므로 읽기 위한 클래스는

// BufferedReader를 사용하는 것이 좋습니다.



    try (BufferedReader br = new BufferedReader(new FileReader("log\\log.txt"))) {

// try()안에 객체를 생성하면 close()를 하지 않아도 됩니다.


// 텍스트 파일의 내용을 전부 읽어서 출력하기

// BufferedReader 객체에는 readLine()이라는 메소드가 있는데

// 줄 단위로 데이터를 읽고 읽은 내용을 String으로 리턴합니다.

// 마지막 줄에 가서 더이상 데이터를 읽지 못하면 null 을 리턴

// Ip별 트래픽 합계

Map<String, Object> map = new HashMap<String, Object>();

   while (true) {


String b = br.readLine();

if (b == null) {

break;

}


// b중에 공백을 기준으로 맨 앞의 데이터만 출력

// 특정한 문자나 문자열을 기준으로 분할 해주는 메소드

// split(구분자) - String [] 로 리턴합니다.

String[] ar = b.split(" ");


// Ip를 가져와서 ip에 저장

Object temp = map.get(ar[0]);

// Ip의 key값이 있나 확인해보고 

    // 값은 key가없으면 ip와 traffice을 저장


if (temp == null) {

map.put(ar[0], Integer.parseInt(ar[9]));

}

// 이미 존재하는 IP라면 Traffice에 추가해서 저장

   

else {

// 중복되기 때문에 있는 값을 가져옴

// Object get(key)  : key에 해당하는 value리턴 없으면 null을 리턴


int value = (Integer) map.get(ar[0]);

// 맵은 중복되면 값을 대체 합니다. 

// 그렇기 때문에 이미 저장된 값을 value에 저장하고

// 트래픽이 있는 ar[9]번째를 정수로 바꾸어서 합해준다.

value = value + Integer.parseInt(ar[9]);

// 다시 입력.

map.put(ar[0], value);

}


}

//맵의 모든 데이터 출력 

Set<String>keys = map.keySet();

for(String key: keys) {

System.out.println(key + ": "+ map.get(key));

}


System.out.println("=======================================");


} catch (Exception e) {

System.out.println("예외" + e.getMessage());

e.printStackTrace();

}


}


}




출처 : https://programmers.co.kr/learn/challenge_codes/1 사이트 



최근에 알고리즘 공부를 시작했습니다.

사실 너무 어렵기도 해서 포기할까 하다가 

조금씩 하루에 하나씩 풀어보기로 했습니다. 


1.약수의 모든 합을 구하시오 

프로그래머스 사이트에서 출제된 약수의 모든 합을 구하는 문제입니다. 




어떻게 풀까 고민도 많이하다가 

하나씩 생각해보기로 했습니다. 


1. 입력받은 값의 12의 약수를 구하려면, 우선 뭐가 필요한가 ? 

     반복문이 필요하다 

2. 입력받은 값의 num의 약수의합을 구하려면, 나누어 떨어지는 수를 구해야한다는 것을 알 필요가 있었고

3. 반복문 안에 if 문을 넣어 0과 같다면 그 수를 더하는 방식으로 풀면된다는 것을 생각했습니다. 



[내 풀이]






[다른 분의 풀이 방법 ]

이 문제는 약수의 합을 구하는 방식이므로 

num/2를 통해 반복문을 최소화 할 수 있습니다. 






'알고리즘' 카테고리의 다른 글

서울에서김서방찾기  (0) 2018.02.22
수박수박수박수박수박수?  (0) 2018.02.22
가운데 글자 가져오기  (0) 2018.01.23
<공부가 더필요 > 삼각형 출력하기  (0) 2018.01.21
역삼각형 출력하기  (0) 2018.01.14

+ Recent posts