html로 브라우저 캐시를 초기화하기 : 캐시를 사용하지 않도록 하는 메타태그 no-cahe
pragma : no-cache는 캐싱을 방지하는 메타태그입니다. Expires: -1는 캐시된 페이지를 즉시 만료합니다.
<meta http-equiv="Expires" content="Mon, 06 Jan 1990 00:00:01 GMT">
# 위의 명시된 날짜 이후가 되면 페이지가 캐싱되지 않습니다.
(따라서 위와 같은 날짜로 지정할 경우 페이지는 지속적으로 캐싱되지 않습니다.)
<meta http-equiv="Expires" content="-1">
# 캐시된 페이지가 만료되어 삭제되는 시간을 정의합니다. 특별한 경우가 아니면 -1로 설정합니다.
<meta http-equiv="Pragma" content="no-cache">
# 페이지 로드시마다 페이지를 캐싱하지 않습니다. (HTTP 1.0)
<meta http-equiv="Cache-Control" content="no-cache">
# 페이지 로드시마다 페이지를 캐싱하지 않습니다. (HTTP 1.1)
위 방법들은 뒤로 가기 한 번만 막고 두 번 뒤로가면 그대로 넘어가기 때문에 의미가 없어서 세션 키 검사를 통해 로그인 후 생성된 유저키 세션이 있으면 유지하거나 뒤로가기가 가능하고 로그아웃이 되어 세션이 없으면 뒤로가기를 막게끔 했습니다. 아래 코드를 로그인 화면을 제외한 다른 화면에 넣었습니다. 일정 시간마다 세션을 체크하는 코드입니다.
function CheckSession() {
if (sessionStorage.getItem("loginKey") == null) {
window.location = "로그인화면주소";
}
}
setInterval(CheckSession(), 100);
사용자가 페이지를 정말로 떠날 것인지 묻는 팝업창을 표시합니다. 팝업창을 표시하려면 이벤트의 preventDefault()를 호출해야합니다.
window.addEventListener('beforeunload', (event) => {
// 표준에 따라 기본 동작 방지
event.preventDefault();
// Chrome에서는 returnValue 설정이 필요함
event.returnValue = '';
});
<textarea style="width:600px;" class="DOC_TEXT" name="DOC_TEXT" placeholder="선택하신 서류사항 항목에 대한 내용을 200자 이내로 기재해주세요.">
</textarea>
<br />
<span style="color:#aaa;" id="counter">(0 / 최대 200자)</span>
// textarea 체크
$('.DOC_TEXT').keyup(function (e){
var content = $(this).val(); //입력한 것
$('#counter').html("("+content.length+" / 최대 200자)"); //글자수 카운팅
if (content.length > 200){ //200자 이상일 때
alert("최대 200자까지 입력 가능합니다.");
$(this).val(content.substring(0, 200)); //넘어간 글자 자르기
$('#counter').html("(200 / 최대 200자)");
}
});
특정 문자 반복 횟수 체크
특정 문자가 얼마나 반복되는 지 세는 법은 아래와 같습니다. 아래는 정규식을 사용한 예입니다.
var temp = "This is a string.";
var count = (temp.match(/is/g) || []).length;
alert(count);
//https://hashcode.co.kr/questions/1434/%ED%8A%B9%EC%A0%95%EB%AC%B8%EC%9E%90%EA%B0%80-%EC%96%BC%EB%A7%88%EB%82%98-%EB%B0%98%EB%B3%B5%EB%90%98%EB%8A%94%EC%A7%80-%EC%84%B8%EB%8A%94%EB%B2%95
// 한글 글자수 체크 함수
function checkLength(str) {
var redex = /\s/ig;
var extrablank = $(str).val().toString().replace(redex, "").length;
$(".extrablank").text(extrablank); //결과물이 보여질 부분
}
입력하는 란의 언어 설정
아래와 같이 입력하면 입력폼의 기본값은 한글입니다. ime-mode의 옵션은 active(한글), inactive(영문), auto(선택된 mode 적용), disabled(영문만 입력 가능)이 있습니다.
→ 사용자의 상태 유지를 위한 정보를 웹 브라우저에 저장해서 웹 서버가 쿠키 정보를 읽어 사용한다. 쿠키는 웹 서버에서 열어볼 수 있다.
세션 : 웹서버의 웹 컨테이너에 상태를 유지하기 위한 정보를 저장
→ 사용자의 정보를 유지하기 위해 javax.servlet.http 패키지의 HttpSession 인터페이스를 구현해서 사용한다. 웹 브라우저 당 1개씩 생성되어 웹 컨테이너에 저장된다. 웹 서버는 각 브라우저별 발생한 요청에 대해 특별한 식별자를 부여한다.
세션의 속성
java
session.setAttribute("id", "value");
String id = (String)session.getAttribute("id"); //리턴 타입은 Object
session.removeAttribute("id");
session.invalidate(); //세션의 모든 속성을 삭제
JS
var sessionData = keyName;
sessionStorage.setItem(keyName, keyValue ); // 저장
sessionStorage.getItem(keyName); // keyName에 해당하는 값 return (없으면 null)
sessionStorage.length; // 저장된 데이터의 갯수 리턴
sessionStorage.key(index); // index 번째의 키 이름 return
sessionStorage.removeItem(keyName); // keyName에 해당하는 값 삭제
sessionStorage.clear(); // 모든 데이터 삭제
JS의 경우 sessionStorage.clear(); 로 모두 삭제해주면 됩니다. 위는 sessionStorage에서 지원하는 메서드들입니다. 따라서 location.href 에 홈 화면이나 로그인 화면으로 연결시키고 sessionStorage.clear로 간단하게 세션을 모두 날려버리면 로그아웃이 됩니다.
absolute 내의 absolute는 절대좌표라 정확한 위치에 있지 않습니다. relative 내의 absolute는 화면 이동 시에도 정확한 위치에 표시됩니다. static은 그 자체로 top, left, ...나 z-index가 반영되지 않으므로 기준으로 위치를 잡지 못합니다. float 역시 동작되지 않습니다.
position:absolute인 요소 중앙 정렬
position이 absolute인 요소를 중앙 정렬하려면 top 50%; left: 50%; 만으로 끝나지 않습니다. 따라서 이후 몇 가지를 추가하거나 조정해야 합니다.
첫 번째 방법 :
transform의 기능 중에서 위치 이동 기능 translate를 함께 사용해서 조정합니다. div 안의 콘텐트 (텍스트 등) 영역이 가변값이어도 자동 중앙 정렬이 되며, transform 속성은 GPU가속이 가능해 속도향상에 도움이 된다고도 합니다. 단점은 ie8 이하 버전에서는 동작하지 않습니다. ie9부터 사용 가능합니다.
transform : translate(-50%, -50%); //absolute 가로, 세로 가운데 정렬
두 번째 방법 :
margin-top과 margin-left로 조정합니다. 크로스브라우징 문제에서는 자유롭습니다. 수동으로 margin값을 설정해야하는 단점이 있는데, 아래 방법은 이에서 한 단계 업그레이드 되었습니다.
margin-left: -50px;
margin-right: -50px;
top, left, right, bottom은 0으로, margin은 auto로 설정합니다. 추가 연산은 필요없으나 width, height 값이 고정값이여야 하는 단점이 있습니다.
JSON(제이슨[1],JavaScript Object Notation)은속성-값 쌍( attribute–value pairs and array data types (or any other serializable value)) 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는개방형 표준포맷이다. 비동기 브라우저/서버 통신 (AJAX)을 위해, 넓게는XML(AJAX가 사용)을 대체하는 주요 데이터 포맷이다. 특히,인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히컴퓨터 프로그램의변수값을 표현하는 데 적합하다.
JSON 포맷은 본래더글라스 크록포드가 규정하였다. RFC 7159와 ECMA-404 그리고 ISO/IEC 21778:2017[2]표준에 의해 기술되고 있다. KS 부합화 표준은 아직 제정되지 않았으며, TTA 협회 표준명은TTAE.OT-10.0394이다. ECMA 표준과 ISO/IEC 표준은 문법만 정의할 정도로 최소한으로만 정의되어 있는 반면 RFC는 시맨틱, 보안적 고려 사항을 일부 제공 한다.[3]JSON의 공식 인터넷 미디어 타입은application/json이며, JSON의 파일 확장자는.json이다.
데이터를 저장, 읽는 데 사용하는 Name - Value 속성은 꼭 지정해야 합니다. Expires는 쿠키 파기날짜를 지정하는 속성인데 지정되지 않으면 브라우저 종료 시 쿠키가 삭제됩니다.
Domain 속성을 비우면 현재 도메인의 경로로 자동 입력됩니다. 페이지 요청과 일치해야 접근 가능합니다.
Path 속성을 비우면 현재 도메인의 경로로 자동 입력되며 특정 경로(폴더명)을 설정합니다. '/'로 설정하면 도메인 모든 곳은 곳에서 접근이 가능합니다.
Secure 속성을 지정하면 해당 쿠키는 SSL을 사용해서면 요청할 수 있습니다. (출처)
*SSL : 3자가 보증해주는 디지털 인증서. SSL(Secure Socket Layer) 프로토콜은 처음에 Netscape사에서 웹서버와 브라우저(클라이언트) 사이의 보안을 위해 만들었습니다. 클라이언트는 인증서 정보가 신뢰할 수 있는지 검증을 거친 후 다음 절차를 수행하게 됩니다. HTTPS는 SSL 프로토콜 위에서 돌아가는 프로토콜입니다. (출처)
// 변수를 선언
var date = new Date();
date.setDate(date.getDate() + 7);
var willCookie = "";
willCookie += "CookieName=Value;";
willCookie += "expires=" + date.toUTCString();
// 쿠키에 넣는다.
document.cookie = willCookie;
쿠키 읽어오기
alert(document.cookie);
document 객체의 cookie 속성을 출력하면 됩니다. 여러 쿠키를 한 번에 출력하므로 개별적인 쿠키를 읽으려면 반복문 처리 등의 과정이 필요합니다. 아래는 5개의 쿠키가 생성되는데요.
// 변수를 선언한다.
var date = new Date();
date.setDate(date.getDate() + 7);
// 5번을 반복한다.
for(var i = 0; i < 5; i++) {
var willCookie = "";
willCookie += "Name" + i + "=Value";
willCookie += "Expires=" + date.toUTCString();
// 쿠키를 집어넣는다.
document.cookie = willCookie;
}
// 출력한다.
alert(document.cookie);
이제 쿠키의 Value 속성을 추출하여 Name 속성으로 분해해 출력해보겠습니다. 우선 문자열을 세미콜론(;)을 사용해 분해합니다. 분해하면 Name=Value 형태의 문자열로 분해됩니다.
// 변수를 선언한다.
var name = "Name4";
var cookies = document.cookie.split(";");
alert(cookies);
// 쿠키를 추출한다.
for(var i in cookies) {
if(cookies[i].search(name) != -1) {
alert(cookies[i].replace(name + "=", ""));
// ※ 참고 : 특정 브라우저 양끝 공백 문제 발생시 대응
// alert(cookies[i].replace(name + "=", "").replace(/^\S\S*/, "").replace(/^\S\S*$/, ""));
}
}
쿠키 제거하기
// 변수를 선언한다.
var date = new Date();
date.setDate(date.getDate() - 1);
var willCookie = "";
willCookie += "CookieName=Value;";
willCookie += "Expires=" + date.toUTCString();
// 쿠키를 집어넣는다.
document.cookie = willCookie;
// 출력한다.
alert(document.cookie);
미리 자바 개발 환경은 구축되어있다는 관점에서 이야기하겠습니다. 먼저 간단하게 전자정부 프레임워크란정부, 공공기관, 공기업 등의 웹사이트에 자주 쓰이는 공통 기능들을 Java Spring 프레임워크와 유명 라이브러리로 미리 만들어놓은 공통 컴포넌트와 개발환경, 실행환경, 운영환경, 관리환경 등으로 구성됩니다.
다운받은 파일의 압축을 풀은 후, Ecplise 폴더로 들어가 이클립스를 실행해줍니다. 각 버전 넘버가 적힌 eGovFrame 로고가 뜨면서 프로그램이 실행됩니다. workspace를 설정해주고(workspace를 C에 설정했을 경우 마우스 우클릭>관리자 권한으로 실행)새로 실행했을 경우 Eclipse>Window>Perspective>Open Perspective>Other로 들어가 팝업에서 eGovFrame 를 선택합니다.
이클립스 실행 →Dynamic Web Project 생성(혹은 eGovFrame Web Project) 합니다. ProjectName을 임의로 설정하고 Maven Setting이 필요할 경우 Id를 설정합니다. Generate Example을 클릭하면 예제 소스 생성도 가능합니다. (출처)
위와 같은 과정을 따르면 JS 파일들이 규격에 맞는지 검사되고, 색색깔의 삼각형(▶) 모양의 오류들이 나타납니다. 아직 빨간색, 초록색만 봤는데 빨간색은 위험, 초록색은 중간 위험...이런 것 같은데 다 고쳐주고 있습니다.
오류 각각을 누르면, 고쳐야 할 부분으로 자동 이동됩니다.그 이유, 개선하면 좋을 방향들을 Show Detail 을 눌러 그 내용을 참고하여 고쳐나가면 됩니다. 웹사이트로 연결되는 친절한 가이드도 있습니다.
위 캡쳐는 제가 개발한 코드가 아니라 jquery 기본 라이브러리지만, 이미지가 필요해서 캡쳐해봤습니다.
검사를 돌리고 나왔던 자주 겹쳤던 오류들로 전역 변수 오류(window.를 앞에 삽입하거나 지역변수로 변경하거나), es6 ecma 규격으로 변경(==보다 ===권장), if 문의 중괄호 확인(if(){}), if-else문에서 if에 return이 있다면 불필요한 else문 없애고 밖으로 빼기 등이 있었습니다.