session의 두 가지 작은 사례

세션을 배우고 두 개의 작은 사례를 써서 세션에 대한 공고함을 깊이 있게 하세요.
1. 사용자 로그인 사례
html 페이지에 로그인하여 제출한 후 파라미터를 로그인을 처리하는 servlet에 가져다 줍니다. 이 servlet은 로그인한 사용자 이름과 비밀번호를 얻고 이 정보를session에 저장합니다. 다른 servlet은 처리할 때session에서 사용자의 정보를 받아서 로그인 여부를 판단하고 해당하는 동작을 수행합니다.주로 우리가 흔히 볼 수 있는 장면을 모의해 봅시다: 로그인 후 웹 페이지에: 즐겁게 드세요, xxx.
우선 환영 페이지 index를 보겠습니다.jsp(여기는 간단한 시뮬레이션일 뿐, 뒤에 jsp의 라벨을 배우면 더욱 인성화할 수 있다)
<%@page import="login.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>welcome page</title>	
  </head>
  <body>
    	   :
    	<%
    		User user = (User)session.getAttribute("user");
    		if(user != null)
    			out.write(user.getUsername());
    	 %>
    	 <br/>
    	 <a href="/test/login.html">  </a>
  </body>
</html>

세션에서user를 받지 못하면 로그인하지 않았다는 뜻입니다. 로그인 연결을 클릭하면 로그인 페이지login으로 넘어갑니다.html:
<!DOCTYPE html>
<html>
  <head>
    <title>form.html</title>	
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
  </head>
  <body>
    <form action="/test/servlet/LoginServlet" method="post">
    	   :<input type="text" name="username"/><br/>
    	  :<input type="password" name="password"/><br/>   		
    	<input type="submit" value="  "/>
    	
    </form>
  </body>
</html>

제출을 클릭하면 로그인 요청을 처리하기 위해 LoginServlet에 넘깁니다. 다음은 LoginServlet을 보겠습니다.java:
public class LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		User user = DB.find(username, password);
		if(user == null) {
			out.write("   ,        !");
			return;
		}
		
		//   session        ,          
		//  ,    servlet ,        session     user           
		//User user = (User)request.getSession().getAttribute("user");
		//if(user != null)...
		request.getSession().setAttribute("user", user); //   jsp    user    		
		response.sendRedirect("/test/index.jsp"); //    index.jsp  

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}
//     
class DB {	
	private static List<User> list = new ArrayList();	
	static {		
		list.add(new User("aaa", "123"));
		list.add(new User("bbb", "123"));
		list.add(new User("ccc", "123"));
		list.add(new User("ddd", "123"));
	}
	
	//            
	public static User find(String username, String password) {		
		for(User user : list) {
			
			if(user.getUsername().equals(username) && user.getPassword().equals(password)) {
				return user;
			}			
		}		
		return null;
	}	
}

마지막으로 User를 첨부합니다.java류, 간단해...
public class User {	
	private String username;
	private String password;		
	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

2. 사용자 중복 제출 방지
jsp를 사용하지 않았기 때문에, 이 실례에서 하나의 servlet으로 폼 페이지를 출력하고, 다른 servlet은 폼을 처리합니다.프로그램 내에서 구체적인 사고방식을 쓴다.
/*
 *         
 *   :               ,                           
 *        javascript     
 *               ,        ,               
 *          ,            ,   servlet   
 */
public class FormServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		String token = TokenProcessor.getInstance().makeToken();//     
		request.getSession().setAttribute("token", token);//          
		
		//    
		out.println("<form action='/test/servlet/DoFormServlet' method='post'>");
			out.println("<input type='hidden' name='token' value='" + token + "'/>");//                
			out.println("   :<input type='text' name='username'/>");
			out.println("<input type='submit' value='  '/>");
		out.println("</form>");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}
}

class TokenProcessor {
	
	/*
	 *            ,            。            。
	 *       :(              )
	 * 1.          
	 * 2.           
	 * 3.           ,      
	 */
	
	private TokenProcessor(){}
	private static final TokenProcessor instance = new TokenProcessor();
	
	public static TokenProcessor getInstance() {
		return instance;
	}
	
	//       
	public String makeToken() {		
		String token = (System.currentTimeMillis() + new Random().nextInt(9999999)) + "";		
		/*
		 *     :      ,             ,128  -16  
		 *                   。
		 *       md5          。
		 */
		try {
			MessageDigest md = MessageDigest.getInstance("md5");//  md5  
			byte md5[] = md.digest(token.getBytes());//    token     ,     ,       
			/*
			 *        return,       
			 *   md5       ,new String(md5)            ,          ,       gb2312
			 *                    
			 */
			//return new String(md5);
			
			/*
			 * base64  :             。
			 *  : 3    4  ,                  
			 *         : 01010000    01010011    01100101    24 
			 *   4    ,          6 ,  2  0,
			 *   base64       : 00010100 00000101 00001101 00100101
			 *       ,    0,    63,  64   ,   base64  
			 *  0-63          ,                  。
			 */
			BASE64Encoder encoder = new BASE64Encoder();//            import ,      :
			/*
			 *     1(  ):
			 * 	    project build path    JRE System Library,    JRE System Library,           。
			 *     2:
			 * 	Windows -> Preferences -> Java -> Compiler -> Errors/Warnings ->
			 * 	Deprecated and trstricted API -> Forbidden reference (access rules): ->   warning
			 */
			return encoder.encode(md5);
			
			
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException(e);//       ,           
			//     ,               ;
			//     :          ,          。
		}
	}	 
}

사용자가 제출한 후에 DoForm Servlet에 맡겨 처리할 것입니다. DoForm Servlet을 보십시오.java:
//      
public class DoFormServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		boolean b = isToken(request); //
		if(b == false) {
			System.out.println("       !");
			return;
		}
		
		//        ,    session          
		request.getSession().removeAttribute("token");		
		System.out.println("        !");
	}

	private boolean isToken(HttpServletRequest request) {		
		String clientToken = request.getParameter("token");//   token
		if(clientToken == null)
			return false;
		String serverToken = (String)request.getSession().getAttribute("token");//    token
		if(serverToken == null)//          ,           ,serverToken   null 
			return false;		
		if(!clientToken.equals(serverToken))
			return false;	
		return true;
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}

과정은 이렇다. 사용자가 로그인하기 전에 서버 쪽에서 하나의 Token이 되어 이 Token을session에 저장하고 이를 숨겨진 필드로 브라우저에 전화를 걸어 사용자가 로그인하도록 한다. 분명히 사용자가 로그인하면 이 Token을 가져온다.서버 측에서 요청을 처리하기 전에 클라이언트가 가져온 Token과session에 저장된 것이 같은지 판단합니다. 그렇다면session에 있는token을 삭제하고 요청을 처리합니다. 이때session에는 이token이 없습니다. 사용자가 되돌아와서 다시 제출할 때 서버 측에서 판단할 것입니다. 이때false로 되돌아와서 다시 제출하지 말라고 알립니다.
이상은 두 가지 작은 실례로session지식을 공고히 하기 위한 것입니다. 잘못된 점이 있으면 댓글로 바로잡아 주십시오~
_____________________________________________________________________________________________________________________________________________________
-----즐겁게 나누고 함께 진보하자!
-------더 많은 기사 보기:http://blog.csdn.net/eson_15

좋은 웹페이지 즐겨찾기