728x90
반응형

[ajax] Error code 0, error undefined


작성일자 : 2018년 11월 18일



1. 현상


HTML form 내에서 ajax를 사용하는 Javascript 함수 호출 시 간헐적 에러 발생


예시


HTML

<form onsubmit='JavaScript:example(data)> 

// submit 시 example 함수 실행 --------------------(2)


<!-- Logic -->


<button type="submit" value="submit"></button>

//button Click 시 form에 submit 전달 --------------------(1) 


</form>



Javascript

function example(data){


        // 아래 오류 발생 ajax 수행 ---------------(3)

$.ajax({

method : "GET",

url : "url",

data : {data: data},

success: function(){

//Logic

},

                // 에러 발생 후 아래 함수 실행 -----------(4)

error: function(request, status, error){ 


alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);  

                        // 실행 결과 code 0, undefined Error 발생 문구 alert --------------- (5)


}

});



alert 내용

code : 0

message :       

error : undefined




2. 원인


 AJAX 응답을 받기 전에 브라우저 새로 고침이 트리거 된 경우 발생


즉 Submit에 의해 form의 (action 미 설정 시 현재위치 새로고침) action과, ajax 호출 함수인 example이 트리거 되고,

example 함수에 의한 ajax 수행 중 ajax 결과를 받기 전에 action에 의해 새로고침이 트리거 될 때 발생


응답 속도에 따라 동일한 Flow가 success가 될 수도, Fail이 될 수도 있는 상황




3. 해결방안


form에 의한 action을 없애고, ajxa 결과 반환 후 action을 수행하도록 설정


수정 후 예시


HTML

<form onsubmit='JavaScript:example(data, event)>  // event 인자 추가

// submit 시 example 함수 실행 --------------------(2)


<!-- Logic -->


<button type="submit" value="submit"></button>

//button Click 시 form에 submit 전달 --------------------(1) 


</form>



Javascript

function example(data, event){

        event.preventDefault(); // event 중단 함수


        // 아래 오류 발생 ajax 수행 ---------------(3)

$.ajax({

method : "GET",

url : "url",

data : {data: data},

success: function(){

// Logic

                        // Ajax 응답 후 수행 할 Action 추가

},

                // 에러 발생 후 아래 함수 실행 -----------(4)

error: function(request, status, error){ 


alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);  

                        // 실행 결과 code 0, undefined Error 발생 문구 alert --------------- (5)


}

});





4. 참고


https://stackoverflow.com/questions/2000609/jquery-ajax-status-code-0

728x90
반응형
728x90
반응형

[postgreSQL] FATAL:  pg_hba.conf rejects connection for host ‘IP’

 

작성일자 : 2018 0927

환경 : PostgreSQL 9.2.14, AWS Linux

 


1. 현상 :


사용하던 데이터베이스의 접속이 거부 된다는 로그 확인


FATAL:  pg_hba.conf rejects connection for host "127.0.0.1", user "postgres", database "postgres"

 



- 설정 확인

PGDATA/data/ > vi pg_hba.conf



 

추가한 적 없는 옵션이 상단에 추가된 것을 확인


host all postgres 0.0.0.0/0 reject

host all pgdbadm 0.0.0.0/0 md5

# 기본계정인 postgres 계정으로 접속을 제한하고 pgdbadm 계정으로 접속 허용


pgdbadm 계정은 최근 crypto-mining 공격 계정으로 알려져 있다.

 

 


2. 해결 방안 :



추가 된 옵션을 주석 처리 후 PostgreSQL 재시작

 



3. 권고 사항 :



서비스 시 기본 계정인 postgres 계정 외 계정 사용


pg_hba.conf 파일 수정 제한

 



4. 참조


https://dba.stackexchange.com/questions/215294/why-does-pg-hba-conf-sometimes-have-random-rules-added-to-it-postgresql?rq=1


728x90
반응형
728x90
반응형

[Jenkins] JUnit 연동


작성일자 : 2018년 10월 23일

목표 : Jenkins와 JUnit을 연동하여 Jenkins Build 진행 시 테스트 작업을 수행하도록 설정



1. Jenkins 설정


JUnit Plugin 설치




2. Project 설정


JUnit 사용 설정 및 테스트 케이스 생성

참고 : http://osc131.tistory.com/92


3. 확인


프로젝트에 기본적으로 JUnit 적용이 되어있다면, 플러그인 설치 후 젠킨스 빌드를 진행하면 별다른 설정 없이도 테스트를 진행


Build Log


728x90
반응형

'Jenkins' 카테고리의 다른 글

[Jenkins] 이전 저장소로 빌드  (0) 2018.10.20
[jenkins] GIT Publisher  (0) 2018.10.20
[Jenkins] 자동빌드 설정  (0) 2018.07.21
[Jenkins] 자동배포 설정  (0) 2018.07.21
[Jenkins] Github 연동  (0) 2018.07.21
728x90
반응형

[Spring] JUnit 적용하기


작성일자 : 2018년 10월 23일


JUnit이란?

오픈소스 프레임워크로 Java 단위테스트 도구 



1. 의존성 설정


pom.xml


.

..

<dependencies>

..

..

<!-- Test -->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.7</version>

<scope>test</scope>

</dependency>       

..

..

</dependencies> 




2. 테스트 클래스 생성


- src/main 밑에 있는 테스트할 클래스의 경로와 동일하게 src/test 밑에 생성


ex>

src/main/java/com/company/security/HomeController Class를 Test 하기 위해  src/test/java/com/company/security/ 밑에 TestClass 생성





3. 테스트 함수 작성


- @Test 어노테이션을 붙여 테스트 함수를 작성

- assertEquals( 예상 값 , 실제 값 )





4. 확인


- 프로젝트 우클릭 > Run As > JUnit Test






728x90
반응형
728x90
반응형

[Spring] Mapped Statements collection does not contain value for ~


작성일자 : 2018년 10월 23일


1. 증상 : 


Spring 기반 Web Application에서 쿼리 관련 작업 실행 시 아래 에러 문구 출력

"Mapped Statements collection does not contain value for ~"


2. 원인 :


위 증상의 원인은 대부분 아래와 같다.

1. mapper id가 틀린 경우

2. Parameter와 bean의 field명이  틀린 경우

3. sql.xml에서 정의된 namespace와 DAO에서 호출하는 namespace가 다를 경우

4. mapper가 정의가 되어 있지 않거나 Spelling이 틀린 경우

5. mapper에 정의된 namespace 명칭이 같은 Application 내에 중복 될 경우


실제 원인은 특정 시점 기준으로 동일한 이름이 존재하는 xml 파일은 메이븐 빌드 시 제외되는 현상이 발생하여, 4의 이유로 에러가 발생

ex ) test.java, test.xml 두 개의 파일이 존재 시 test.xml은 제외된 채 빌드


3. 해결 방안 :


1. 네이밍 변경

or

2. 메이븐에 직접 mapper 파일 포함 설정



메이븐 설정을 통해 문제 해결.


pom.xml


.. 

<build>

<finalName>test</finalName>

<resources>

<resource>

<directory>src/main/java</directory>

<includes>

<include>**/*.xml</include>

</includes>

</resource>

</resources>

..

</build>

..


728x90
반응형
728x90
반응형


[jenkins] 이전 저장소로 빌드


작성일자 : 2018 10 20

환경 : Jenkins 2.129, JDK 1.8.0_101

목표 : Jenkins 빌드 작업 진행 시 기존에 백업 된 저장소를 사용하여 빌드


* Jenkins - Git 설정 및 Git Publisher 설정 선행



1. Jenkins 설정


General > 빌드 매개변수 추가 > List Subversion tags (and more)



- tags에 있는 모든 백업 본 표시

- 최대 10개 까지만 표시




소스 코드 관리 설정



- 빌드에 사용할 저장소 설정

- VERSION은 위에서 설정한 매개변수 명이며, 사용할 이전 저장소들의 이름이 된다.



2. 확인 


General 설정에 의해 설정 경로에 있는 Tags들을 빌드 매개변수에서 확인 가능




빌드 후 확인





728x90
반응형

'Jenkins' 카테고리의 다른 글

[Jenkins] JUnit 연동  (0) 2018.10.23
[jenkins] GIT Publisher  (0) 2018.10.20
[Jenkins] 자동빌드 설정  (0) 2018.07.21
[Jenkins] 자동배포 설정  (0) 2018.07.21
[Jenkins] Github 연동  (0) 2018.07.21
728x90
반응형

[jenkins] GIT Publisher


작성일자 : 2018 10 20

환경 : Jenkins 2.129, JDK 1.8.0_101

목표 : Jenkins Build 작업 진행 후 Build에 사용됐던 GIT 버전을 Tags로 저장 ( 일종의 백업 )


* Jenkins - Git 연동 설정 및 GIT Plugin 설치 선행 필요


 1. Jenkins 설정


소스 코드 관리



- Target Name 선언




빌드 후 조치



- Target remote name : 위에서 설정한 target name

- Tag to push : Publish할 tag 이름 설정




2. 확인


Jenkins Build

 


빌드 성공 후 .git/refs/tags/ 경로에 Build Number의 이름으로 생성된 tag 확인 가능



728x90
반응형

'Jenkins' 카테고리의 다른 글

[Jenkins] JUnit 연동  (0) 2018.10.23
[Jenkins] 이전 저장소로 빌드  (0) 2018.10.20
[Jenkins] 자동빌드 설정  (0) 2018.07.21
[Jenkins] 자동배포 설정  (0) 2018.07.21
[Jenkins] Github 연동  (0) 2018.07.21
728x90
반응형

[spring] Spring Security 인증 구현


작성일자 : 2018년 10월 18일

환경 : Spring Framework 3.1.1, Spring Security 3.1.3


설정 위치 :






1. pom.xml


<dependencies>

...     

             <dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-web</artifactId>

        <version>3.1.3.RELEASE</version>

    </dependency>

    

    <dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-config</artifactId>

        <version>3.1.3.RELEASE</version>

    </dependency>

...

</dependencies> 


프로젝트 내에서 Spring Security를 사용하기 위한 의존성 추가



2. web.xml


<web-app>

...

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/spring/root-context.xml

/WEB-INF/spring/security-context.xml

</param-value>

</context-param> 

..

..

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>


<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

...

</web-app>


모든 경로에 filter 추가, context 등록




3. User.java


package com.company.security;


import java.util.Collection;


import org.springframework.security.core.GrantedAuthority;

import org.springframework.security.core.userdetails.UserDetails;


public class User implements UserDetails{


private static final long serialVersionUID = 1L;

private String id;

private String pw;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPw() {

return pw;

}

public void setPw(String pw) {

this.pw = pw;

}


@Override

public Collection<? extends GrantedAuthority> getAuthorities() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getUsername() {

// TODO Auto-generated method stub

return null;

}

@Override

public boolean isAccountNonExpired() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isAccountNonLocked() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isCredentialsNonExpired() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isEnabled() {

// TODO Auto-generated method stub

return false;

}

@Override

public String getPassword() {

// TODO Auto-generated method stub

return null;

}

}


Spring Security의 UserDetails을 구현한 클래스, 유저 세션 객체로서 사용




4. CustomAuthenticationProvider


package com.company.security;


import java.util.ArrayList;

import java.util.List;


import org.springframework.security.authentication.AuthenticationProvider;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;

import org.springframework.security.core.Authentication;

import org.springframework.security.core.AuthenticationException;

import org.springframework.security.core.GrantedAuthority;

import org.springframework.security.core.authority.SimpleGrantedAuthority;


import com.company.security.User;




public class CustomAuthenticationProvider implements AuthenticationProvider {


@Override

public Authentication authenticate(Authentication authentication)

throws AuthenticationException {


        String user_id = (String)authentication.getPrincipal();

        String user_pw = (String)authentication.getCredentials(); 

              // Form에서 전달 된, name 태그 설정이 username-parameter, password-parameter로 되있는 값을 읽어온다

        

        if(user_id.equals("fail")){

        return null;

        }

              //fail로 로그인 시 null 반환 > loginFail 테스트


        // ----------------------------------------------

        // DB 내 아이디, 패스워드 값 비교 로직 필요

        // ----------------------------------------------


        User user= new User();

        user.setId(user_id);

        user.setPw(user_pw);

        List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();

        roles.add(new SimpleGrantedAuthority("ROLE_USER"));

        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(user_id, user_pw, roles);

        result.setDetails(user);

        //user session 생성 후 반환

 

return result;

}


@Override

public boolean supports(Class<?> authentication) {

return authentication.equals(UsernamePasswordAuthenticationToken.class);

}


Spring Security의 AuthenticationProvider을 구현한 클래스로 security-context에 provider로 등록 후 인증절차를 구현

login view에서 login-processing-url로의 form action 진행 시 해당 클래스의 supports() > authenticate() 순으로 인증 절차 진행




5. security-context.xml


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"

  xmlns:beans="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

            

<http pattern="/resources/**" security="none"></http>

<http pattern="/**/login" security="none"></http>

<http pattern="/**/loginFail" security="none"></http>


    <http auto-config='true'>

        <intercept-url pattern="/**" access="ROLE_USER" />

        <form-login login-page="/login"

                  username-parameter="id"

                  password-parameter="pw"       

                  login-processing-url="/login.do"

                  default-target-url="/loginSuccess"

                  authentication-failure-url="/loginFail" 

                  always-use-default-target='true'

            />

    </http>

      

<authentication-manager>

<authentication-provider ref="customAuthenticationProvider" />

</authentication-manager>

        <beans:bean id="customAuthenticationProvider" class="com.company.security.CustomAuthenticationProvider"/> 


</beans:beans>



Spring Security 설정


<http pattern="/**/login" security="none"></http> : 특정 url의 security 제외, 해당 URL로는 인증 절차 없이도 접근 가능


login-page : 로그인 URL

username-parameter, password-parameter : 아이디, 비밀번호로 사용할 변수 명

login-processing-url : 인증 절차를 진행 할 URL, 해당 URL로 form 전송 시 AuthenticationProvider을 구현한 클래스로 전달

default-target-url : 성공 시 이동

authentication-failure-url : 실패 시 이동


<authentication-provider ref="customAuthenticationProvider" /> : AuthenticationProvider을 구현 한 Provider 등록 

<beans:bean id="customAuthenticationProvider" class="com.company.security.CustomAuthenticationProvider"/> : Provider의 Bean 등록 



6. HomeController


package com.company.security;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;


import org.springframework.security.core.context.SecurityContextHolder;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;


/**

 * Handles requests for the application home page.

 */

@Controller

public class HomeController {


@RequestMapping(value = "/login", method = RequestMethod.GET)

public String login() {

return "login";

}

@RequestMapping(value = "/loginSuccess", method = RequestMethod.GET)

public String loginSuccess(HttpSession session, HttpServletRequest request) {

        

        //CustomAuthenticationProvider에서 set한 값을 로드

        User user = (User)SecurityContextHolder.getContext().getAuthentication().getDetails();

        

        //세션 설정

        session.setAttribute("id", user.getId());

        session.setAttribute("pw", user.getPw());


return "loginSuccess";

}

@RequestMapping(value = "/loginFail", method = RequestMethod.GET)

public String loginFail() {

return "loginFail";

}

/**

* Simply selects the home view to render by returning its name.

*/

@RequestMapping(value = "/", method = RequestMethod.GET)

public String home(HttpServletRequest request) {


    HttpSession session = request.getSession();


    String id =(String)session.getAttribute("id");

    String pw =(String)session.getAttribute("pw");

    //로그인 후 위 방식으로 Session 값 사용 가능

return "home";

}

}

 




7. View


login.jsp


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

<form action="/login.do" method="post">

    <div>

        <label for="id">id:</label>

        <input type="text" id="id" name="id"/>

    </div>

    <div>

        <label for="password">pw:</label>

        <input type="password" id="password" name="pw" />

    </div>

    <button type="submit">submit</button>

</form>


</body>

</html>


로그인 페이지로 security-context.xml에서의 username-parameter, password-parameter 값(id,pw)을 name 태그를 이용하여 설정 후 전달

Action 위치는 security-context.xml에서의 login-processing-url(login.do)로 AuthenticationProvider에 접근하여 인증 절차를 진행 


loginSuccess.jsp


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

login Success

</body>

</html>



loginFail.jsp


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

login Fail


</body>

</html>



전체흐름


1) web.xml의 Filter 설정에 의해 모든 경로로의 접근은 Spring Security로 우선 접근

2) 인증이 되지않은 사용자는 security-context.xml에서 설정한 login-page(/login)으로 리다이렉션

3) login view의 Form에서 id와 pw를 입력받아 security-context.xml에서 설정한 login-processing-url(/login.do)로 요청

4) login-processiong-url은 컨트롤러 설정이 필요 X, AuthenticationProvider을 구현한 클래스(CustomAuthenticationProvider)의 authenticate로 전달

5) authenticate 함수에서 인증 절차를 진행 한 후 반환 값에 따라 security-context.xml에서 설정한 default-target-url, authentication-failure-url로 이동 


Filter > login-page > view > login-processing-url > Provider(인증 절차 진행) > default-target-url(성공 시) ,  authentication-failure-url(실패 시)




확인



경로 접근 시 /login으로 리다이렉션



fail외의 아이디로 로그인 시 인증 성공



fail로 로그인 시 인증 실패

728x90
반응형

'Java' 카테고리의 다른 글

[spring] Controller -> JSP 데이터 전달  (0) 2019.06.28
[Spring] JUnit 적용하기  (0) 2018.10.23
[Spring] Spring Security 적용  (0) 2018.10.17
[Spring] Error Page 커스터마이징  (0) 2018.10.15
[Spring] 정적 리소스 사용 설정  (0) 2018.07.28
728x90
반응형

[Spring] Spring Security 적용


작성일자 : 2018년 10월 17일

환경 : Spring Framework 3.1.1, Spring Security 3.1.3

목표 : 최소한의 설정으로 기본 로그인 기능을 추가


1. pom.xml


<dependencies>

...     

             <dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-web</artifactId>

        <version>3.1.3.RELEASE</version>

    </dependency>

    

    <dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-config</artifactId>

        <version>3.1.3.RELEASE</version>

    </dependency>

...

</dependencies> 


의존성 추가




2. web.xml


<web-app>

...

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/spring/root-context.xml

/WEB-INF/spring/security-context.xml

</param-value>

</context-param> 

..

..

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>


<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

...

</web-app>


모든 경로에 filter 추가, context 등록




3. security-context.xml


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"

  xmlns:beans="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

            

    <http auto-config='true'>

        <intercept-url pattern="/**" access="ROLE_USER" />

    </http>

       

    <authentication-manager>

        <authentication-provider>

            <user-service>

                <user name="guest" password="guest" authorities="ROLE_USER"/>    

            </user-service>

        </authentication-provider>

    </authentication-manager>

</beans:beans>


2.에서 추가한 context 경로에 생성




4. 확인


어떤 경로로 접근 하건 기본 로그인 페이지 확인 가능


3. 에서 설정한 guest / guest 로 로그인 가능


+++

Spring과 Spring Security 버전에 따라 오류 발생 가능



참고

http://yakolla.tistory.com/48

728x90
반응형

'Java' 카테고리의 다른 글

[Spring] JUnit 적용하기  (0) 2018.10.23
[spring] Spring Security 커스터마이징  (0) 2018.10.18
[Spring] Error Page 커스터마이징  (0) 2018.10.15
[Spring] 정적 리소스 사용 설정  (0) 2018.07.28
Spring, PostgreSQL 연동 with MyBatis  (6) 2018.06.03
728x90
반응형

[Spring] Error Page 커스터마이징


작성일자 : 2018년 10월 15일




web.xml에 아래 설정 추가



<web-app>

...

<error-page>

    <error-code>404</error-code>

    <location>/WEB-INF/views/404.jsp</location>

</error-page>

...

</web-app>





webapp 밑 해당 경로에 페이지 추가




위 설정 후 잘못된 경로로의 접근으로 인한 404 코드 반환 시 프로젝트 내 404.jsp 화면이 출력된다.

같은 방법으로 다른 Error Page도 커스터마이징이 가능하다.

728x90
반응형

'Java' 카테고리의 다른 글

[spring] Spring Security 커스터마이징  (0) 2018.10.18
[Spring] Spring Security 적용  (0) 2018.10.17
[Spring] 정적 리소스 사용 설정  (0) 2018.07.28
Spring, PostgreSQL 연동 with MyBatis  (6) 2018.06.03
Spring 개발 환경 세팅  (0) 2018.06.02

+ Recent posts