개발하는 삶
[Spring] 스코프, 필터 본문
서블릿의 스코프
- 서블릿 API에 바인딩된 속성에 대한 접근 범위
- 기능
- 로그인 상태 유지
- 장바구니
- MVC의 Model과 View의 데이터 전달 기능
- 종류
- 애플리케이션 스코프(ServletContext) : 애플리케이션 전체에 대해 접근 가능
- 세션 스코프(HttpSession) : 브라우저에서만 접근 가능
- 리퀘스트 스코프(HttpServletRequest) : 해당 요청/응답 사이클에서만 접근 가능
종류에 따라 다른 스코프 영역
SetAttribute.java
package sec01.ex01;
@WebServlet("/set")
public class SetAttribute extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String ctxMesg = "context에 바인딩됩니다.";
String sesMesg = "session에 바인딩됩니다.";
String reqMesg = "request에 바인딩됩니다.";
ServletContext ctx = getServletContext();
HttpSession session = request.getSession();
ctx.setAttribute("context", ctxMesg);
session.setAttribute("session", sesMesg);
request.setAttribute("request", reqMesg);
out.print("바인딩을 수행합니다.");
}
}
GetAttribute.java
package sec01.ex01;
@WebServlet("/get")
public class GetAttribute extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext ctx = getServletContext();
HttpSession sess = request.getSession();
String ctxMesg = (String)ctx.getAttribute("context");
String sesMesg = (String)sess.getAttribute("session");
String reqMesg = (String)request.getAttribute("request");
out.print("context값 : "+ctxMesg+"<br>");
out.print("session값 : "+sesMesg+"<br>");
out.print("request값 : "+reqMesg+"<br>");
}
결과값
set → get 접속했을 때
서버 재 시작후 get 접속시
서블릿의 여러가지 url 패턴
- 맵핑한 url 만 확인하면 됨
package sec02.ex01;
@WebServlet("/first/test")
public class TestServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String context = request.getContextPath();
String url = request.getRequestURL().toString();
String uri = request.getRequestURI();
String mapping = request.getServletPath();
out.println("<html>");
out.println("<head>");
out.println("<title>Test Servlet1</title>");
out.println("</head>");
out.println("<body bgcolor='green'>");
out.println("<b>TestServlet1입니다.</b><br>");
out.println("<b>컨텍스트 이름 : "+context+"</b><br>");
out.println("<b>전체 경로 : "+url+"</b><br>");
out.println("<b>매핑 이름 : "+mapping+"</b><br>");
out.println("<b>URI : "+uri+"</b><br>");
out.println("<body>");
out.println("</html>");
out.close();
}
}
package sec02.ex01;
@WebServlet("/first/*")
public class TestServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 위와 내용은 같음 println 내용만 살짝 다름
}
}
package sec02.ex01;
@WebServlet("*.do")
public class TestServlet3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 위와 내용은 같음 println 내용만 살짝 다름
}
}
결과값
필터
- 브라우저에서 서블릿에 요청/응답할때, 미리 요청/응답 관련해 작업을 처리하는 기능
필터 만들기
- web.xml에 설정
- 애너테이션 이용
Filter 인터페이스의 메서드
- destroy() : 필터 소멸시 종료 작업 수행
- doFilter() : 요청/응답시 컨테이너에 의해 호출되어 기능 수행
- init() : 필터 생성시 초기화 작업
여러가지 서블릿 관련 Listener API
ServletContextAttributeListener
attributeAdded()
attributeRemoved()
attributeReplaced()
- Context 객체의 속성 추가/제거/수정 이벤트 발생시 처리
HttpSessionListener
sessionCreated()
sessionDestroyed()
- 세션 객체의 생성/소멸 이벤트 발생시 처리
ServletRequestListener
requestInitialized()
requestDestroyed()
- 클라이언트의 요청 이벤트 발생시 처리
ServletRequestAttributeListener
attributedAdded()
attributedRemoved()
attributeReplaced()
- 요청 객체에 속성 추가/제거/수정 이벤트 발생시 처리
HttpSessionBindingListener
valueBound()
valueUnBound()
- 세션에 바인딩/언바인딩된 객체를 알려주는 이벤트 발생시 처리
HttpSessionAttributeListener
attributeAdded()
attributeRemoved()
attributeReplaced()
- 세션의 속성 추가/제거/수정 이벤트 발생시 처리
ServletContextListener
contextInitialized()
contextDestroyed()
- 컨텍스트 객체의 생성/소멸 이벤트 발생시 처리
HttpSessionActivationListener
sessionDidActivate()
sessionWillPassivate()
- 세션의 활성화/비활성화 이벤트 발생시 처리
HttpSessionBindingListener 활용법
로그인 폼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form name="frmLogin" method="post" action="login2" encType="UTF-8">
아이디 : <input type="text" name="user_id"><br>
비밀번호 : <input type="password" name="user_pw"><br>
<input type="submit" value="로그인">
<input type="reset" value="다시 입력">
</form>
</body>
</html>
로그인
package sec04.ex01;
@WebServlet("/login2")
public class LoginTest extends HttpServlet {
ServletContext context = null;
List user_list = new ArrayList(); //로그인한 접속자 ID를 저장하는 리스트
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
context = getServletContext();
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
// 전송된 아이디, 비밀번호 세션 등록
LoginImpl loginUser = new LoginImpl(user_id, user_pw);
if (session.isNew()) { // 새 세션(웹페이지마다의 세션(크롬, 익스 등))
session.setAttribute("loginUser", loginUser);
// 아이디, 비번 리스트에 저장
// 리스트를 웹앱 내에서 쓸 수 있도록 넘겨줌
user_list.add(user_id);
context.setAttribute("user_list", user_list);
}
out.println("<html><body>");
out.println("아이디는 "+loginUser.user_id+"<br>");
out.println("총 접속자수는"+LoginImpl.total_user+"<br>");
out.println("접속 아이디:<br>");
// 접속한 리스트를 전부 가져와 나열
List list = (ArrayList)context.getAttribute("user_list");
for(int i=0; i<list.size(); i++) {
out.println(list.get(i)+"<br>");
}
out.println("<a href = 'logout?user_id="+user_id+"'>로그아웃</a>");
out.println("</body></html>");
}
}
로그아웃
package sec04.ex01;
@WebServlet("/logout")
public class LogoutTest extends HttpServlet {
ServletContext context;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doHandle(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doHandle(request,response);
}
protected void doHandle(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
context = getServletContext(); //페이지에 대한 서블릿 실행환경 정보를 담음
HttpSession session = request.getSession();
String user_id = request.getParameter("user_id");
// 세션 종료
session.invalidate();
// 받아온 리스트 값 꺼내기
List user_list = (ArrayList)context.getAttribute("user_list");
// 로그아웃한 id를 삭제. 해당 아이디가 비어있는 user_list 로 저장.
user_list.remove(user_id);
context.removeAttribute("user_list");
context.setAttribute("user_list", user_list);
out.println("<br>로그아웃 했습니다.");
}
}
리스너
package sec04.ex01;
@WebListener
public class LoginImpl implements HttpSessionBindingListener {
String user_id;
String user_pw;
static int total_user = 0;
public LoginImpl() {
}
public LoginImpl(String user_id, String user_pw) {
this.user_id = user_id;
this.user_pw = user_pw;
}
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("세션 생성");
++total_user;
}
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("세션 소멸");
--total_user;
}
}
결과값
'Spring' 카테고리의 다른 글
[Spring] SqlSession, 트랜잭션 (0) | 2022.10.04 |
---|---|
[Spring] 쿠키, 세션, ajax (0) | 2022.08.25 |
[Spring] 스프링과 서블릿, 바인딩 (0) | 2022.08.24 |
[Spring] servlet (0) | 2022.08.18 |
[Spring] 로그인, 스프링 시큐리티 (0) | 2022.08.18 |