spring 이나 struts 같은 프레임웍은 jsp 의 처리를 컨트롤러에 위임하게 된다.

그래서 *.do 같은 형태의 url 로 접근 하도록 만들어 놓은건데.

좀 똑똑한 사용자가 jsp 파일의 경로를 알아서 컨트롤러를 거치지 않고

바로 jsp 에 접근하는게 가능하다.

이것을 막기위해 web.xml 에다가 아래 코드를 추가하면 된다.

[code]<security-constraint>
  <display-name>JSP Protection</display-name>
  <web-resource-collection>
   <web-resource-name>SecureJSPPages</web-resource-name>
   <url-pattern>*.jsp</url-pattern>
  </web-resource-collection>
  <auth-constraint>
   <role-name>nobody</role-name>
  </auth-constraint>
 </security-constraint>
 
 <security-role>
  <description>
  Nobody should be in this role so JSP files are protected
  from direct access.
  </description>
  <role-name>nobody</role-name>
 </security-role>[/code]

' > Jsp' 카테고리의 다른 글

JSP 페이지를 열때마다 자동으로 캐시 지우기  (42) 2007.03.18
TOMCAT5.5 + MYSQL5.0 + JNDI 설정하기  (44) 2006.12.16
스트러츠 2.0  (92) 2006.12.16
by cranix 2007. 12. 12. 10:56

AJAX 로 채팅방을 만드는데 어떤 컴퓨터는 되고 또 어디서는 안되고..

이런 현상이 있었다.

찾아보니 브라우저에 "페이지를 열때마다" 가 체크가 되어있으면 되고 안되어있으면 안되었다.

아마도 브라우저가 캐시하는 데이터때문에 그랬던거 같다.

그래서 jsp 페이지에서 자체적으로 열때마다 캐시를 지우는 헤더를 삽입해주었다.

아래는 그 소스다.


<jsp>

<%
 response.setHeader("Cache-Control","no-cache");
 response.setHeader("Pragma","no-cache");
 response.setDateHeader("Expires",0);
%>


<php>

<? php
header ("Cache-Control: no-cache, must-revalidate");
header ("Pragma: no-cache");  

header ("Expires: 0");
?>




' > Jsp' 카테고리의 다른 글

jsp 직접실행 막기  (53) 2007.12.12
TOMCAT5.5 + MYSQL5.0 + JNDI 설정하기  (44) 2006.12.16
스트러츠 2.0  (92) 2006.12.16
by cranix 2007. 3. 18. 01:20

톰켓 4.x 버젼까지는 됬는데 5.x 버젼으로 가면서 셋팅법이 약간 바꼇다.;

이거때문에 좀 애먹었다..ㅡ.ㅡ;


1. MYSQL 드라이버를 받아서 설치하기;

  - 이거 잘못넣어놓으니까 자꾸 클래스를 못찾는 에러를 발생한다.  톰켓루트의 shared/lib 이나 애플리케이션루트의 WEB-INF/lib 디렉토리에 넣으면 컴파일은 되나 실행하면 클래스를 못찾는다는것을 명심하자.

  - 가장 귀찮지만 좋은방법은 환경변수에 클래스패스를 걸어서 따로 모아두는거다.(귀찮다.)

  - 두번째 방법은 톰켓루트 common/lib 에 넣어놓는거다. 이거는 클래스패스 안걸어도 톰켓이 알아서 찾아간다. (난 이걸로 쓰겠다.)

  - 마지막으로 가장 무식한방법인 jre/lib/ext 에 넣는 방법이다. (이건 대략 비추)


2. server.xml 설정하기;

  - 이게 문제다. 5.x 버젼으로 오면서 약간 바꼇다. 확인해보자.

  - 아래것을 <Context> 태그 사이에 넣어주면 된다.


  - 먼저 기존것은 다음과 같다.


  <Resource auth="Container" name="jdbc/mysql" type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/mysql">
  <parameter>
    <name>factory</name>
    <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
  </parameter>
  <parameter>
    <name>url</name>
    <value>jdbc:mysql://localhost:3306/cranix</value>
  </parameter>
  <parameter>
    <name>driverClassName</name>
    <value>com.mysql.jdbc.Driver</value>
  </parameter>  
  <parameter>
    <name>maxIdle</name>
    <value>10</value>
  </parameter>
  <parameter>
    <name>maxActive</name>
    <value>20</value>
  </parameter>
  <parameter>
    <name>maxWait</name>
    <value>-1</value>
  </parameter>
  <parameter>
    <name>minEvictableIdleTimeMillis</name>
    <value>600000</value>
  </parameter>
  <parameter>
    <name>username</name>
    <value>ID</value>
  </parameter>
   <parameter>
    <name>password</name>
    <value>PASS</value>
  </parameter>
  </ResourceParams>


  - 이것이 아래와같이 변경됬다.


  <Resource
   name="jdbc/mysql"
   auth="Container"
   type="javax.sql.DataSource"
   username="[ID]"
   password="[PASS]"
   driverClassName="com.mysql.jdbc.Driver"
   url="jdbc:mysql://localhost:3306/cranix"
  />


  - 짧아져서 좋긴한데.. 몇시간동안 헤멨다 (역시 네이버형님은 모르는게 없다.!)


3. web.xml 설정하기

  -  이건 변함없다.


<resource-ref>
<description>Use for valuation systems DataSource</description>
<res-ref-name>jdbc/mysql</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>



4. 커넥션 확인하기!

  - JNDI 를 써서 커넥션을 확인해보자.

  - 먼저 아래와같이 JNDI 를 컨트롤하는 클래스를 하나만들자.


  - JndiConnectionManager.java


package cranix.common.util;
import java.sql.*;
import javax.naming.*;
import javax.sql.DataSource;
import java.util.Hashtable;


public class JndiConnectionManager {
private static JndiConnectionManager jcm = null;

private Hashtable<String, DataSource> table = null;
private Context initContext = null;

private JndiConnectionManager() throws Exception {
table = new Hashtable<String, DataSource>();
initContext = (Context)new InitialContext().lookup("java:comp/env/");
}
private DataSource getDataSource(String name) throws Exception {
DataSource ds = table.get(name);
if (ds == null) {
  ds = (DataSource)initContext.lookup(name);
  table.put(name, ds);
}
return ds;
}
public static JndiConnectionManager getInstance() throws Exception {
if (jcm == null)
  jcm = new JndiConnectionManager();

return jcm;
}

public Connection openConnection(String name) throws Exception {
DataSource ds = getDataSource(name);
Connection conn = ds.getConnection();  
return conn;
}
public void closeConnection(Connection conn) throws Exception {
conn.close();
}
}



  - 다음 위 클래스를 쓰는 jndiTest.jsp 파일을 만든다.


<%@page import="java.sql.Connection,cranix.common.util.JndiConnectionManager" %>
<%
  JndiConnectionManager jcm = JndiConnectionManager.getInstance();
  Connection conn = jcm.openConnection("jdbc/mysql");
  jcm.closeConnection(conn);
%>
success!


  - 이제 실행해보자!

  - 예외가 발생하지 않는다면 성공!

' > Jsp' 카테고리의 다른 글

jsp 직접실행 막기  (53) 2007.12.12
JSP 페이지를 열때마다 자동으로 캐시 지우기  (42) 2007.03.18
스트러츠 2.0  (92) 2006.12.16
by cranix 2006. 12. 16. 20:15

스트러츠 1.X 버젼들을 써봤기때문에 금방 접근할수 있겠지..


라고 생각했었는데 오산이었다..ㅡ.ㅡ;;


2.0 은 모든게 바꼈다.


이 문서에서는 tomcat 5.5, jdk1.5 를 쓰겠다.







먼저 struts2 를 다운받아보자.


http://people.apache.org/builds/struts/2.0.1/struts-2.0.1-all.zip


압축을 풀면 아래와같은 디렉토리가 나온다.


apps/

: 스트러츠로 작성되어있는 샘플 프로그램이 들어있다.

struts2-blank-XXX.war 파일은 스트러츠 기본 디렉토리 구조이다.

(참고로 war 파일은 알집으로 풀린다.)


docs/

: API 문서가 들어있다.


j4/

: 기본 jar 파일이 들어있다. (왜 있는지는 잘 모르겠다..ㅡ.ㅡ;)


lib/

: 스트러츠에서 제공되는 모든 jar 파일이 들어있다.

struts2-all-2.0.1.jar 이 파일도 같이 있는데 이것은 파일명에서 볼수있듯이

다른 파일들을 묶어 놓은것이다.

이상하게 이걸 라이브러리로 쓰니까 실행이 안된서 저걸 빼고 다른걸 라이브러리로 썻다.


src/

: 소스가 들었다.




이제 톰켓에 스트러츠2를 써서 hello Struts2 를 찍어보겠다..;;



1. 톰켓에 새로운 애플리케이션을 추가한다.


2. 추가된 애플리케이션의 WEB-INF/lib 에다가 struts2 의 lib/ 디렉토리에 있는것을 복사한다.

  (단 struts2-all-2.0.1.jar 파일은 중복되므로 복사하지 않는다.)


3. WEB-INF/classes 디렉토리에 struts.properties 파일을 만들고 아래와같이 저장한다.


struts.action.extension=action

struts.configuration.files=struts-default.xml,struts.xml


- URL EXTENSION 을 여기서 설정한다. (안쓰면 기본으로 action 이 된다.)


4. WEB-INF/classes 디렉토리에 struts.xml 파일을 만들어서 아래와같이 저장한다.

[code]<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
  <package name="default" extends="struts-default">
       <action name="hello">
           <result>pages/helloStruts2.jsp</result>
       </action>
  </package>
</struts>[/code]


5. WEB-INF 디렉토리에 web.xml 파일에다가 아래 두가지 구문을 추가한다.

[code]<filter>
<filter-name>webwork</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<security-constraint>
<web-resource-collection>
  <web-resource-name>PreventViewingJSPs</web-resource-name>
<description>웹으로 접속한 사용자가 JSP파일로 직접 접근할 수 없도록 한다.</description>
  <url-pattern>*.jsp</url-pattern>
  <http-method>GET</http-method>
  <http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
  <role-name></role-name>
</auth-constraint>
</security-constraint>[/code]

- 이전버젼에서는 servlet 으로 했는데 filter 로 바꼈다.

  또한 이전 버젼에서는 여기서 config 파일 지정을 해줬었는데 없어졌다.

  아마 어딘가에 있을꺼 같은데 찾지를 못하겠다.

- 또 여기서 중요한것은 web.xml 에서 태그는 순서를 가린다는 것이다.

   예를들어 welcome-file-list 가 filter 보다 위에있으면 안되는데 위에 있게되면

  제대로 안되는경우가 있으니 dtd 파일을 잘 확인해서 설정할수 있도록 하자.


6. 어플리케이션 루트에 pages 라는 디렉토리를 만들고 위에서 정의한 helloStruts2.jsp 파일을 만들어서 "hello Struts2" 라고 쓰고 저장한다.


7. 이제 톰켓을 실행하고 http://[URL]/[애플리케이션명]/hello.action 이라고 쳐서 제대로 나오나 확인해보자.





http://struts.apache.org/2.x/ 예제들이 있으니 확인해 보길 바란다.


단.. 영어라는거..ㅡ.ㅡ;


' > Jsp' 카테고리의 다른 글

jsp 직접실행 막기  (53) 2007.12.12
JSP 페이지를 열때마다 자동으로 캐시 지우기  (42) 2007.03.18
TOMCAT5.5 + MYSQL5.0 + JNDI 설정하기  (44) 2006.12.16
by cranix 2006. 12. 16. 20:09
| 1 |