반응형

이클립스에 EGit 플러그인 설치 후 Github 연동



  • EGit 플러그인 설치

Help > Install New Software.. 이동

Work with의 셀렉트 버튼 클릭 후 Indigo - http://download.eclipse.org/releases/indigo 선택

Collaboration 메뉴 확장 후 Eclipse EGit 체크 후 설치



  • git 설정

window > Preferences > General > Network Connections > SSH2의 key management탭에서 Generate RSA Key 생성 후 Save Private Key 클릭

id_rsa 파일과 id_rsa.pub 파일이 생성이 되는데 원하는 디렉토리에 저장한다. (나는 D:\\git 디렉토리에 저장하였음)

key를 만들어 주는 이유는 github과 연동 시 https로 통신해야 하기 때문이다.


Team > Git > Configuration

New Entry... 버튼 클릭하여 Key, Value 부분에 아래 두 가지 정보를 추가한다.

user.name : namkyu

user.email : lng1982@gmail.com



  • github 가입

https://github.com/ 페이지 이동 후 가입 진행

github setting > SSH Keys 이동하여 id_rsa.pub 안에 들어있는 내용을 넣어준다.






  • git repository 생성

오른쪽 상단에 있는 Create a new repo 아이콘 클릭



Repository name input box 부분에 적당한 이름 추가 후 "Create repository" 버튼 클릭

생성 완료 페이지에 https://github.com/namkyu/EgitTest.git URL이 보이는데 해당 URL copy



  • 이클립스와 github repository 연결

이클립스에서 EGitTest 자바 프로젝트 생성

Team > Share Project > Git

Use or create repository in parent folder of project 체크 박스 체크

"Create Repository" 버튼 클릭


Git Repositories View에 EgitTest가 생성되어 있음

Remotes 클릭 후 오늘쪽 마우스 > Create remote

Remote name은 "origin" 입력

change 버튼 클릭 후 아래 정보 추가



"Finish" 버튼 클릭

여기까지 설정을 했으면 이제 github과의 연동이 완료된 것이다.

이후 EGitTest 프로젝트 우클릭 후 Team > Push up stream 을 누르면 github 저장소에 commit 한다.




  • 맘에 드는 프로젝트 내 이클립스로 다운로드 받고 싶을 때

github에는 많은 오픈 소스 프로젝트가 올라오고 있다. 

소스를 다운로드 받아 공부하고 싶을 때에는 https://github.com/사용자아이디/다운로드받을프로젝트.git 와 같은 URL을 copy한 후 Git Repositories에서 설정 추가하여 소스 다운로드 받는다.


출처: http://lng1982.tistory.com/154

반응형

eclipse에 github 연결해서 웹저장소에서 버전관리(repository)하기


아직 Git 플러그인을 설치하지 않았거나 github에서 repository를 만들지 않았다면, 위 2개의 글을 먼저 확인하시고 다시 오세요.

그리고 혹시, 다른 repository와 프로젝트가 연결돼 있다면 아래 그림처럼 disconnect 하셔서 먼저 연결을 끊으셔야 합니다.






Git Repositories 에서 [Clone a Git repository]를 클릭하세요~


URI에 https의 github URI를 입력해 주세요.

아래 그림처럼 Host와 Repository path를 분리해서 넣어주시구요.

github.com에서 만든 계정(user/password)도 입력해 주세요.


혹시, github.com의 repository URI를 모르신다면 아래 그림처럼 github.com 로그인하고 해당 repository 클릭해서 URI 확인하시면 됩니다.


[Next] 누르시고요.




자, repositories를 생성했으니 이걸 project와 연결해 보겠습니다.

연결할 project에서 마우스 오른쪽 클릭하셔서 [Team > Share Project...] 클릭하세요.




방금 생성한 repository 선택하시구요. [Finish] 버튼 누르세요.



자, 연결이 되었으니 소스를 올려볼까요?



[Add to Index] 하시면 Storage 영역에 해당 소스들을 올려놓게 됩니다.

*표로 파일이나 폴더가 표시됩니다.




[Commit and push] 하시면 github로 파일을 올릴 수 있습니다.



branch를 선택하시면 되는데요.

다른 branch를 만들지 않았다면 master가 기본입니다.

선택하시면 됩니다.







[OK] 버튼을 누르면 github로 소스 전송이 완료됩니다.

github에 로그인해서 소스가 정말 올라와 있는지 확인해 보겠습니다.




잘 올라와 있네요^^

이젠 저도 github를 잘 활용해서 장소와 상관없이 편리하게 개발도 하고, 다른 사람들과 협업도 해봐야겠습니다.



출처 : http://zzznara2.tistory.com/398


반응형
package ase;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.InvalidParameterSpecException;
import java.security.spec.KeySpec;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class AES128_File {

	public static String byteToHex(byte[] raw) {

		String HEXES = "0123456789ABCDEF";

		if (raw == null) {
			return null;
		}
		final StringBuilder hex = new StringBuilder(2 * raw.length);
		for (final byte b : raw) {
			hex.append(HEXES.charAt((b & 0xF0) >> 4)).append(HEXES.charAt((b & 0x0F)));
		}
		return hex.toString();
	}

	public static byte[] hexToByte(String hexString) {
		int len = hexString.length();

		byte[] ba = new byte[len / 2];

		for (int i = 0; i < len; i += 2) {
			ba[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));
		}

		return ba;
	}

	/**
	 * @param msg
	 */
	private void cryptMessage(String msg) {
		System.out.println("** Crypt ** " + msg);
	}
	/**
	 * @param input
	 *            - the cleartext file to be encrypted
	 * @param output
	 *            - the encrypted data file
	 * @throws IOException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	public void WriteEncryptedFile(String cryptKey,InputStream inputStream, OutputStream outputStream) throws IOException, IllegalBlockSizeException, BadPaddingException {
		try {
			

			int SALT_LEN = 8;
			byte[] mInitVec = null;
			byte[] mSalt = new byte[SALT_LEN];
			Cipher mEcipher = null;
			int KEYLEN_BITS = 128; // see notes below where this is used.
			int ITERATIONS = 65536;
			int MAX_FILE_BUF = 2048;

			long totalread = 0;
			int nread = 0;
			byte[] inbuf = new byte[MAX_FILE_BUF];
			SecretKeyFactory factory = null;
			SecretKey tmp = null;

			mSalt = new byte[SALT_LEN];
			SecureRandom rnd = new SecureRandom();
			
			rnd.nextBytes(mSalt);
			cryptMessage("generated salt :" + byteToHex(mSalt));
			factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

			KeySpec spec = new PBEKeySpec(cryptKey.toCharArray(), mSalt, ITERATIONS, KEYLEN_BITS);

			tmp = factory.generateSecret(spec);

			SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

			mEcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			mEcipher.init(Cipher.ENCRYPT_MODE, secret);

			AlgorithmParameters params = mEcipher.getParameters();

			mInitVec = params.getParameterSpec(IvParameterSpec.class).getIV();

			System.out.println("mInitVec : " + mInitVec);
			cryptMessage("mInitVec is :" + byteToHex(mInitVec));
			outputStream.write(mSalt);
			outputStream.write(mInitVec);

			while ((nread = inputStream.read(inbuf)) > 0) {
				cryptMessage("read " + nread + " bytes");
				totalread += nread;

				byte[] trimbuf = new byte[nread];

				for (int i = 0; i < nread; i++) {
					trimbuf[i] = inbuf[i];
				}

				byte[] tmpBuf = mEcipher.update(trimbuf);

				if (tmpBuf != null) {
					outputStream.write(tmpBuf);
				}
			}

			byte[] finalbuf = mEcipher.doFinal();

			if (finalbuf != null) {
				outputStream.write(finalbuf);
			}

			outputStream.flush();
			inputStream.close();
			outputStream.close();
			outputStream.close();
			cryptMessage("wrote " + totalread + " encrypted bytes");
			System.out.println("파일 암호화 성공");
		} catch (InvalidKeyException ex) {
			Logger.getLogger(AES128_File.class.getName()).log(Level.SEVERE, null, ex);
		} catch (InvalidParameterSpecException ex) {
			Logger.getLogger(AES128_File.class.getName()).log(Level.SEVERE, null, ex);
		} catch (NoSuchAlgorithmException ex) {
			Logger.getLogger(AES128_File.class.getName()).log(Level.SEVERE, null, ex);
		} catch (NoSuchPaddingException ex) {
			Logger.getLogger(AES128_File.class.getName()).log(Level.SEVERE, null, ex);
		} catch (InvalidKeySpecException ex) {
			Logger.getLogger(AES128_File.class.getName()).log(Level.SEVERE, null, ex);
		}
		
	}

	/**
	 * Read from the encrypted file (input) and turn the cipher back into
	 * cleartext. Write the cleartext buffer back out to disk as (output) File.
	 * 
	 * I left CipherInputStream in here as a test to see if I could mix it with
	 * the update() and final() methods of encrypting and still have a correctly
	 * decrypted file in the end. Seems to work so left it in.
	 * 
	 * @param input
	 *            - File object representing encrypted data on disk
	 * @param output
	 *            - File object of cleartext data to write out after decrypting
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 * @throws IOException
	 */
	public void ReadEncryptedFile(String cryptKey,InputStream inputStream, OutputStream outputStream) throws IllegalBlockSizeException, BadPaddingException, IOException {
		try {

			int SALT_LEN = 8;
			byte[] mInitVec = null;
			byte[] mSalt = new byte[SALT_LEN];
			Cipher mDecipher = null;
			int KEYLEN_BITS = 128; // see notes below where this is used.
			int ITERATIONS = 65536;
			int MAX_FILE_BUF = 2048;

			CipherInputStream cin;
			long totalread = 0;
			int nread = 0;
			byte[] inbuf = new byte[MAX_FILE_BUF];

			SecretKeyFactory factory = null;
			SecretKey tmp = null;
			// SecretKey secret = null;
			

			// Read the Salt
			inputStream.read(mSalt);
			cryptMessage("generated salt :" + byteToHex(mSalt));

			factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");

			KeySpec spec = new PBEKeySpec(cryptKey.toCharArray(), mSalt, ITERATIONS, KEYLEN_BITS);

			tmp = factory.generateSecret(spec);

			SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

			mDecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			mDecipher.init(Cipher.ENCRYPT_MODE, secret);

			AlgorithmParameters params = mDecipher.getParameters();
			mInitVec = params.getParameterSpec(IvParameterSpec.class).getIV();

			inputStream.read(mInitVec);
			cryptMessage("mInitVec is :" + byteToHex(mInitVec));
			mDecipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(mInitVec));

			cin = new CipherInputStream(inputStream, mDecipher);

			System.out.println("inbuf.length : " + inbuf.length);

			while ((nread = cin.read(inbuf)) > 0) {
				// Db("read " + nread + " bytes");
				totalread += nread;

				byte[] trimbuf = new byte[nread];

				for (int i = 0; i < nread; i++) {
					trimbuf[i] = inbuf[i];
				}

				// write out the size-adjusted buffer
				outputStream.write(trimbuf);
			}

			outputStream.flush();
			cin.close();
			inputStream.close();
			outputStream.close();
			cryptMessage("wrote " + totalread + " encrypted bytes");
		} catch (Exception ex) {
			ex.getStackTrace();
			Logger.getLogger(AES128_File.class.getName()).log(Level.SEVERE, null, ex);
		}
	}

	/**
	 * adding main() for usage demonstration. With member vars, some of the
	 * locals would not be needed
	 */
	public static void main(String[] args) {

		// create the input.txt file in the current directory before continuing
		File input = new File("C:\\Test\\test.txt");
		File eoutput = new File("C:\\Test\\test.aes");
		File doutput = new File("C:\\Test\\decrypted1.txt");
		String iv = null;
		String salt = null;
		AES128_File aesFile = new AES128_File();
		
		String cryptKey = "1q2w3e";

		/*
		 * write out encrypted file
		 */
		try {
			aesFile.WriteEncryptedFile(cryptKey,new FileInputStream(input), new FileOutputStream(eoutput));
			System.out.printf("File encrypted to " + eoutput.getName() + "\niv:" + iv + "\nsalt:" + salt + "\n\n");
		} catch (IllegalBlockSizeException | BadPaddingException | IOException e) {
			e.printStackTrace();
		}

		/*
		 * decrypt file
		 */
		/*
		 * write out decrypted file
		 */
		try {
			aesFile.ReadEncryptedFile(cryptKey,new FileInputStream(eoutput), new FileOutputStream(doutput));
			System.out.println("decryption finished to " + doutput.getName());
		} catch (IllegalBlockSizeException | BadPaddingException | IOException e) {
			e.printStackTrace();
		}
	}
}


반응형


public class ShowDefaultDalog extends JDialog implements WindowListener {

	private static final long serialVersionUID = 1L;

	/*
	 * imageHeight : 이미지 세로값 imageWidth : 이미지 가로값
	 */
	private static int imageHeight = 30;
	private static int imageWidth = 30;

	private JPanel jDalog_Main_Panel;
	private JPanel jDalog_North_Panel;
	private JPanel jDalog_Center_Panel;
	private JPanel jDalog_South_Panel;
	private JPanel jDalog_West_Panel;
	private JPanel jDalog_East_Panel;

	private JButton yes_Btn;
	private JButton no_Btn;
	private JButton wait_Btn;
	private String yseBtnText;
	private String noBtnText;
	private String waitBtnText;

	private String imagePath;
	private String message;

	private int type;
	private int result;

	/**
	 * 기본 다이얼로그설정
	 * 
	 * @author Leesangjun
	 * @param title
	 *            타이틀 message 다이얼로그 메시지, imagePath 설정 이미지 Path, type : 1,2,3 버튼 갯수
	 * @return 객체 생성
	 */
	public ShowDefaultDalog(String title, String message, String imagePath, int type) {
		this.message = message;
		this.imagePath = imagePath;
		this.type = type;
		setTitle(title);
	}

	/**
	 * 기본 다이얼로그설정
	 * 
	 * @author Leesangjun
	 * @return Dialog View
	 */
	public void createView() {

		createNorthPanel();
		createCenterPanel();
		createSouthPanel();
		createWestPanel();
		createEastPanel();

		jDalog_Main_Panel = new JPanel();
		jDalog_Main_Panel.setLayout(new BorderLayout());
		jDalog_Main_Panel.add("North", jDalog_North_Panel);
		jDalog_Main_Panel.add("Center", jDalog_Center_Panel);
		jDalog_Main_Panel.add("South", jDalog_South_Panel);
		jDalog_Main_Panel.add("West", jDalog_West_Panel);
		jDalog_Main_Panel.add("East", jDalog_East_Panel);

		addWindowListener(this);
		setAlwaysOnTop(true);
		setResizable(false);
		setModal(true);
		setType(Type.POPUP);
		add(jDalog_Main_Panel);
		pack();

		Dimension frameSize = getSize();
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
	}

	private void createNorthPanel() {
		jDalog_North_Panel = new JPanel();
		jDalog_North_Panel.setPreferredSize(new Dimension(0, 5));
	}

	private void createCenterPanel() {
		jDalog_Center_Panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
		JPanel center = new JPanel();
		ImagePanel imagePanel = new ImagePanel(new ImageIcon(getImagePath()).getImage());
		imagePanel.setHeight(imageHeight);
		imagePanel.setWidth(imageWidth);
		imagePanel.setPreferredSize(new Dimension(imageWidth, imageHeight));
		JLabel label = new JLabel(getMessage());
		JPanel messagePanel = new JPanel();
		messagePanel.add(label);
		center.add(imagePanel);
		center.add(messagePanel);
		jDalog_Center_Panel.add(center);
	}

	private void createWestPanel() {
		jDalog_West_Panel = new JPanel();
		jDalog_West_Panel.setPreferredSize(new Dimension(5, 0));
	}

	private void createSouthPanel() {
		jDalog_South_Panel = new JPanel();

		String btnText = "";

		if (yseBtnText == null) {
			btnText = UICode.DEFAULT_DIALOG_BUTTON_YES;
		} else {
			btnText = yseBtnText;
		}
		yes_Btn = new JButton(btnText);

		if (noBtnText == null) {
			btnText = UICode.DEFAULT_DIALOG_BUTTON_NO;
		} else {
			btnText = noBtnText;
		}
		no_Btn = new JButton(btnText);

		if (waitBtnText == null) {
			btnText = UICode.DEFAULT_DIALOG_BUTTON_WAIT;
		} else {
			btnText = waitBtnText;
		}
		wait_Btn = new JButton(btnText);

		switch (type) {
		case 1:
			jDalog_South_Panel.add(yes_Btn);
			break;
		case 2:
			jDalog_South_Panel.add(yes_Btn);
			jDalog_South_Panel.add(no_Btn);
			break;
		case 3:
			jDalog_South_Panel.add(yes_Btn);
			jDalog_South_Panel.add(no_Btn);
			jDalog_South_Panel.add(wait_Btn);
			break;
		default:
			break;
		}
		yes_Btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				result = 1;
				setVisible(false);
			}
		});

		no_Btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				result = 2;
				setVisible(false);

			}
		});
		
		wait_Btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				result = 3;
				setVisible(false);
				
			}
		});

	}

	private void createEastPanel() {
		jDalog_East_Panel = new JPanel();
	}

	public String getImagePath() {
		return imagePath;
	}

	public void setImagePath(String imagePath) {
		this.imagePath = imagePath;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public int getResult() {
		return result;
	}

	public void setYseBtnText(String yseBtnText) {
		this.yseBtnText = yseBtnText;
	}

	public void setNoBtnText(String noBtnText) {
		this.noBtnText = noBtnText;
	}

	public void setWaitBtnText(String waitBtnText) {
		this.waitBtnText = waitBtnText;
	}

	@Override
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		result = 2;
		setVisible(false);

	}

	@Override
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub

	}

}


////////////////////////////////////////////////////////

//호출시

///////////////////////////////////////////////////////

String message = "길이길이길이길이ㅁㄴㅇㅁㄴㅇㅁㄴㅇㅁㄴㅇㅂㅈㄷㅂㅈㄷㅂㅈㄷㅂㅈㄷㅂㅈㄷㅂㅈㄷㅂㅈㄷㅂㅈㄷㅂㅈㄷㅂㅈㄷ";
String imagePath = "image/tray.png";
ShowDefaultDalog frame = new ShowDefaultDalog("타이틀!!", message, imagePath, 3);
frame.setYseBtnText("asd");

frame.createView();
frame.setVisible(true);

System.out.println("결과값: " + frame.getResult());




'JAVA > Java' 카테고리의 다른 글

eclipse에 github 연결해서 웹저장소에서 버전관리(repository)하기  (0) 2016.05.20
AES128 파일 암복호화  (0) 2016.05.20
AES, SHA256 암 복호화  (0) 2016.03.02
java String Calss  (0) 2015.03.18
[JAVA] SocketServer  (0) 2014.11.18
반응형

package co.kr.s3i.common;

import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class AES256Util {

	private String REAL_KEY = "KEY";

	private String iv;
	private Key keySpec;

	private String SHA256(String key) {
		String SHA = "";
		try {
			MessageDigest sh = MessageDigest.getInstance("SHA-256");
			sh.update(key.getBytes());
			byte byteData[] = sh.digest();
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < byteData.length; i++) {
				sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
			}
			SHA = sb.toString();

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			SHA = null;
		}
		return SHA;
	}

	public AES256Util() throws UnsupportedEncodingException {
		String key = SHA256(REAL_KEY);
		this.iv = key.substring(0, 16);

		byte[] keyBytes = new byte[16];
		byte[] b = key.getBytes("UTF-8");
		int len = b.length;
		if (len > keyBytes.length)
			len = keyBytes.length;
		System.arraycopy(b, 0, keyBytes, 0, len);
		SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

		this.keySpec = keySpec;
	}

	// 암호화
	public String aesEncode(String str) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
			InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
		
		if(!BaseCode.isAES256_CHECK){
			return str;
		}
		
		Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
		c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));

		byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
		String enStr = new String(Base64.encodeBase64(encrypted));
		
		return enStr;
	}

	// 복호화
	public String aesDecode(String str) throws java.io.UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
			InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
		
		if(!BaseCode.isAES256_CHECK){
			return str;
		}
		
		Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
		c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes("UTF-8")));
		byte[] byteStr = Base64.decodeBase64(str.getBytes());

		return new String(c.doFinal(byteStr), "UTF-8");
	}

}



'JAVA > Java' 카테고리의 다른 글

AES128 파일 암복호화  (0) 2016.05.20
JAVA swing custum Dialog 만들기  (0) 2016.05.20
java String Calss  (0) 2015.03.18
[JAVA] SocketServer  (0) 2014.11.18
[JAVA] JFrame 이용하여 Mysql 접속 후 프로그램 생성  (0) 2014.11.18
반응형

다음과 같은 에러가 나타날 때 처리
com.enrise.framework.exception.DSSqlException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: Software caused connection abort: socket write error

STACKTRACE:

java.net.SocketException: Software caused connection abort: socket write error
 at java.net.SocketOutputStream.socketWrite0(Native Method)
 at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
 at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
 at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
 at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
 at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2744)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1612)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
 at com.mysql.jdbc.Connection.execSQL(Connection.java:3283)
 at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1332)
 at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1467)
 at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:93)
 at com.enrise.framework.db.query.LoggableStatement.executeQuery(LoggableStatement.java:231)
 at com.enrise.framework.db.query.QueryManager.executeQueryOne(QueryManager.java:241)
 at com.enrise.framework.db.query.QueryManager.executeQueryOne(QueryManager.java:227)
 at com.enrise.ds.am.dao.AmUserDAO.getUserByUserID(AmUserDAO.java:213)
 at com.enrise.ds.am.business.AmUserBusiness.getUserByUserID(AmUserBusiness.java:156)
 at com.enrise.ds.common.command.CoLoginCommand.execute(CoLoginCommand.java:224)
 at com.enrise.ds.common.servlet.HTTPServices.doPost(HTTPServices.java:115)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

......


해결 -> http://amitcodes.wordpress.com/2008/07/26/16/
위에 링크를 한 블로거의 설명 및 해결 방법 이다.
Cause:
 MySQL server has a default timeout period after which it terminates the idle connections. This period is 8 hours by default. Now heres what happens. The dbcp creates a set of connections to database when the servlet container / application server starts up. If the connections are not used for the tinmeout period, the MySQL server assumes these to be dead connections and terminates them. The dbcp, however, is unaware of the fact that the connections have been terminated. So when a connection is demended from the connection-pool, these dead connections are returned and when a call is made on these dead connections  *BOOM*  you the java.net.SocketException: Broken pipe exception. Ok  so whats the fix ??

Fix: If only the connection pool could check if the the connection it is about to return is live or not, the porblem is fixed. This can be done in apache-common-dbcp (I know this one coz I used it, please look into documentation of the connection-pool you are using). Heres how you do it: You add the following properties to dbcp configuration.

·        validationQuery=SELECT 1

·        testOnBorrow=true

And that does the trick.

How it works:

·        Before returning the connection from pool to the application, dbcp runs the SELECT 1  query on the connection to see it it is still live. Thats the job of validationQuery.

·        As for testOnBorrow, you tell dbcp to perform the check before returning the connection to application.

For more details refer to the apache-common-dbcp configuration manual hereThe apache-commons-dbcp config:

view source

print?

01

<Resource   name="jdbc/cooldatabase"

02

            description="Strandls.com license database"

03

            auth="Container"

04

            type="javax.sql.DataSource"

05

            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"

06

            driverClassName="com.mysql.jdbc.Driver"

07

            url="jdbc:mysql://localhost:3306/cooldatabase?autoReconnect=true"

08

            username="cooluser"

09

            password="coolpassword"

10

            initialSize="0"

11

            maxActive="20"

12

            maxIdle="10"

13

            minIdle="0"

14

            maxWait="-1"

15

            validationQuery="SELECT 1"

16

            testOnBorrow="true"

17

            poolPreparedStatements="true"

18

            removeAbandoned="true"

19

            removeAbandonedTimeout="60"

20

            logAbandoned="true"/>

The complete stacktrace:

[ERROR] 12:27 (JDBCExceptionReporter.java:logExceptions:78)Communications link failure due to underlying exception:

 

** BEGIN NESTED EXCEPTION **

 

java.net.SocketExceptionMESSAGE: Broken pipe

 

STACKTRACE:

java.net.SocketException: Broken pipeat

java.net.SocketOutputStream.socketWrite0(Native Method)

at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)

at java.net.SocketOutputStream.write(SocketOutputStream.java:136)

at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)

at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)

at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2689)

at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2618)

at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1551).....

 

 

--------------------------------------------------------------------------------------------------------------------------

 요약 하자면

원인: MySQL은 디폴트 타임아웃 값을 가지고 있다만약 커넥션이 생성되고이 타임아웃 기간이 지날 동안 사용되지 않는다면 이 커넥션은 끊긴 것으로 간주하고 커넥션을 종료한다하지만 dbcp는 커넥션이 끊어졌음을 알아채지 못하고커넥션 요청이 있을 때 연결이 끊긴 커넥션을 돌려준다그래서 에러가 발생한다.

 

수정: DBCP configuration 에 다음 사항을 추가한다.

·        validationQuery=SELECT 1

·        testOnBorrow=true

·        url="jdbc:mysql://localhost:3306/dbPoolName?autoReconnect=true

동작하는 방식

l  어플리케이션에 커넥션을 리턴하기 전에 dbcp는 “SELECT 1”쿼리를 실행해서 해당 커넥션이 살아있는지 확인한다이 작업이 ‘validationQuery’ 이다.

l  testOnBorrow 를 설정함으로써 커넥션을 어플리케이션에 돌려주기 전에 dbcp가 체크하도록 한다.

 

 

 < 설 명 >
'autoReconnect'옵션을 주게 되면, 커넥션에 문제가 있을 경우 다시 접속하게 된다.
그러나, 이 경우에도 끊어진 후 처음 한번의 시도는 실패가 나게 된다(이때 문제가 있다는것을 알게 되는 것이므로..).
이때는 추가적인 DBCP옵션인 'validationQuery'값의 설정으로 해결 가능하다.
validationQuery="select 1" => MySQL의 경우
validationQuery="select 1 from dual" => Oracle의 경우


maxActive 커넥션 풀이 제공할 최대 커넥션 개수 
maxIdle 사용되지 않고 풀에 저장될 수 있는 최대 커넥션 개수. 음수일 경우 제한이 없다. 
maxWait whenExhaustedAction 속성의 값이 1일 때 사용되는 대기 시간. 단위는 1/1000초이며, 0 보다 작을 경우 무한히 대기한다. 
testOnBorrow true일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사한다. 
testWhileIdle true일 경우 비활성화 커넥션을 추출할 때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거한다. 
timeBetweenEvctionRunsMillis 사용되지 않은 커넥션을 추출하는 쓰레드의 실행 주기를 지정한다. 양수가 아닐 경우 실행되지 않는다. 단위는 1/1000 초이다. 
minEvictableIdleTimeMillis 사용되지 않는 커넥션을 추출할 때 이 속성에서 지정한 시간 이상 비활성화 상태인 커넥션만 추출한다. 양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거되지 않는다. 시간 단위는 1/1000초이다. 



출처 : 

http://invincure.tistory.com/entry/%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80-%EC%9D%B4%EC%9A%A9%EC%8B%9C-DB-%EC%BB%A4%EB%84%A5%EC%85%98-%EC%97%90%EB%9F%AC

'JAVA > Spring' 카테고리의 다른 글

java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener  (0) 2016.06.02
Spring log4j SQL 직관적으로 보기  (0) 2016.06.02
[Spring] MVC 예제  (0) 2014.11.18
[Spring] MCV  (0) 2014.11.18
[Spring] AOP  (0) 2014.11.18
반응형


자바/Java String클래스 생성자와 메서드 정리

 
1. substring
String substring(int begin)
String substring(int begin, int end)
한 문자열에서 내용의 일부를 추출하는 메서드
주어진 시작위치(begin)부터 끝 위치(end) 범위에 포함된 문자열을 얻는다.
 

String s = "java.lang.Object";
String c = s.substring(10);          c = "Object"
String p = s.substring(5,9);         p = "lang"
 
substring(int start , int end)를 사용할 때 주의해야할 점은 매개변수로 사용되는 문자열에서 각 문자의 위치를 뜻하는 index가 0부터 시작한다는 것과 start부터 end의 범위 중 end위치에 있는 문자는 결과에 포함되지 않는다는 것이다.

(start <= x < end) 


[참고] end에서 start값을 빼면 substring에 의해 추출될 글자의 수가 된다.
[참고] substring의 철자에 주의하도록 한다. subString이 아니다. 

index  0 1 2 3 4 5 6 7 8 9  
char   H e l  l  o .  j a v a   


사용예                                                  결과 
string a = str.substring(0,5);                a = "hello"
string b = str.substring(6.10);               b = "java"


2.split
String[] split(String regex)
문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환 한다.

String animals = "dog, cat, bear";
String[] arr = animals.split(",")

결과
arr[0] = "dog"
arr[1] = "cat"
arr[2] = "bear"
 

3. contains
boolean contains(charSequence s)
지정된 문자열(s)이 포함되었는지 검사 한다.

String s = "abcedfg";
boolean b = s.contains("bc");

결과
b = true
 

4. endsWith
boolean endsWith(String suffix) 
지정된 문자열(suffix)로 끝나는지 검사 한다.

String file = "Hello.txt";
boolean b = file.endsWith("txt");

결과
b = true 
 


5. equals
boolean equals(Object obj)
매개변수로 받은 문자열(obj)과 String인스턴스의 문자열을 비교한다. obj가 String이 아니거나 문자열이 다르면 false를 반환한다. String 클래스는 equals 메소드를 오버라이드 해서 사용한다.

String s = "Hello";
boolean b = s.equals("Hello");
boolean b2 = s.equals("hello");

결과
b = true
b2 = false

  

6.replace
String replace(CharSequence old, CharSequence nw)
문자열 중의 문자열(old)을 새로운 문자열(nw)로 모두 바꾼 문자열을 반환 한다.


String s = "Hellollo";
String sl = s.replace("ll","LL"));

결과
sl = "HeLLoLLo"


7.toString
String toString()
String 인스턴스에 저장되어 있는 문자열을 반환 한다.


String s = "Hello";
String sl = s.toString();

결과
sl = "Hello"


8. toLowerCase
String toLoweCase()
String 인스턴스에 저장되어있는 모든 문자열을 소문자로 변환하여 반환 한다.


String s = "Hello";
String sl = s.toLowerCase();

결과
sl = "Hello"


9. toUpperCase
String toUpperCase()
String 인스턴스에 저장되어있는 모든 문자열을 대문자로 변환하여 반환 한다. 


String s = "Hello";
String sl = s.toUpperCase(); 

결과
sl = "HELLO"


10. trim
String trim()
문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다. 이 때 문자열 중간에 있는 공백은 제거되지 않는다.


String s = "     Hello World   ";
String sl = s.trim();

결과
sl = "Hello World"


11. valueOf
static String valueOf(boolean b)
static String valueOf(char c) 
static String valueOf(int i) 
static String valueOf(long l) 
static String valueOf(float  f) 
static String valueOf(double d) 
static String valueOf(Object o) 
지정된 값을 문자열로 변환하여 반환 한다.
참조변수의 경우, toString()을 호출한 결과를 반환 한다.


String b = String.valueOf(true);
String c = String.valueOf('a'); 
String i = String.valueOf(100); 
String l = String.valueOf(100L); 
String f = String.valueOf(10f); 
String d = String.valueOf(10.0);
java.util.Date dd = new java.util.Date();
String date = String.valueOf(dd);

결과
b = "true"
c = "a"
i = "100"
l = "100"
f = "10.0"
d = "10.0"
date = "Sub Jan 27:21:26:29 KST 2008"
  





출처 : 자바의정석 

'JAVA > Java' 카테고리의 다른 글

JAVA swing custum Dialog 만들기  (0) 2016.05.20
AES, SHA256 암 복호화  (0) 2016.03.02
[JAVA] SocketServer  (0) 2014.11.18
[JAVA] JFrame 이용하여 Mysql 접속 후 프로그램 생성  (0) 2014.11.18
[JAVA] Mysql DB 접속하기(Connect)  (0) 2014.11.18
반응형
package com.sangjun.mvc.controller;

import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.*;

import com.sangjun.mvc.dto.*;

//Controller 를 만들기 위한 annotation
//annotation이 없으면 요청이 와도 동작하지 않습니다.
@Controller
public class HelloController {
	
	
	@RequestMapping("/index.do")
	public ModelAndView index(){
		ModelAndView mav = new ModelAndView();
		
		//넘겨줄 데이터 저장
		mav.addObject("data","데이터!!!!!!!");
		//출력할 뷰 파일 이름 설정
		mav.setViewName("./view/index.jsp");
		return mav;
	}
	
	//매개변수로 dto 클래스 타입을 1개 작성하면
	//요청한 쪽의 파라미터가 대입되서 옵니다.
	@RequestMapping("/form.do")
	public ModelAndView form(@ModelAttribute("aaa") Article param){
		System.out.println("제목: "+param.getSubject() +
				"\n"+"내용 : "+param.getContent());
		
		ModelAndView mav = new ModelAndView();
		mav.setViewName("/view/result.jsp");
		return mav;
	}

}

20141022MVC2.zip

'JAVA > Spring' 카테고리의 다른 글

Spring log4j SQL 직관적으로 보기  (0) 2016.06.02
커넥션 풀 이용시 DB 커넥션 에러  (0) 2015.10.05
[Spring] MCV  (0) 2014.11.18
[Spring] AOP  (0) 2014.11.18
[Spring] Message  (0) 2014.11.18
반응형
package com.choongang.controller;

import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.*;


@Controller
public class HelloController {
	
	//hello.do 요청이 오면 아래 메서드를 호출
	@RequestMapping("/hello.do")
	public ModelAndView hello(){
		
		ModelAndView mav = new ModelAndView();
		//출력할 뷰 이름을 설정
		mav.setViewName("hello");
		//뷰 파일에게 넘겨줄 데이터 자장 - 실제로는 request 객체에 저장됩니다.
		mav.addObject("greeting","안녕하세요 스프링 mvc 하는중입니다.");
		return mav;
	}

}

20141022_MVC.zip

'JAVA > Spring' 카테고리의 다른 글

커넥션 풀 이용시 DB 커넥션 에러  (0) 2015.10.05
[Spring] MVC 예제  (0) 2014.11.18
[Spring] AOP  (0) 2014.11.18
[Spring] Message  (0) 2014.11.18
[Spring] DI oracle (데이터베이스 접속하기)  (0) 2014.11.18
반응형

'JAVA > Spring' 카테고리의 다른 글

[Spring] MVC 예제  (0) 2014.11.18
[Spring] MCV  (0) 2014.11.18
[Spring] Message  (0) 2014.11.18
[Spring] DI oracle (데이터베이스 접속하기)  (0) 2014.11.18
[Spring] message 언어 선택  (0) 2014.11.18

+ Recent posts