Controller
- 파라미터 HttpSession을 사용하여 세션유무를 확인함
@GetMapping("login")
public String login(HttpSession session) {
//세션에 id키가 없을경우 로그인화면.
if(session.getAttribute("id") == null) {
return "redirect:/login.html";
}else {
return "redirect:/buserlist";
}
}
<form action="login" method="post">
아이디 : <input type="text" name="id"><br/>
비밀번호 : <input type="text" name="pwd"><br/>
<input type="submit">
@PostMapping("login")
public String login(HttpSession session,
@RequestParam("id")String id,
@RequestParam("pwd")String pwd) {
if(id.equals("kor") && pwd.equals("111")) {
//로그인 성공시 세션설정 후 자료목록 이동
session.setAttribute("idKey", id);
return "redirect:/buserlist";
}else {
return "redirect:/err.html";
}
}
${sessionScope.idkey }님 반갑습니다.<br>
<a href="logout">로그아웃</a>
<hr>
@RequestMapping(value="logout", method=RequestMethod.GET)
public String logout(HttpSession session) {
// session.invalidate(); 전부삭제
session.removeAttribute("idkey");
return "redirect:/index.html";
}
기존 AOP 개념에 대한 것은 해당 포스트를 참고하자
직원자료 출력에 관한 코드는 생략한다.
해당 DB를 출력하는 코드에 로그인 관심사항을 추가해보자.
포인트 컷의 대상은 컨트롤러이다.
로그인 페이지
<form action="login" method="post">
직원 번호 : <input type="text" name="no"><br>
직원 이름 : <input type="text" name="name"><br>
<input type="submit" value="로그인">
</form>
LoginController
dao.jikwonLogin
:
직원번호를 파라미터로 받아 직원번호,직원이름을 dto형으로 반환한다.- 로그인 form을 체크하는 매핑메소드
@Controller
public class LoginController {
@Autowired
private DataDao dao;
//로그인 화면 이동
@GetMapping("login")
public String getLogin() {
return "login";
}
//로그인 체크
@PostMapping("login")
public String postLogin(HttpSession session,
@RequestParam("no")String no,
@RequestParam("name")String name) {
JikwonDto dto = dao.jikwonLogin(no);
if(dto != null) {
//사용자가 입력한 이름과 DB내 이름이 같은경우.
String retName = dto.getJikwon_name();
if(retName.equals(name)) {
session.setAttribute("name", retName);
}
}
return "redirect:/jikwonlist"; //로그인 성공시 핵심로직 메소드 처리 Controller
}
@GetMapping("logout")
public String logout(HttpSession session) {
session.removeAttribute("name");
return "redirect:/index.html";
}
}
aspect package
MyAdvice (Advice)
: Aspect들을 관리한다. execution으로 포인트컷을 지정.LoginClass (Aspect)
: 등록된 세션을 확인하고 없으면 로그인페이지로 보낸다.
//Advice
@Component
@Aspect
public class MyAdvice {
@Autowired
private LoginClass loginClass;
//패키지 무관. jikwonProcess의 이름을 가진 포인트
@Around("execution(* jikwonProcess*(..))")
public Object aopProcess(ProceedingJoinPoint joinPoint) throws Throwable{
HttpServletRequest request = null;
HttpServletResponse response = null;
//joinPoint(jikwonProcess)의 argument를 찾는다.
//HttpServlet.. 가 있다면 request에 해당 obj를 삽입
for(Object obj: joinPoint.getArgs()) {
if(obj instanceof HttpServletRequest) {
request = (HttpServletRequest)obj;
}
if(obj instanceof HttpServletResponse) {
response = (HttpServletResponse)obj;
}
}
//session이 없어 null값 반환시 aop수행을 취소
if(loginClass.loginCheck(request, response)) {
return null;
}
Object object = joinPoint.proceed();
return object;
}
}
//Aspect
@Component
public class LoginClass {
public boolean loginCheck(HttpServletRequest request,HttpServletResponse response)
throws Exception {
//등록 세션을 얻는다.
HttpSession session = request.getSession();
//세션에 name키가 없으면 login페이지로.
if(session.getAttribute("name") == null) {
response.sendRedirect("login"); //GET
return true;
}else return false;
}
}
JikwonController
- 직원자료를 출력한다.
- execution으로 해당 메소드를 포인트컷 대상으로 지정했다.
@Controller
public class JikwonController {
@Autowired
private DataDao dataDao;
@GetMapping("jikwonlist")
public String jikwonProcess(Model model) { //pointcut 대상
ArrayList<JikwonDto> list = dataDao.jikwonList();
model.addAttribute("list",list);
return "list";
}
}
직원자료 출력중 조건부 로그아웃버튼
<body>
<h3>직원자료</h3>
<%
<!--세션이 있을때만(로그인중) 로그아웃 버튼 활성화-->
if(session.getAttribute("name") != null){
out.println("<a href='logout'>로그아웃</a>")
}
%>
<table border="1">
<tr>
..
.