증상  


SVN 에러 E155004, E200030 등등





원인 


- SVN 사용시 가끔 lock이 걸리거나 위 그림과 같이 꼬이는 경우가 발생한다.




해결



1-1. 프로젝트 우클릭 > team > cleanup 실행

1-2. cleanup  성공시 다시 업데이트, 실패시 아무런 반응없음


2-1. 해당프로젝트 폴더에보면 숨김폴더로 .svn 폴더가 있다 

2-2. 해당 폴더내에 locked 파일이 존재하면 삭제 후 다시 업데이트


3-1. sqlite 클라이언트 다운로드

http://sqlitebrowser.org/ : 다운로드 속도가 안될 경우 아래 주소에서 다운로드

https://sourceforge.net/projects/sqlitedbrowser/ : 위 주소보다 버전은 낮지만 작업하는데 문제는 없다.



3-2.내려 받은 후, 압축을 푸시면 sqlite3.exe 파일이 하나 있습니다. 

이 파일을 문제가 발생한 프로젝트의 .svn 폴더에 복사합니다. (프로젝트의 하위 폴더에 있습니다.)


그리고 윈도우 커맨드창(Command Window)을 실행하여 해당 경로로 이동한 후, 아래 명령어 2개를 순차적으로 

실행합니다.


sqlite3 .svn/wc.db "select * from WORK_QUEUE"


sqlite3 .svn/wc.db "delete from WORK_QUEUE"


  

3-3 윈도우 커맨드창이 안된다면 직접 sqLite를 실행하여 Open Database를 눌러 오류가 발생했던 파일이 속해 있는 

폴더 내에 .svn 폴더에 wc.db 파일을 open 한 후 아래 명령어를 실행합니다.


 "delete from WORK_QUEUE"


 "delete from WC_LOCK"







1.  CSS 선택


$("div").css("border","9px solid red");

 

2. RADIO 객체

$(':input:radio[name^='+id+']:checked').val()





3. CHECKBOX 객체



예제1) 전체 체크박스 선택 / 해제


 jQuery(document).ready(function(){
  $("#allCategory").bind("click",function(){
   var flag= $(this).attr('checked');
   if($("#allCategory").is(":checked")){
     $("input[name^='categoryName2']").attr('checked',true);
   }else{
    $("input[name^='categoryName2']").attr('checked',false);
   }
  });
});


예제2) 체크박스 체크 확인

if(!$("input:checkbox[id='agree']").is(":checked")){

alert("개인정보 동의에 확인해 주세요");

$("#agree").focus();

return false;

}

 

 

4. selecte객체


$("select[id=a]") or $("select[name=a]")

 

 

 

 5. 상위 객체 찾아가기


예제)

<dl>

<dt>퀴즈1<dt>

<dd>

<ul>

<li><input id="abc"></li>

</ul>

<dd>

<dl>

설명: abc객체의 가장가까운 dd를 찾아서 이전의 dt 엘리먼트의 택스트(퀴즈1)을 가져온다.

var title = $(':input:radio[name^='+id+']').closest('dd').prev('dt').text();






특정 id안에 있는  3번째  TD 에 span테그 추가 하기

 

$("#a0").find("td:eq(2)").html("<span>"+newEmartCode+"</span>");

 

<tr id="a0">

 <td></td>

 <td></td>

 <td><span></span></td>

</tr>

 

<tr id="a1">

<td></td>

<td></td>

<td></td>

</tr>

 

 

 

라벨 텍스트 가져오기

 

 

 

$(document).ready(function(){

$("input[name^=chk]").click(function(){

alert($('label[for='+this.id+']').text());

});

indexedDB 란 web페이지에 내자 DB를 저장 시킬 수 있는 라이브러리임

참고사이트 정리

https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB

데스크톱 브라우저 호환성 표
Mozilla Firefox 52Google Chrome 57Apple Safari 11MS Edge 16
WebGL 지원지원함
GPU 블랙리스트가 적용됩니다. WebGL은 특정 구형 그래픽 카드에서 지원되지 않을 수 있습니다. 세부 정보는 차단리스팅/차단 그래픽스 드라이버에 대한 Mozilla 위키 페이지와 차단리스트 및 허용리스트에 대한 Khronos 위키 페이지에서 확인할 수 있습니다.
지원함
GPU 블랙리스트가 적용됩니다. WebGL은 특정 구형 그래픽 카드에서 지원되지 않을 수 있습니다. 세부 정보는 차단리스팅/차단 그래픽스 드라이버에 대한 Mozilla 위키 페이지와 차단리스트 및 허용리스트에 대한 Khronos 위키 페이지에서 확인할 수 있습니다.
지원함 
Safari 8 이상
지원함
웹 오디오 
(웹 오디오 참조) 
웹 오디오 API는 Unity WebGL 콘텐츠의 사운드를 재생하는 데 필요합니다.
지원함지원함지원함지원함
전체 화면 지원 
(전체 화면 지원 참조)
지원함지원함지원함
Safari 10.1 이상
지원함
커서 잠금 지원 
(커서 잠금 지원 참조)
지원함지원함지원함지원함 
Edge 13 이상
Gamepad 지원 
(Gamepad 지원 참조)
지원함지원함지원함지원함
IndexedDB 
데이터 캐싱 기능, PlayerPrefs 클래스 및 WWW.LoadFromCacheOrDownload에 사용되는 로컬 스토리지에 필요
지원함 
Firefox 42 버전 이하는 iFrame에서 실행되는 콘텐츠에 대해 IndexedDB를 지원하지 않습니다. Firefox 43 이상 버전에서는 이 문제가 수정되었습니다.
지원함지원함 
Safari는 iFrame에서 실행되는 콘텐츠에 대해 IndexedDB를 지원하지 않습니다.
지원함
WebSockets 
네트워킹에 필요
지원함지원함지원함지원함
WebRTC 
WebCamTexture 클래스에서 요구됨
지원함지원함지원 안 함지원함
WebGL 2.0 
(WebGL 2.0 참조)
지원함 
Firefox 51 이상
지원함 
Chrome 56 이상
지원 안 함지원 안 함
asm.js AOT 컴파일 
asm.js는 브라우저에서 특별히 최적화할 수 있는 JavaScript의 서브셋입니다. asm.js 지원을 구현하는 브라우저는 Unity가 asm.js를 사용하기 때문에 Unity WebGL 콘텐츠를 더욱 빠르게 실행할 수 있습니다.
지원함지원 안 함지원 안 함지원함
WebAssembly 
WebAssembly 또는 wasm은 웹에 컴파일하는 데 적합하며, 이식이 가능하고 크기와 로드 시간이 효율적인 새로운 포맷입니다.
지원함 
Firefox 52 이상
지원함 
Chrome 57 이상
지원함
Safari 11 이상
지원함
Edge 16 이상
Large-Allocation Http 헤더 
브라우저가 콘텐츠를 로드하는 데 사용 가능한 메모리가 충분한지 확인하는 데 유용합니다(Large-Allocation Http 헤더 참조).
지원함 
Firefox 53 이상
지원 안 함지원 안 함지원 안 함
Brotli 압축 
빌드 크기를 줄입니다(Brotli 압축 참조).
지원함지원함지원 안 함지원함

참고

  • Chrome은 생성된 JavaScript 코드를 파싱하는 데 많은 양의 메모리를 필요로 할 수 있으므로, 32 비트 브라우저에서 콘텐츠를 로드할 때 메모리 부족 오류 또는 크래시가 발생할 수 있습니다. 메모리 사용에 대한 자세한 내용은 메모리 고려사항을 참조하십시오.


<iframe src="http://www.naver.com"></iframe>

 

네이버를 아이프레임에 넣으면 빈 화면만 표시된다.

굳이 이런것까지 막을 필요가 있을까 싶겠지만, 간단하게 자바스크립트로 작성한 프레임(주로 iframe)을 이용한 디도스 공격을 시도한다면 그대로 당할 수 밖에 없다.

이러한 사소한 공격이라도 예방하려면 사이트가 프레임 또는 아이프레임에 표시되지 않도록 해야 한다.

또한 이 방법은 클릭재킹공격(Clickjacking Attact)에 대한 예방효과도 있다.

 

 

 

자바스크립트를 이용한 방법

<script type="text/javascript">

    if(top != window) {

        top.location window.location;

    }

</script>

 

 

 

메타 태그를 이용한 방법

<meta http-equiv="X-Frame-Options" content="deny" />

 

 

 

서버사이드 확장헤더를 이용한 방법

 

PHP

  header("X-Frame-Options: DENY");

 

Java

  HttpServletResponse res = (HttpServletResponse)response;

  res.addHeader("X-FRAME-OPTIONS""DENY");

 

C#

  this.Response.Headers["X-FRAME-OPTIONS"] = "DENY";

  또는

  HttpContext.Current.Response.AddHeader("x-frame-options""DENY");

 

X-Frame-Options 확장헤더에 사용되는 값

  DENY : 해당 페이지를 frame에 표시할 수 없게 한다

  SAMEORIGIN : 해당 페이지와 동일한 orgin에 해당하는 frame만 표시 한다

  ALLOW-FROM uri : 해당 페이지는 지정된 orgin에 해당하는 frame만 표시 한다



Http Server를 이용한 방법


Apache

  • Header always append X-Frame-Options SAMEORIGIN 

Nginx 

  • add_header X-Frame-Options SAMEORIGIN;

위와 같이 설정하면 된다. 나 또한 위 설정을 통해 X-Frame-Options 설정을 변경했다. 그런데 문제가 해결되는 것이 아니라 또 다른 문제가 생겼다.

Multiple 'X-Frame-Options' headers with conflicting values ('SAMEORIGIN, DENY')

http 응답 헤더를 분석했더니 DENY와 더불어 또 하나의 SAMEORIGIN 설정이 추가되어 충돌이 발생하는 상황이었다. 아무리 DENY 설정을 제거하려고 삽질을 해봤지만 제거되지 않았다.

1시간 동안 Apache 웹 서버와 삽질하다가 혹시 Apache가 아니라 뒤에 연결되어 있는 Tomcat 서버의 응답 헤더에 DENY 설정이 포함되어 있는 것은 아닐까라는 의심을 하게 되었다.

> curl -I http://localhost:8080

위와 같이 명령을 실행해 응답 헤더를 확인하니 떡하니 DENY 설정이 추가되어 있다. 이럴 때의 허무함이란..

다시 Tomcat에서 X-Frame-Options 설정 시작했다. Tomcat은 기본 값으로 X-Frame-Options 설정을 DENY로 설정하고 있었다. 이 문제를 해결하기 위해 Servlet Filter를 추가해 해결했다.

public class CorsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("X-Frame-Options", "ALLOW-FROM https://apps.facebook.com");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

위와 같이 설정하니 X-Frame-Options가 정상적으로 변경되는 것을 확인했다. chrome은 아직까지 ALLOW-FROM 설정을 인식하지 못해 무시해 버리기 때문에 정상적으로 동작한다. 다룬 브라우저도 정상적으로 동작... 오늘 오전의 삽질 경험을 공유해 본다.





spring security 버전 업그레이드 후에 X-Frame-Options이 http header에 추가되어 iframe으로 동작하던 기능이 정상적으로 동작하지 않는 이슈가 발생했다.

얼마 전 X-Frame-Options to DENY 설정 때문에 iframe을 통해 접근할 수 없는 문제 해결 글에서도 관련 이슈를 등록했던 적이 있다. 이 문제를 해결하면서 이전에 추가하지 않던 header를 tomcat에서 갑자기 추가하지는 않을 것으로 예상했다. 그냥 의구심만 가지고 지나쳤다가 다른 iframe 이슈를 해결하다 X-Frame-Options header를 spring security가 보안 이슈를 해결하기 위해 추가한다는 것을 알게 되었다.

가능하면 iframe을 사용하지 않으면 좋겠지만 그렇지 않은 경우 다음과 같이 X-Frame-Options header 추가하는 부분을 다음과 같이 disable 함으로써 문제를 해결할 수 있다.


http.headers().frameOptions().disable()



PS.. Apple Safari 11 에서는 iFrame에서 실행되는 콘텐츠에 대해 IndexedDB를 지원하지 않습니다.

(TypeError: 'undefined' is not an object (evaluating 'window.indexedDB.open')


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

[SVN] SVN 에러 E155004, E200030 등등  (0) 2019.01.15
Jquery-selector-정리  (0) 2019.01.10
IndexedDB 참고사이트  (0) 2019.01.07
WebGL 프로젝트 빌드 및 실행 WebGL 브라우저 호환성  (0) 2019.01.07

+ Recent posts