2013-03-25 2 views
0

브라우저에서 요청하지 않고 새 세션을 만들고 싶습니다. 다른 시스템의 API에서 데이터를 저장하는 목적은 하나뿐입니다. API에서 데이터를 가져 오기 위해 타이머 스케줄러를 생성 한 다음 처리합니다.서블릿 클래스에서 세션 만들기

나는 tomcat 서버를 사용합니다. 나는 아래와 같이 web.xml 파일에 configed :

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
<display-name>TestSession</display-name> 
<servlet> 
    <servlet-name>initSmsSchedule</servlet-name> 
    <servlet-class>test.TestSession</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

내 TestSession.java 클래스 :이 설정에 따라서

public class TestSession extends HttpServlet { 


    public void init(ServletConfig config) throws ServletException { 
    super.init(config); 

    //I want to create a HttpSession in here 

    } 

. tomcat이 시작되면 TestSession의 init() 메소드로 실행됩니다.

init() 메서드에서 여기에 HttpSession을 만들고 싶습니다. 내가 어떻게 할 수 있니?

(대개 브라우저에서 요청할 때 일반적으로 세션을 요청하지만 내 경우에는 응용 프로그램에서 호출되기 때문에 할 수 없습니다) 감사합니다!

+0

'세션'이 (가) 아무 관련이 없습니까? –

+4

나는 당신이 당신이 원하는 것이라고 생각하는지, 왜 당신이 그것을 원한다고 생각하는지 이해하는 데 어려움을 겪고 있습니다. 나는 당신이 응용 범위를 원하는 것처럼 들리는 것 같지 않습니다. –

+0

클라이언트 브라우저에서 요청하지 않고 세션을 만들고 싶습니다. – MartinJoo

답변

0

귀하의 질문에있는 문제는 일반적으로 웹 응용 프로그램 내에서 범위 지정으로 이해되는 대응 성 및 상호 연관성의 문제입니다.

간단히 말해서 응용 프로그램 전체의 빈 또는 서블릿에서 세션에 액세스 할 수 없으며 세션에서 요청 범위의 데이터에 액세스 할 수 없습니다. 반대로, 반대의 경우는 사실입니다. 요청 범위가 지정된 컨텍스트 (물론 그럴듯한 동시성 문제를 명심하십시오)에서 세션 및 세션 데이터의 응용 프로그램 데이터에 액세스 할 수 있습니다.

더 자세히 생각하면 이해할 수 있습니다. Servlet#init에서 세션 데이터에 어떻게 액세스 할 수 있습니까? 하나의 응용 프로그램 전체 컨텍스트 당 많은 세션 범위 개체가 있습니다. 대신 데이터 범위와 일대일로 대응하는 응용 프로그램 범위 bean을 작성할 수 있습니다.

마지막으로, Thihara의 대답에 추가 나는 그것이 사용자 아니라고 말할 것 자체 HTTP 세션을 작성하는 데 필요하지만, 적어도 하나의 별개의 요청은 사용자 인증에 의해 수를, 같은 익명 손님의 행동 웹 응용 프로그램을 통해 크롤링되는 쇼핑 카트 또는 컴퓨터 봇 만들기 그 점에서, 다른 곳에서 언급 한 바와 같이, 세션은 요청을 시작한 주제 (세션에 대한 일부 조작이 있음)와 연관됩니다.

문제를 해결할 수있는 방법을 계속 진행하려면 웹 응용 프로그램의 데이터 범위를주의 깊게 재고해야합니다. 너무 최근의 것들을 포함하여 SO에 대한 많은 우수한 답변이 있습니다. 문제를 해결하기 위해 내가 찾아 볼게 있습니다. 내가 웹 응용 프로그램에서 사용할 수있는 다양한 범위의 생각

0

정의에 의한 세션은 사용자의 데이터가 저장되는 곳입니다.

요청할 사용자가없는 경우 요청할 세션을 만들 수 없습니다.

다른 API에서 데이터를 가져 와서 처리하고 싶다면 왜 세션에서 해당 데이터를 유지해야합니까?

API의 데이터가 사용자 단위 인 경우 사용자 세션에 저장할 수 있습니다. 전체 애플리케이션의 경우 해당 데이터를 애플리케이션 수준에서 저장하고 필요에 따라 새로 고칠 수 있습니다.

데이터를 처리하기 전에 메모리에 저장해야하는 경우입니다 (검색 후 언젠가). 그렇지 않으면 왜 그냥 스케줄러에서 처리하지?

당신의 해결책은 나에게 약간 잘못된 것 같지만, 나는 분명히 뭔가 빠져있을 수 있습니다.

0

는 물건을 저장하기 위해 다른 상자입니다.

그것은 더이 있지만 당신은 세션 범위의 다른 API의 데이터를 저장할 없다는 것을 나에게 소리 세션. 세션에 저장하는 것이 좋을 것 같지 않습니다. 동일한 세션에서만 액세스 할 수 있으며 세션이 만료되면 (곧 Tomcat을 시작한 후에) 데이터에 전혀 액세스 할 수있는 방법이 없습니다. . 그게 무슨 말이야?

저장 위치가 응용 프로그램 범위에 있으면 다른 (실제) 세션에서 데이터에 액세스 할 수 있습니다.

getServletContext().setAttribute("key", object); 
Object object = getServletContext().getAttribute("key"); 

가 그냥 세션 범위처럼, 그것은 여전히지도의 지원을받습니다 : 서블릿에서

는 응용 프로그램 (서블릿) 범위를 통해 액세스 할 수 있습니다.