카테고리 없음

0312 오후수업 (인터셉터)

unemo 2021. 3. 12. 15:32
반응형

리다이렉트어트리뷰트를 이용하면

리다이렉트를 할떄 어트리뷰투를 넘길수있게된다는것!!!

 

플래쉬어트리뷰트의 메리트가 크다

한번 나오고 사라지지만, 그게더 좋은거임

 

package com.spring.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.spring.dto.MemberVO;
import com.spring.service.MemberService;

@Controller
public class MemberController {

	@Autowired
	private MemberService memberService;
	
	@RequestMapping(value="/login", method=RequestMethod.GET)
	public void loginGET(String id, String pwd)throws Exception{
		
	}
	
	@RequestMapping(value = "/login" ,method=RequestMethod.POST)
	public String loginPOST(MemberVO loginReq,HttpSession session, RedirectAttributes rttr)throws Exception{
		String url = "redirect:main";
		String msg = null;
		
		MemberVO member = memberService.getMember(loginReq.getId());
		
		System.out.println(member);
		if(member.getId()!=null) {
			if(loginReq.getPwd().equals(member.getPwd())) {//로그인성공
				session.setAttribute("loginUser", member);
				msg="로그인성공했습니다.";
			}else {//패스워드불일치
				msg = "패스워드가 일치하지 않습니다.";
				url = "redirect:login";
			}
		}else {//존재하지않는 아이디
			msg = "존재하지않는 아이디입니다.";
			url="redirect:login";
		}
		System.out.println(url);
		rttr.addFlashAttribute("msg",msg);
		return url;
	}
	
	@RequestMapping("/logout")
	public String logout(HttpServletRequest request, HttpSession session)throws Exception{
		String url = "redirect:/login";
		session.invalidate();
		return url;
	}
	
	 @RequestMapping("/main")
	 public void main()throws Exception{}
	 
	 @RequestMapping(value="/regist", method=RequestMethod.GET)
	 public void registGET() {}
	 
	 @RequestMapping(value="/regist",method=RequestMethod.POST)
	 public String registPOST(MemberVO member, RedirectAttributes rttr)throws Exception{
		 String url = "redirect:/main";
		
		memberService.regist(member);
		rttr.addAttribute("id",member.getId());//이건 파라미터 주소로 나감!
		
		return url;
	 }
}

 

 

화면 jsp만들러..

 

 

jsp의 이부분이
여기서 가져온거임

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<form action="login" method = "post">
		아이디 : <input type="text" name="id" /><br/>
		패스워드 : <input type="password" name="pwd"/> <br/>
		<input type="submit" value="로그인"/>
	</form>

	<script>
		var msg = "${msg}";
		if(msg!=""){
			alert(msg);
		}
	</script>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h1>메인입니다.</h1>
	<button id="regist" onclick="location.href='member/regist';">회원등록</button><br/>
	<button id="logout">로그아웃</button>

<script src = "https://code.jquery.com/jquery-1.12.4.min.js"></script>

	<script>
		var msg = "${msg}";
		if(msg!=""){
			alert(msg);
		}
		var id = "${param.id}";
		if(id!=""){
			alert(id+"임이 등록되었습니다.");
		}
		
		$('button#logout').on('click',function(){
			location.href="logout";
		});
	</script>
</body>
</html>

 

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<form action="regist" method="post">
		아이디 : <input type="text" name="id" /><br/>
		패스워드 : <input type="pwd" name="pwd" /><br/>
		이메일 : <input type="email" name="email" /><br/>
		전화번호 : <input type="text" name="phone" /><br/>
		
		<input type="submit" value="등록"/>
	</form>
</body>
</html>

 

 

거능방식으로 인터셉터를 만들어야함

인터셉터어댑터를 가져와서 임플리먼트 하는 방식임

인터셉터  패키지

 

1. 로그인한 사용자의 로그를 기록

 

 

우클릭-소스-오버라이드

 

post~ 컨트롤러실행후 : 중요한건 모델이 넘어온다는거.. 

 

컨트롤러에서 심어놓은 뷰이름과 모델을 꺼낼수잇고 바꿀수도잇다

 

 

after~ 뷰이름넘어간다음 :익셉션을 받을수잇음

이미 뷰화면이 넘어간 다음이기떄문에 모델은 없다.

 

pre ~ 는 리턴을 트루하게되면 컨ㅌ트롤러가 실행되고, false하게되면 컨트롤러실행되지않음

즉 컨트롤러의 작동여부를 핸들링하게된다

 

 

우리는 포트스만 쓸것

 

@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {

		//로그인처리끝난다음
		MemberVO loginUser = (MemberVO)request.getSession().getAttribute("loginUser");
		
		if(loginUser == null) return;
		
		//로그인정보를 스트링으로 저장
		String tag = "[login:user]";
		String log = tag+","+loginUser.getId()+","
				+loginUser.getPhone()+","
				+loginUser.getEmail()+","
				+request.getRemoteAddr() + ","
				+new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());
	
	
		//로그파일생성
		String savePath = "d:\\log";
		File file = new File(savePath);
		if(!file.exists()) {
			file.mkdirs();
		}
		String logFilePath = savePath + File.separator + "login_user_log.csv";
		BufferedWriter out = new BufferedWriter(new FileWriter(logFilePath,true));
		
		//로그를 기록
		out.write(log);
		out.newLine();
		out.close();
	
	}

로그인한다음 로그인한ㅅ ㅏ용자의 정보를 알고싶다면?

로그인성공하면 세션에 로그인 유저를 심는데, 그걸 타겟으로 하자

세션에 로그인유저가 잇/없

 

로그인포스트컨츠롤러 실행후 세션에로그인유저잇으면 로긴됏다는거임 이떄 꺼내가지고 로그에 기록하면된다.

 

이거를 디스캐펴서블렛이 이 인터셉터를 건들ㅇ수잇도록 설정을 해줘야함

그걸 설정하는데는 서블렛컨텍스트

 

 

 

라인단위로 저장시 true 줘야함

 

   
   <interceptors>
   	<interceptor>
   		<mapping path="/login"/>
   		<beans:bean class="com.spring.interceptor.LoginUserLogInterceptor"/> 
   	</interceptor>
   </interceptors>
   

서블레컨텍스트에 추가

 

 

 

csv 파일로 만드는 이유

 

엑셀로 열떄 정렬이 되기때문

 

 

(오류낫엇음 serviceimpl에 어노테이션안달아서)

 

병원지료의 나이, 평균연령, 통계,, 로그활용가능

 

인터셉터 만들어볼거임

 

인터셉터는 로그를 만들떄 많이쓰고, 인허가에대한권한부여나 차단은 필터임 (필터는 1층현관의 출입구같은거니까)

 

그래서 지금하려는기능은원래 필터의 역할이지만 연습삼아!

프리핸들러 (아예 로그인을 안하면 메인컨트롤러를 실행못하ㅔㄱ만들고 돌릴거임)

 

'''

 

 

이건 메인 유알엘 요청되엇을떄 로그인안하면 로그인 화면으로 돌리는 인터셉터

package com.spring.interceptor;

import java.io.PrintWriter;

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

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.spring.dto.MemberVO;


public class Authenticationinterceptor extends HandlerInterceptorAdapter{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		//결과로 사용되는 result
		boolean result = true;
		
		HttpSession session = request.getSession();
		
		MemberVO loginUser = (MemberVO)session.getAttribute("loginUser");
		
		if(loginUser==null) {
			result = false;
			
			response.setContentType("text/html;charset=utf-8");
			
			PrintWriter out = response.getWriter();
			
			out.print("<script>");
			out.print("alert('로그인이 필요합니다.');");
			out.print("location.href='"+request.getContextPath()+"/login';");
			out.print("</script>");
		}
		
		//리절트를 false로 돌리면 컨트롤러 실행안함
		return result;
		
	}

	
	
}

 

인터셉터로 등록해야됨

서블릿컨텍스트

<interceptors>
   	<interceptor>
   		<mapping path="/main"/>
   		<mapping path="/member/regist"/>
   		<beans:bean class="com.spring.interceptor.Authenticationinterceptor"/> 
   	</interceptor>
   	<interceptor>
   		<mapping path="/login"/>
   		<beans:bean class="com.spring.interceptor.LoginUserLogInterceptor"/> 
   	</interceptor>
   </interceptors>

우리유알엘 두개임 main. regist 두개 다 차단할거임

 

 

 


등록되는 사용자의 정보를 적는 인터셉터

 

레지스트멤버로그인터ㄹ셉터

 

리다이렉트를 할떄 어트리뷰투를 넘길수있게된다는것!!!

 

 

 

플래쉬어트리뷰트의 메리트가 크다

 

한번 나오고 사라지지만, 그게더 좋은거임

 

 

 

package com.spring.controller;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.servlet.mvc.support.RedirectAttributes;

 

import com.spring.dto.MemberVO;

import com.spring.service.MemberService;

 

@Controller

public class MemberController {

 

 @Autowired

 private MemberService memberService;

 

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

 public void loginGET(String id, String pwd)throws Exception{

  

 }

 

 @RequestMapping(value = "/login" ,method=RequestMethod.POST)

 public String loginPOST(MemberVO loginReq,HttpSession session, RedirectAttributes rttr)throws Exception{

  String url = "redirect:main";

  String msg = null;

  

  MemberVO member = memberService.getMember(loginReq.getId());

  

  System.out.println(member);

  if(member.getId()!=null) {

   if(loginReq.getPwd().equals(member.getPwd())) {//로그인성공

    session.setAttribute("loginUser", member);

    msg="로그인성공했습니다.";

   }else {//패스워드불일치

    msg = "패스워드가 일치하지 않습니다.";

    url = "redirect:login";

   }

  }else {//존재하지않는 아이디

   msg = "존재하지않는 아이디입니다.";

   url="redirect:login";

  }

  System.out.println(url);

  rttr.addFlashAttribute("msg",msg);

  return url;

 }

 

 @RequestMapping("/logout")

 public String logout(HttpServletRequest request, HttpSession session)throws Exception{

  String url = "redirect:/login";

  session.invalidate();

  return url;

 }

 

  @RequestMapping("/main")

  public void main()throws Exception{}

  

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

  public void registGET() {}

  

  @RequestMapping(value="/regist",method=RequestMethod.POST)

  public String registPOST(MemberVO member, RedirectAttributes rttr)throws Exception{

   String url = "redirect:/main";

  

  memberService.regist(member);

  rttr.addAttribute("id",member.getId());//이건 파라미터 주소로 나감!

  

  return url;

  }

}

 

 

 

 

화면 jsp만들러..

 

 

 

jsp의 이부분이

여기서 가져온거임

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

 <form action="login" method = "post">

  아이디 : <input type="text" name="id" /><br/>

  패스워드 : <input type="password" name="pwd"/> <br/>

  <input type="submit" value="로그인"/>

 </form>

 

 <script>

  var msg = "${msg}";

  if(msg!=""){

   alert(msg);

  }

 </script>

</body>

</html>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

 <h1>메인입니다.</h1>

 <button id="regist" onclick="location.href='member/regist';">회원등록</button><br/>

 <button id="logout">로그아웃</button>

 

<script src = "https://code.jquery.com/jquery-1.12.4.min.js"></script>

 

 <script>

  var msg = "${msg}";

  if(msg!=""){

   alert(msg);

  }

  var id = "${param.id}";

  if(id!=""){

   alert(id+"임이 등록되었습니다.");

  }

  

  $('button#logout').on('click',function(){

   location.href="logout";

  });

 </script>

</body>

</html>

 

 

 

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

 <form action="regist" method="post">

  아이디 : <input type="text" name="id" /><br/>

  패스워드 : <input type="pwd" name="pwd" /><br/>

  이메일 : <input type="email" name="email" /><br/>

  전화번호 : <input type="text" name="phone" /><br/>

  

  <input type="submit" value="등록"/>

 </form>

</body>

</html>

 

 

 

 

거능방식으로 인터셉터를 만들어야함

 

인터셉터어댑터를 가져와서 임플리먼트 하는 방식임

 

인터셉터 패키지

 

 

 

1. 로그인한 사용자의 로그를 기록

 

우클릭-소스-오버라이드

 

 

 

post~ 컨트롤러실행후 : 중요한건 모델이 넘어온다는거.. 

 

컨트롤러에서 심어놓은 뷰이름과 모델을 꺼낼수잇고 바꿀수도잇다

 

 

after~ 뷰이름넘어간다음 :익셉션을 받을수잇음

 

이미 뷰화면이 넘어간 다음이기떄문에 모델은 없다.

 

 

 

pre ~ 는 리턴을 트루하게되면 컨ㅌ트롤러가 실행되고, false하게되면 컨트롤러실행되지않음

 

즉 컨트롤러의 작동여부를 핸들링하게된다

 

 

 

 

 

우리는 포트스만 쓸것

 

 

 

@Override

 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

   ModelAndView modelAndView) throws Exception {

 

  //로그인처리끝난다음

  MemberVO loginUser = (MemberVO)request.getSession().getAttribute("loginUser");

  

  if(loginUser == null) return;

  

  //로그인정보를 스트링으로 저장

  String tag = "[login:user]";

  String log = tag+","+loginUser.getId()+","

    +loginUser.getPhone()+","

    +loginUser.getEmail()+","

    +request.getRemoteAddr() + ","

    +new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());

 

 

  //로그파일생성

  String savePath = "d:\\log";

  File file = new File(savePath);

  if(!file.exists()) {

   file.mkdirs();

  }

  String logFilePath = savePath + File.separator + "login_user_log.csv";

  BufferedWriter out = new BufferedWriter(new FileWriter(logFilePath,true));

  

  //로그를 기록

  out.write(log);

  out.newLine();

  out.close();

 

 }

로그인한다음 로그인한ㅅ ㅏ용자의 정보를 알고싶다면?

 

로그인성공하면 세션에 로그인 유저를 심는데, 그걸 타겟으로 하자

 

세션에 로그인유저가 잇/없

 

 

 

로그인포스트컨츠롤러 실행후 세션에로그인유저잇으면 로긴됏다는거임 이떄 꺼내가지고 로그에 기록하면된다.

 

 

 

이거를 디스캐펴서블렛이 이 인터셉터를 건들ㅇ수잇도록 설정을 해줘야함

 

그걸 설정하는데는 서블렛컨텍스트

 

 

 

 

 

라인단위로 저장시 true 줘야함

   

   <interceptors>

    <interceptor>

     <mapping path="/login"/>

     <beans:bean class="com.spring.interceptor.LoginUserLogInterceptor"/> 

    </interceptor>

   </interceptors>

   

서블레컨텍스트에 추가

 

 

 

csv 파일로 만드는 이유

 

엑셀로 열떄 정렬이 되기때문

 

 

(오류낫엇음 serviceimpl에 어노테이션안달아서)

 

 

 

병원지료의 나이, 평균연령, 통계,, 로그활용가능

 

 

 

인터셉터 만들어볼거임

 

 

 

인터셉터는 로그를 만들떄 많이쓰고, 인허가에대한권한부여나 차단은 필터임 (필터는 1층현관의 출입구같은거니까)

 

 

 

그래서 지금하려는기능은원래 필터의 역할이지만 연습삼아!

 

프리핸들러 (아예 로그인을 안하면 메인컨트롤러를 실행못하ㅔㄱ만들고 돌릴거임)

 

'''

 

 

이건 메인 유알엘 요청되엇을떄 로그인안하면 로그인 화면으로 돌리는 인터셉터

 

package com.spring.interceptor;

 

import java.io.PrintWriter;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

 

import com.spring.dto.MemberVO;

 

 

public class Authenticationinterceptor extends HandlerInterceptorAdapter{

 

 @Override

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

   throws Exception {

 

  //결과로 사용되는 result

  boolean result = true;

  

  HttpSession session = request.getSession();

  

  MemberVO loginUser = (MemberVO)session.getAttribute("loginUser");

  

  if(loginUser==null) {

   result = false;

   

   response.setContentType("text/html;charset=utf-8");

   

   PrintWriter out = response.getWriter();

   

   out.print("<script>");

   out.print("alert('로그인이 필요합니다.');");

   out.print("location.href='"+request.getContextPath()+"/login';");

   out.print("</script>");

  }

  

  //리절트를 false로 돌리면 컨트롤러 실행안함

  return result;

  

 }

 

 

 

}

 

 

인터셉터로 등록해야됨

 

서블릿컨텍스트

 

<interceptors>

    <interceptor>

     <mapping path="/main"/>

     <mapping path="/member/regist"/>

     <beans:bean class="com.spring.interceptor.Authenticationinterceptor"/> 

    </interceptor>

    <interceptor>

     <mapping path="/login"/>

     <beans:bean class="com.spring.interceptor.LoginUserLogInterceptor"/> 

    </interceptor>

   </interceptors>

우리유알엘 두개임 main. regist 두개 다 차단할거임

 

 

 

등록되는 사용자의 정보를 적는 인터셉터

 

 

 

레지스트멤버로그인터ㄹ셉터

 

 

 

 

이렇게 모델에 넣어두고

 

로그파일을 로그인유저어댑터처럼 파일을 생성하고 넣어야함

package com.spring.interceptor;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.spring.dto.MemberVO;

public class RegistMemberLoginInterceptor extends HandlerInterceptorAdapter {

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
			
	
		Map<String, Object> model = modelAndView.getModel();
		MemberVO registMember = (MemberVO)model.get("registMemeber");
		
		if(registMember == null) return;
		
		HttpSession session = request.getSession();
		MemberVO loginUser = (MemberVO)session.getAttribute("loginUser");
		
		String logStr = "[User:regist],"
				+loginUser.getId()+","
				+registMember.getId()+","
				+registMember.getPhone()+","
				+registMember.getEmail()+","
				+new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());
		
		//로그파일생성
				String savePath = "d:\\log";
				File file = new File(savePath);
				if(!file.exists()) {
					file.mkdirs();
				}
				String logFilePath = savePath + File.separator + "regist_user_log.csv";
				BufferedWriter out = new BufferedWriter(new FileWriter(logFilePath,true));
				
				//로그를 기록
				out.write(logStr);
				out.newLine();
				out.close();
	}

}

 

 

리다이렉트어트리뷰트를 사용하면

어댑터나 인터셉트쪽으로 모델을 넘기지않음... 

 

그래서 리다이렉트어트리뷰트를 지우고 모델만 남겨야 됨

 

 

 

 

 

 

 

 

반응형