반응형

보통 서버의 방화벽이 open 되었는지 확인할 때 telnet 명령어를 사용합니다.

그런데, 특수한 경우 서버에서 텔넷 명령어를 사용할 수 없는 경우가 있는데 이럴때 아래의 간단한 소스로 텔넷을 대신해 포트 방화벽을 확인할 수 있습니다.


- 컴파일 -

javac PortCheck.java 


- 실행 -

java PortCheck www.naver.com 80


이렇게 실행하면 


1. 방화벽이 막혀있는 경우 커넥션 타임아웃 오류가 발생합니다.

1
2
3
4
5
6
7
8
9
10
11
Exception in thread "main" java.net.SocketTimeoutException: connect timed out
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at PortCheck.main(PortCheck.java:11)
 




2. 해당 포트가 리스닝하고 있지 않은 경우 커넥션 리퓨즈드 오류가 발생합니다. 이러면 방화벽은 열린 겁니다.

1
2
3
4
5
6
7
8
9
10
Exception in thread "main" java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at PortCheck.main(PortCheck.java:11)





3. 오류가 발생하지 않으면 방화벽도 열려있고 해당 포트도 리스닝하고 있는 상태입니다.





- 아래는 소스 파일 입니다. -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
 
public class PortCheck {
  public static void main(String[] args) throws UnknownHostException, IOException {
    SocketAddress endpoint =  new InetSocketAddress(args[0], Integer.valueOf(args[1]));
    new Socket().connect(endpoint, 3000);
    System.out.println("OK");
  }
}
 



반응형
반응형

spring boot 를 사용하면서 Local에서 STS를 이용해 서버를 실행시킬 때 application.properties 에 아래처럼 선언해주면 context path를 변경할 수 있습니다.


1
server.contextPath=/op



SpringBoot 2.x 부터 위 설정은 Deprecated 되었습니다.


2.x 는 아래와 같이 쓰시면 됩니다.


server.servlet.context-path=/op


반응형
반응형

웹 관련 개발을 하다보면 HTML 코드를 변환 해야하는 경우가 종종 생깁니다.

보통 타 시스템과의 연동시에 이런 경우가 많이 발생합니다.


여러 변환중에 기본적인 이미지 태그의 가로 세로 설정을 바꿔치기하는 소스를 공유 합니다.


기본적으로 정규식을 이용해서 속성 width, height / 스타일 width, height 를 모두 지워 버리고 style="width:100%" 를 넣어주는 소스 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static String htmlImgWidth100Percent(String source) {
    Pattern pattern = Pattern.compile("<img[^>]+>");
    Matcher matcher = pattern.matcher(source);
    while (matcher.find()) {
      String imgTag = matcher.group(0);
      String newImgTag = imgTag//
          .replaceAll("width\\s*=\\s*[^\\s>]+""")//
          .replaceAll("width\\s*:\\s*[^'\"\\s]+""")//
          .replaceAll("height\\s*=\\s*[^\\s>]+""")//
          .replaceAll("height\\s*:\\s*[^'\"\\s]+""");
      if (newImgTag.matches(".*style\\s*=\\s*['\"].*")) {
        newImgTag = newImgTag.replaceAll("(style\\s*=\\s*['\"])""$1width:100%;");
      } else {
        newImgTag = newImgTag.replaceAll("<img""<img style='width:100%;' ");
      }
      source = source.replace(imgTag, newImgTag);
    }
    return source;
  }




자세한 궁금점은 댓글 달아 주시면 답변 드립니다.

반응형
반응형

java 배열이나 목록을 랜덤하게 섞고 싶을 때 Collections.shuffle 함수를 이용하시면 됩니다.


1
Collections.shuffle(List);



반응형
반응형

스프링부트 기본으로 logback.xml 사용시에 /tmp/spring.log가 쌓이게 됩니다.


아래 설정에 포함되어 있을 것으로 추측을 합니다.


1
<include resource="org/springframework/boot/logging/logback/base.xml" />




그런데 리눅스 서버에 배포를 하면 /tmp가 권한이 막혀있거나 혹은 기본 설정된 프로젝트가 2개가 배포된다면 /tmp/spring.log를 접근하지 못하는 상황이 발생 됩니다.


그래서 spring.log 가 쌓이는 위치를 바꾸려면 LOG_TEMP 프라퍼티를 지정해 주면 됩니다.


아래와 같이 사용하면 됩니다.


1
2
<property name="LOG_TEMP" value="내맘대로" />
<include resource="org/springframework/boot/logging/logback/base.xml" />



반응형
반응형

자바스크립의 배열에 대한 join 기능을 java 에서도 java8부터 사용할 수 있게 되었습니다.


String 클래스에 추가 된 method 입니다. 이름도 동일하게 join으로 사용할 수 있습니다.


String.join 으로 사용하면 되고, 아래 처럼 여러형태의 데이터들을 이용해서 join 할 수 있습니다.



1. 문자열을 순서대로 나열한 값을 join -> a,b,c

1
String joined1 = String.join(",""a""b""c");



2. 문자 배열을 join -> a,b,c
1
2
String[] array = new String[] { "a""b""c" };
String joined2 = String.join(",", array);



3. 문자 List를 join -> a,b,c

1
2
List<String> list = Arrays.asList(array);
String joined3 = String.join(",", list);



반응형
반응형

jdk8 부터 jvm 옵션 중 아래 내용이 변경 되었습니다.


변경 전

-XX:PermSize=128m -XX:MaxPermSize=128m


변경 후

-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m


이름만 바뀐게 아니라  Permanent 영역의 정책도 같이 변경되었으니 관심있으신 분들은 Deep Searching!

반응형
반응형
java 의 double 타입에서 10000000 부터는 문자열로 그냥 변환 시 1.0E7 이런식으로 나오게 됩니다.
이런 경우 동일하게 문자열로 변환해서 보고 싶다면 아래 소스를 참고 하시면 됩니다.
반응형
반응형

apache poi 로 엑셀 파일 read 시 Package should contain a content type part [M1.13] 오류가 발생하는 경우 입니다.


원인으로, 코드는 XSSFWorkbook 를 사용하고 엑셀파일은 xls 확장자인 경우 발생하는 오류입니다.


XSSFWorkbook 은 xlsx 확장만 처리할 수 있습니다.


이런 경우 이런식으로 처리해야 합니다.


private Workbook getWorkbook(FileInputStream inputStream, String excelFilePath)
        throws IOException {
    Workbook workbook = null;
 
    if (excelFilePath.endsWith("xlsx")) {
        workbook = new XSSFWorkbook(inputStream);
    else if (excelFilePath.endsWith("xls")) {
        workbook = new HSSFWorkbook(inputStream);
    else {
        throw new IllegalArgumentException("The specified file is not Excel file");
    }
 
    return workbook;
}


반응형
반응형

Java를 이용하다 보면 좀 더 높은 수준의 암호화가 필요한 경우가 있습니다.


java 기본 패키지에 없는 알고리즘이나 높은 비트의 암호화를 하는 경우가 그렇습니다.


이런 경우에 JCE를 별도로 설치해야 합니다.


JCE 는 Java Cryptography Extension 의 약자로 암호화를 위한 확장팩 정도로 보면 되겠습니다.


1. 다운로드

- URL : http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html  오라클 로그인이 필요합니다.

- jce_policy-8.zip 클릭하여 다운로드 ( 0.01 MB )


2. 압축 해제


3. 

윈도우  C:\Program Files\Java\jdk1.8.0_111\jre\lib\security 

리눅스 /usr/lib/jvm/java-8-oracle/jre/lib/security/


위 폴더에서 압축해제된 아래 파일들로 교체 합니다.


local_policy.jar

US_export_policy.jar


혹시 모르니 백업은 해두는게 좋습니다.



아래의 예외가 발생하는 경우도 동일한 경우로 볼 수 있습니다.


java.security.InvalidKeyException : Illegal key size or default parameters


1
2
3
4
5
6
Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1026)
    at javax.crypto.Cipher.implInit(Cipher.java:801)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:864)
    at javax.crypto.Cipher.init(Cipher.java:1249)
    at javax.crypto.Cipher.init(Cipher.java:1186)
cs


반응형

+ Recent posts