728x90

[Tomcat] 톰캣 오류 처리하기 만들기 ErrorReportValve Custom Tomcat Valve

프로그램 자료/Java & Spring 2019. 10. 31. 11:31

출처1 : http://jagadesh4java.blogspot.com/2014/09/custom-error-page-in-tomcat.html

출처2 : https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/

출처3 : https://github.com/theand/til-by-heesang/blob/master/md/java/tomcat_invalid_character_found_in_request.md

출처4 : https://server0.tistory.com/39

 

얼마전에 납품한 솔루션의 웹 보안 리포트를 받았다. 

특정 url에서 페이지 없음 오류가 떠야하는데 톰캣 에러가 예쁘게 뜨더라.

 

대충 이렇게?? 

 

좀 찾다보니까 톰캣 8.5.31(?) 이상, 9.0.8(?) 이상, 8.0.52(?) 버전부터는 RFC 7230, RFC 3986에 의해 특수문자를 받지 않는다고 하더라.

이미 톰캣 설정에 relaxedQueryChars를 사용하고 있어서 당당히 [] 문자를 넣었다. 

 

그런데 다음과 같은 url로 접속하면 여전히 톰캣 오류가 뜨는 증상이 있었다.

http://127.0.0.1:8080/[

 

어떻게 해야하나 고민했었는데 톰캣에서는 Valve라는 것을 자바 클래스로 만들고, 이걸 상속받아서 구현하면 가져다가 쓸 수 있다고 하더라.

 

package com.motolies.config;

 

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.util.logging.Logger;

 

import org.apache.catalina.connector.Request;

import org.apache.catalina.connector.Response;

import org.apache.catalina.valves.ErrorReportValve;

 

public class CustomErrorReportValve extends ErrorReportValve {

 

    // Create a simple logger

private static final Logger logger = Logger.getLogger(CustomErrorReportValve.class.getName());



    @Override

    protected void report(Request request, Response response, Throwable t) {

        try {

            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "UTF8"));

            out.write("<!DOCTYPE html>");

            out.write("<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:th=\"http://www.thymeleaf.org\">");

            out.write("<head>");

            out.write(" <meta charset=\"utf-8\"/>");

            out.write(" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>");

            out.write(" <meta name=\"description\" content=\"\"/>");

            out.write("</head>");

            out.write("<body>   ");

            out.write(" <script type=\"text/javascript\">");

            out.write("     alert(\"비정상적인 접근입니다.\");");

            out.write("     history.back();");

            out.write(" </script>");

            out.write("</body>");

            out.write("</html>");

            out.close();

 

            // Log the error with your favorite logging framework...

     logger.severe("Uncaught throwable was thrown: " + t.getMessage());

 

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

 

대충 위와 같은 클래스를 만들고 jar 파일로 만들어야 한다. 

 

jar는 다음과 같이 만들면 된다. 

 

 

해당 파일을 우클릭해서 Export 클릭.

 

Export type에 JAR file 선택.

 

만들어질 위치 선택하고 Finish.

 

그럼 jar파일이 만들어지는데 이것을 다음의 경로에 복사한다.

 

..\tomcat\lib

 

아마 이미 많은 jar파일들이 있을 것이다. 

 

마지막으로 tomcat\conf\server.xml 에서 수정을 좀 해야한다. 

 

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"

errorReportValveClass="com.motolies.config.CustomErrorReportValve">

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />

</Host>

 

다음과 같이 빨간색 부분을 추가해주고 톰캣을 재시작하면 된다.

 

 

반응형
728x90

import pandas_datareader.data as web

import datetime

import matplotlib.pyplot as plt

from zipline.api import order, symbol

# order : zipline 백테스팅 시뮬레이션 주문 실행 함수

# symbol : 참조할 데이터에 대한 심볼 등록

#from zipline.algorithm import TradingAlgorithm

from zipline import run_algorithm

from zipline.utils.factory import create_simulation_parameters

# create_simulation_parameters : 초기 금액 설정에 사용

def initialize(context):

pass

def handle_data(context, data):

# order을 통해 AAPL 심볼 주식을 1주 매수

order(symbol('AAPL'), 1)

start = datetime.datetime(2010, 1, 2)

end = datetime.datetime(2016, 3, 19)

data = web.DataReader("AAPL", "yahoo", start, end)

# 새로운 dataframe 객체 만들기

data2 = data[['Adj Close']]

# dataframe의 column의 이름 바꾸기

data2.columns = ['AAPL']

data2 = data.tz_localize("UTC")

data2.head()

# sim_params = create_simulation_parameters(capital_base=100000000)

algo = run_algorithm(start = data2.index[0], end = data2.index[-1], capital_base = 1000000, initialize=initialize, handle_data=handle_data)

plt.plot(algo.index, algo.portfolio_value)

plt.show()

-----

파이썬으로 배우는 알고리즘 트레이딩에 있는 예제에서 변경,

Tradingalgorithm 함수는 과거의 zipline api의 함수인 것으로 확인,

run_algorithm으로 변경

algo = run_algorithm(start = data2.index[0], end = data2.index[-1], capital_base = 1000000, initialize=initialize, handle_data=handle_data)

맨 끝에 data = data 를 추가했을 경우에는 에러 발생.

이것에 대한 이유는 차차 확인해보기로.

 

[출처] Zipline 1.4.1 버전 오류 해결|작성자 PKB

반응형
728x90

import smtplib

from email.mime.text import MIMEText 

 

smtp = smtplib.SMTP('smtp.gmail.com'587)

smtp.ehlo()      # say Hello

smtp.starttls()  # TLS 사용시 필요

smtp.login('나의아이디@gmail.com''비밀번호'

 

msg = MIMEText('본문 테스트 메시지')

msg['Subject'= '테스트'

msg['To'= '보낼아이디@보낼메일주소.com'

smtp.sendmail('나의아이디@gmail.com''보낼아이디@보낼메일주소.com', msg.as_string())

 

smtp.quit()

반응형

+ Recent posts