728x90

    <error-page>
        <error-code>400</error-code>
        <location>/error-40X.jsp</location>
    </error-page>
    <error-page>
        <error-code>401</error-code>
        <location>/error-40X.jsp</location>
    </error-page>
    <error-page>
        <error-code>403</error-code>
        <location>/error-40X.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/error-40X.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error-50X.jsp</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>

반응형
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

출처 : http://kogun82.tistory.com/88


probe  설치


1. psi-probe를 다음의 홈 페이지에서 다운 받는다.(http://code.google.com/p/psi-probe/)


2. 다운 받은 압축 파일을 해제하고 나면 probe.war 파일을 확인 할 수 있다.


3. Tomcat manager에 접속하여 probe.war 파일을 선택하여 업로드하고, deploy를 실행한다.


4. deploy가 완료되면 http://loclahost:8080/probe/ 에 접속하여 확인 할 수 있다. 접속 시 필요한 계정 정보는 Tomcat manager에 계정과 동일하다.





반응형
728x90

출처 : http://stevenjsmin.tistory.com/103


문제점

Linux(혹은 Unix)에서는 1024번 이하의 포트가 보안상의 이유로 root권한을 가지고 있는 로세스만이 포트를 선점할 수 있다.(root reserved ports) root계정이 아닌 일반계정으로 Tomcat을 서비스 할 때정상적으로 Tomcat의 리스너(Listener)가 동작하지 않음을 TOMCAT LOG(logs/catalina.out)를 
통하여 확인 할 수 있다

 

2009. 12. 15 오후 4:14:31 org.apache.coyote.http11.Http11Protocol init
심각: Error initializing endpoint
java.net.BindException: Permission denied<null>:80

 

따라서 일반계정으로 Tomcat 80번 포트(HTTP 기본포트)에서 서비스 하려 한다면, Tomcat HTTP Connector Port 1024이상의 포트번호로 지정해준 뒤80포트로의 모든 인바운딩을 Tomcat HTTP Connector Port로 리다이렉트 해주어야한다아래는 iptables 명령을 이용한 간단한 예제이다.(반드시 root권한으로 수행되어야 한다.)

 

우선 8080포트가 리슨을 하고있는지 확인한다.

# netstat -ntl

The output will look something like

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN
tcp        0      0 :::8009                     :::*                        LISTEN
tcp        0      0 :::8080                     :::*                        LISTEN
tcp        0      0 :::22                       :::* 

예제

TOMCAT 서버가 구동되는 호스트의 IP : 211.110.33.86 또는 localhost
TOMCAT 서버의 HTTP Connector Port : 8080

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8080 

위의 예제는 현재 서버(211.110.33.86) 8080포트에 대한 모든 인바운딩을 80 포트로 리다이렉트(REDIRECT)하는 명령이다.


또는 다음과 같이 명령을 입력한다.

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 

Run the folloing command to verify that redirect is working fine

# iptables -t nat -L

The output will look something like

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere            tcp dpt:http redir ports 8080

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

 Run the following command to remove the routing

# iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 Remember, when you are modifying your running configuration of iptables, you will still need to save your changes in order for it to persist on reboot. Be sure to test your configuration before saving it with "service iptables save" so that you don't lock yourself out

 

생각해보아야할 문제

root권한으로 TOMCAT과 같은 WAS를 구동하였을때 발생 할 수 있는 문제점은?
WEB SERVER없이 TOMCAT과 같은 WAS만으로 서비스하였을때 발생 할 수 있는 문제점은?
SSL(https)의 경우 443번 포트를 해당 프로토콜의 기본 포트로 사용하는데, SSL도 이와같은 처리를 해주어야할까?

반응형

'WEB & WAS > tomcat' 카테고리의 다른 글

Tomcat 오류 페이지 설정하기 web.xml  (0) 2023.12.11
톰캣 오류처리하기 400  (0) 2021.02.26
Tomcat 상태 모니터링 probe 설치 하기  (0) 2016.08.17

+ Recent posts