선견자 지위를 삭제하여 명확하게 재현합니다. 자세한 내용은 간단하게 코드를 단순화했습니다.Java Servlet - 서블릿이 보안화될 때 다른 JSESSION ID. 왜?
내 문제를 제시합니다.
내 서블릿하여 HelloWorld : 메시지 HellWorld와
public class HelloWorld extends HttpServlet {
private String message;
public void init() throws ServletException {
// Do required initialization
message = "Hello World";
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set response content type
response.setContentType("text/html");
// session test
System.out.println(request.getSession().getId());
PrintWriter out = response.getWriter();
out.println("<html><head><script src='./dwr/engine.js'></script><script src='./dwr/util.js'></script></head><body><h1>Hello World</h1></body></html>");
}
public void destroy() {
// do nothing.
}
}
서블릿 디스플레이 HTML 페이지와는 DWR (직접 웹 원격) 자바 스크립트 파일이 포함됩니다. DWR javascript 파일은 servlet/dwr /에서 검색됩니다.
의 Web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>TestDWR2</display-name>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>test.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>WEB-INF/dwr.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>Extranet resource</web-resource-name>
<description>Extranet resources</description>
<url-pattern>/HelloWorld/*</url-pattern>
<url-pattern>/dwr/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>intranet_admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Extranet</realm-name>
</login-config>
<security-role>
<description>Intranet Admin</description>
<role-name>intranet_admin</role-name>
</security-role>
</web-app>
서블릿 /하여 HelloWorld 및/DWR이 securised된다.
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<user username="tomcat" password="tomcat" roles="intranet_admin"/>
</tomcat-users>
HTTP 요청/응답 : 로그인은 바람둥이 사용자 데이터베이스를 기반으로하여 HelloWorld 서블릿 호출에 대한
DWR 서블릿 호출에 대한
(engine.js)
,210 DWR 서블릿 호출에 대한
(util.js) 당신이 할 수 DWR 서블릿 호출 (_System.pageLoaded.dwr)
를 들어
각 요청마다 JSESSIONID 변경 참조하십시오. 내 문제는 언젠가 해결할 수 없다 ...
나는 지난 며칠 동안 계속 진행 중이다. 나는 문제 만 서블릿이 보안 때 나타납니다 지금 알고
<web-resource-collection>
<web-resource-name>Extranet resource</web-resource-name>
<description>Extranet resources</description>
<url-pattern>/HelloWorld/*</url-pattern>
<url-pattern>/dwr/*</url-pattern>
</web-resource-collection>
제거이 보안의 경우, 각 요청이 동일한 JSESSIONID를 반환합니다. 왜? DWR과 관련이 없습니다. 서블릿을 호출하여 jQuery와 같은 다른 JS를 반환 할 때도 같은 문제가 발생합니다.
도와 주시겠습니까?
당신은이 링크를 찾을 수 있습니다, 코드 소스 :
당신은이 링크를 찾을 수 있습니다
는 전쟁 문제를 발견 바람둥이 (톰캣 7)에 배포하기 https://www.wetransfer.com/downloads/fd8a74c850a5beb32d6529576f15f42c20141105104405/6f89adba0c853d48e392edb1d3ca562620141105104405/f67f43
대단히 감사합니다.
주셔서 감사합니다 ... 검색해야합니다. 일반적으로 인증을 할 때마다 새 세션 ID를 생성하여 다른 사람이 이전 (보안되지 않은) 세션 ID를 가지고 갑자기 로그인하지 않도록합니다. 기본 인증은 모든 요청에 로그인하므로 세션 ID를 변경하는 것 같습니다. 어쩌면 세션이 여전히 유효하다면 BA를 건너 뛰는 어딘가에 세션 핸들러가없는 것일 수 있습니다.하지만 detault에는 확신이 없습니다. 어떤 바람둥이이며 밸브 및 필터에 대한 모든 글로벌 채널이 있습니까? 어떤 왕국을 사용합니까? – eckes
Context.xml에서 changeSessionIdOnAuthentication = "false"로 설정하면 작동하지만 가능하면이 안전성을 유지하려고합니다. 안전을 지키기위한 또 다른 해결책이 있습니까? 서블릿 필터? 세션 처리기? 나는 바람둥이 7을 사용한다. 나는 org.apache.catalina.realm.UserDatabaseRealm 영역을 사용한다. 도움을 주셔서 감사합니다. –
세션이 존재하거나 유효하면 (다시) 인증을 건너 뛰도록 tomcat을 구성하는 방법이 있어야한다고 생각합니다. 그러나 어떻게 생각하는지 모르겠다. – eckes