'분류 전체보기'에 해당되는 글 223건

  1. 2011.08.23 jQuery 와 Servlet을 이용한 간단한 Captcha 샘플~ 5
  2. 2011.08.23 Oracle 두 Date Type 컬럼 시간차 구하기 2
  3. 2011.08.23 Apache HttpComponents를 이용한 GET, POST 요청하기 7
  4. 2011.08.22 Oracle JDBC Driver maven 디펜던시에 추가하기 3
  5. 2011.08.22 Eclipse Maven Jetty Plugin 으로 개발하면서 java.lang.OutOfMemoryError: PermGen space 익셉션이 발생할때.

jQuery 와 Servlet을 이용한 간단한 Captcha 샘플~

Captcha 란 간단히 아래쪽 그림과 같은 기능을 하는것을 말한다.


 

제작해본 샘플은 

서버측에서 이미지를 생성해 주고, 생성된 문자열을 세션에 저장시켜주는 기능을 수행하는 Servlet 하나와

고 서블릿을 사용하는 클라이언트 쪽 html 파일로 구성된다. 

사용한 라이브러리는 랜덤 스트링 생성을 편하게 하기 위해 apache commons lang 의 RandomStringUtils 를 사용했다.


CaptchaGenServlet.java
package servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.RandomStringUtils;

public class CaptchaGenServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	public void init() throws ServletException {
		super.init();
		
		// 폰트 등록
		try {
			Font font = Font.createFont(Font.TRUETYPE_FONT,
                                    this.getClass().getResourceAsStream("/servlet/HelveticaMedCd.ttf"));
			GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
    public CaptchaGenServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                      throws ServletException, IOException {
		generateCaptcha(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                       throws ServletException, IOException {
		generateCaptcha(request, response);
	}
	
	private void generateCaptcha(HttpServletRequest request, HttpServletResponse response){
		try {
			// 알파벳 숫자섞인 5자리 문자열 생성
			String randomString = RandomStringUtils.randomAlphanumeric(5).toUpperCase();
			
			// 세션에 저장
			request.getSession().setAttribute("CAPTCHA", randomString);
			
			Font font = new Font("Helvetica 67 Medium Condensed", Font.PLAIN, 50);
			FontRenderContext frc = new FontRenderContext(null, true, true);
			Rectangle2D bounds = font.getStringBounds(randomString, frc);
			int w = (int) bounds.getWidth();
			int h = (int) bounds.getHeight();
			
			// 이미지 생성
			BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
			Graphics2D g = image.createGraphics();
			g.setColor(Color.WHITE);
			g.fillRect(0, 0, w, h);
			g.setColor(new Color(113, 193, 217));
			g.setFont(font);
			g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
                               RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
			g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, 
                               RenderingHints.VALUE_FRACTIONALMETRICS_ON);
			g.drawString(randomString, (float) bounds.getX(), (float) -bounds.getY());
			g.dispose();

			ImageIO.write(image, "png",  response.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


이미지 생성시 문자열에 쓸 폰트를 클래스패스에 위치시킨 다음에 30번째 라인처럼 불러와서 폰트를 등록시킬 수 있다.
폰트 등록후 57번째 라인처럼 등록된 폰트를 불러와 쓸 수 있는데 시스템에 등록된 폰트들 이름을 확인하기 위해서는 다음과 같은 코드로 확인하면 된다.
Font[] fontList = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
			
for( Font f : fontList){
	System.out.println(f.getName());
}



web.xml 서블릿 설정

<servlet>
	<display-name>CaptchaGenServlet</display-name>
	<servlet-name>CaptchaGenServlet</servlet-name>
	<servlet-class>servlet.CaptchaGenServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>CaptchaGenServlet</servlet-name>
	<url-pattern>/captcha</url-pattern>
</servlet-mapping>



Captcha UI
<html>
<head>
	<title>Captcha Test</title>
	
	<script type="text/javascript" src="/jquery-1.6.1.min.js"></script>
	
	<script>
		$(document).ready(function(){
			create();
			
			$("#refreshBtn").click(function(e){
				e.preventDefault();
				create();
			});
			
			$("#confirmBtn").click(function(e){
				e.preventDefault();
				$("#frm").submit();
			});
			
			function create(){
				$("#captcha img").attr("src", "/captcha?"+Math.random());
			}
		});
	</script>
	
	<style>
		#captcha {
			width : 230px;
			height : 70px;
			border: 3px dotted #A3C552;
			text-align: center;
			padding: 5px;
		}
	</style>
</head>

<body>
	Catpcha Test!!!
	<form id="frm" action="result.jsp" method="post">
		<div id="captcha"><img/></div>
		<br/>
		<input type="text" name="captchaInput"/>
		<button id="confirmBtn">확인</button>
		<button id="refreshBtn">리푸레쉬</button>
	</form>
</body>
</html>



쪽바로 입력했는지 체크하기(result.jsp)
SESSION : ${sessionScope['CAPTCHA']}
PARAM : ${param.captchaInput}

통과 : ${ sessionScope['CAPTCHA'] eq param.captchaInput ? 'O' : 'X'}

CaptchaSample.war

Oracle 두 Date Type 컬럼 시간차 구하기


여기서 start_date, end_date 컬럼의 데이터 타입은 DATE 임~
-- 두 날짜 사이가 몇 초 차이나는가?
SELECT ROUND((end_date-start_date)*24*60*60) FROM tb_name;


-- 두 날짜 사이의 몇 분 차이나는가?
SELECT ROUND((end_date-start_date)*24*60) FROM tb_name;


-- 두 날짜 사이의 몇 시간 차이나는가?
SELECT ROUND((end_date-start_date)*24) FROM tb_name;

Apache HttpComponents를 이용한 GET, POST 요청하기

예전에는 Jakarta Commons HttpClient 프로젝트로 commons 프로젝트들이랑 옹기종기 같이 모여 있었는데 문득 사이트에 가보니 

프로젝트명이 Apache HttpComponents 로 바껴있고  라이브러리 사용하는 것도 훅 달라진것 같았다.

테스트겸 겸사겸사 GET, POST 요청을 하는 클래스를 맹글어 보았다.



소스코드
package proxy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

public class HttpProxy {
	/**
	 * POST 요청
	 * @param url       요청할 url
	 * @param params    파라메터
	 * @param encoding  파라메터 Encoding
	 * @return 서버 응답결과 문자열
	 */
	public String post(String url, Map params, String encoding){
		HttpClient client = new DefaultHttpClient();
		
		try{
			HttpPost post = new HttpPost(url);
			System.out.println("POST : " + post.getURI());
			
			List<NameValuePair> paramList = convertParam(params);
			post.setEntity(new UrlEncodedFormEntity(paramList, encoding));
			
			ResponseHandler<String> rh = new BasicResponseHandler();

			return client.execute(post, rh);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			client.getConnectionManager().shutdown();
		}
		
		return "error";
	}
	
	public String post(String url, Map params){
		return post(url, params, "UTF-8");
	}

	
	
	
	/**
	 * GET 요청
	 * POST 와 동일
	 */
	public String get(String url, Map params, String encoding){
		HttpClient client = new DefaultHttpClient();

		try{
			List<NameValuePair> paramList = convertParam(params);
			HttpGet get = new HttpGet(url+"?"+URLEncodedUtils.format(paramList, encoding));
			System.out.println("GET : " + get.getURI());
			
			ResponseHandler<String> rh = new BasicResponseHandler();
			
			return client.execute(get, rh);
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			client.getConnectionManager().shutdown();
		}
		
		return "error";
	}
	
	public String get(String url, Map params){
		return get(url, params, "UTF-8");
	}
	
	
	
	private List<NameValuePair> convertParam(Map params){
		List<NameValuePair> paramList = new ArrayList<NameValuePair>();
		Iterator<String> keys = params.keySet().iterator();
		while(keys.hasNext()){
			String key = keys.next();
			paramList.add(new BasicNameValuePair(key, params.get(key).toString()));
		}
		
		return paramList;
	}
	
	

	// Test
	public static void main(String[] args) {
		HttpProxy p = new HttpProxy();
		
		Map params = new HashMap();
		params.put("w", "tot");
		params.put("q", "한예슬");
		
		System.out.println(p.get("http://m.search.daum.net/search", params));
	}
}

HttpProxy.java






라이브러리 다운로드는  http://hc.apache.org/downloads.cgi 요기에 가서 다운로드 받던지

Maven을 사용하고 있다면 디펜던시에
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.1.2</version>
</dependency>
 요걸 추가해 주면 된다.




그리고~ http://hc.apache.org/downloads.cgi 요기에서 다운받아 보면 압축파일안에  examples, tutorial, api 문서도 같이 들어 있어서 참고하기 좋다~

※ 위 예제를 실행하기 위해서 꼭 필요한 jar 파일은 httpclient-4.1.2.jar, httpcore-4.1.2.jar, commons-codec-1.4.jar, commons-logging-1.1.1.jar
요것들 4개고 모두 lib 디렉토리 안에 들어 있음.

Oracle JDBC Driver maven 디펜던시에 추가하기

Oracle JDBC 드라이버는 메이븐 센트럴 레파지토리에 없다. 그래서 따로 레파지토리를 추가해 줘야 하는데

검색을 해보니 예전에는 오라클에서 제공하는 메이븐 레파지토리(http://download.oracle.com/maven)가 있었는데

요즘 오라클 사이트가 전체적으로 삐꾸가 되서 이제 잘 되지 않는것 같다.



다음은 JDBC 드라이버가 오라클 사이트에 올라오는 최신 버전은 아니지만  그래도 거의 준 최신 버전을 받을수 있는 레파지토리이다.

http://maven.jahia.org/maven2

pom.xml 파일  repositories 에 요걸 추가하고
<repository>
	<id>oracle</id>
	<name>ORACLE JDBC Repository</name>
	<url>http://maven.jahia.org/maven2</url>
</repository>


dependencies 에 요걸 추가해 주면 된다.
<dependency>
	<groupId>com.oracle</groupId>
	<artifactId>ojdbc6</artifactId>
	<version>11.1.0.7.0</version>
</dependency>
ojdbc5 가 필요한 사람은 ojdbc6 대신에 ojdbc5 로 바꿔서 적어주면 됨.



나는 꼭 최신버전 드라이버를 maven으로 가져와서 써야 겠다는 사람들은 자기 로컬 레파지토리를 만들면 된다 -_-;

Eclipse Maven Jetty Plugin 으로 개발하면서 java.lang.OutOfMemoryError: PermGen space 익셉션이 발생할때.

Run > Run Configurations 로 가서 실행할때 썼던 런설정을 왼쪽트리에서 선택하고, 아래 그림처럼 JRE VM arguments에 셋팅해주면됨

 

VM arguments 셋팅


추가해줄 항목
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m

※ Jetty 뿐만 아니라 다른데서도 permgen space 에러가 나면 죠 위에 옵션을 jvm 구동시 옵션으로 주면 된다. 
 
prev 1 ··· 37 38 39 40 41 42 43 ··· 45 next