2011-09-08 4 views
0

방금 ​​첫 번째 서블릿 필터를 작성했으며 이미 문제가 발생했습니다. 내가 원하는 것은 필터가 인증 된 페이지를 요청할 경우 필터가 차단되어 로그인 페이지로 리다이렉트되도록 필터가 인증을 처리하도록하는 것입니다. 로그인이 성공하면 필터는 사용자를 요청 된 원래 페이지로 리디렉션합니다.jsp에서 서블릿 필터로 세션 변수 전달

예를 들어, 해당 페이지 중 하나는 블로그 페이지입니다. 사용자가 "코멘트 남기기"를 클릭하면 이미 로그인하지 않은 경우 필터로 로그인 페이지로 리디렉션됩니다. 여기까지 필터가 작동합니다. 그런 다음 사용자가 로그인하고 사용자 이름/암호가 확인됩니다. 확인을하면 세션 변수가 jsp에 설정되고 페이지가 다시 댓글 페이지로 리디렉션됩니다. 그 요청은 내가 세션 변수를 검사하는 필터를 통과한다. 그러나 무엇을 상관없이 요청에서 얻은 세션은 속성이 설정되지 않은 새로운 세션 인 것 같습니다. 나는 request.getSession (false)를 호출 해봤는데, 항상 null을 반환하는 것 같다. 그래서 내 JSP 페이지가 공유하는 동일한 세션을 돌려주지 마십시오.

나는 톰캣 7.0.2를 사용하고 있습니다. 이것이 바람둥이 특유의 것인지 또는 내가 놓치고있는 아주 명백한 것이 있는지를 나는 모른다.

희망을 부탁드립니다.

Gisli

- 업데이트 -

여기 내 코드입니다. 그것이 도움이 될 것 같아요 :).

기본적으로 로그인 페이지, 블로그 페이지 및 댓글 페이지가 있습니다. 블로그 페이지에서, 나는이 링크가 : 내 필터에서

<a href="?page=blogg/komment.jsp?id=<%=blog.getID()%>"> Leave comment </a> 

을,이 있습니다

public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain chain) throws IOException, ServletException { 
    // TODO Auto-generated method stub 
HttpServletRequest request = (HttpServletRequest) req; 
HttpServletResponse response = (HttpServletResponse)res; 
HttpSession session = request.getSession(false); 

Object userObj = null; 
if(session != null) { 
    userObj = session.getAttribute("username"); 
} 
String contextPath = request.getContextPath(); 
String queryString = request.getQueryString(); 
String url = request.getRequestURI(); 

String page = request.getParameter("page"); 

String user = "<user>"; 
if(userObj != null) 
    user = userObj.toString(); 

if(page == null) 
    page = "<page>"; 

if(userObj == null && page.indexOf("blogg/komment.jsp") != -1) { 
    session.setAttribute("destPage", page); 
    response.sendRedirect("index.jsp?page=blogg/login.jsp"); 
} 

System.out.println(", Time " 
        + new Date().toString() + " " + page + " " + user); 

chain.doFilter(req, res); 
} 

지금까지 너무 좋아. 그러면 로그인 페이지로 리디렉션됩니다.

문자열 "사용자가 존재"
String user = request.getParameter("username"); 
    String pass = request.getParameter("password"); 

    if(blog.confirmUser(user, pass)) { 
     session.setAttribute("username", user); 
     Object destPageObj = session.getAttribute("destPage"); 
     String destPage = "xxx"; 
     if(destPageObj != null) 
      destPage = destPageObj.toString(); 
     response.sendRedirect("index.jsp?page=" + destPage); 

     %> 
     User exists 
<% 
    } 
    else { 
%> 
    User does not exist 
<% 
    } 

을 인쇄 할 생각되지 않습니다 만, 항상 나타나고 난 다시 로그인 페이지를 얻을 : 거기에, 나는이 작업을 수행.

이것은 내가 이해할 수없는 것입니다. 세션 변수 "username"을 설정하여 다음 요청이 필터에 도달 할 때 해당 변수에 값이 포함되어야합니다. 하지만 항상 비어있는 것 같습니다. 사실 필터에서 getSession (false)을 호출하면 항상 null이 반환됩니다. 세션 변수가 expain되지 않은 경우 JSP에 항상 존재한다고 가정합니다.

페이지간에 세션 변수를 전달하려고 시도했지만 완벽하게 작동합니다. 그러나 페이지에서 세션 변수를 설정하고 다음 리디렉션에서 다시 읽는 것은 실패합니다.

나는 얼굴에서 나를 응시하는 것이 끔찍한 무엇인가가있다라고 느낀다. 그리고 나는 그것을보기 위해 단지 이것에서 너무 오랫동안 일했다!

여러분이 도와 드리겠습니다.

- 추가 업데이트 -

댓글을 쓸 수있는 공간이 너무 적습니다. :). 제가하고 싶은 것은 이것입니다. 내 jsp 페이지를 로그인 페이지와 독립적으로 만들고 싶었습니다. 나는. 필터를 중개자로 사용하고 싶었습니다. 따라서 사용자를 내 의견 페이지로 보내면 로그인했는지 여부에 대해 걱정할 필요가 없습니다.그가 로그인하지 않은 경우 필터는 로그인 페이지로 리디렉션 한 다음 원래 목적지로 전송해야합니다. 내 블로그 만이 인증을 요구하는 것은 아니며 같은 논리에서이 논리를 모두 갖고 싶었습니다.

보안상의 이유로 요청 매개 변수로 사용자 이름/암호를 전달하고 싶지 않습니다. 둘 다 세션 속성으로 유지하기를 원합니다.

로그인 페이지에서 내가하고있는 일이 필터에서 수행되어야한다고 말하는 것이 이해가 가지 않습니다. 사용자 이름과 비밀번호를 요청하는 페이지가 필요하며 요청과 함께 보낼 필요가 없습니다. 여기에 예가 있는데 정확히 무엇을하고 싶은지 link입니다. 내가 사용자 이름을 저장 한 동일한 세션에 액세스 할 수없는 것처럼 보이기 때문에 어떤 이유로이 기능이 작동하지 않는 것을 제외하고는.

내가 완전히 잘못 잡았다면, 이것이 제대로 수행 된 웹 페이지를 가르쳐 주시겠습니까? 나는 시간을 인터넷으로 보냈다. 그리고 나는 모두가 나를 위해 일하는 것처럼 보이는 예제를 발견했다.

+1

브라우저가 쿠키를 허용합니까? 필터의 코드와 세션 속성을 설정하는 코드를 보여주십시오. –

+0

답장을 보내 주셔서 감사합니다! 위의 업데이트를 참조하십시오. – user934948

+0

작동 시키셨습니까? 그렇다면 업데이트를 게시 할 수 있습니까? 나는 똑같은 일을하려하고 내가 너 자신과 같은 문제를 겪게 될지 궁금해한다. – Ayyoudy

답변

1

많은 인터넷 검색과 파기 후에이 문제를 해결했습니다.

내가 언급하지 못한 한 가지는, Tomcat이 프록시 뒤에서 실행된다는 것입니다. 그리고 프록시가 세션 쿠키를 제공하지 않았습니다. 내 가상 호스트 정의에서 나는 이것을 가지고 있었다 :

<IfModule proxy_module> 
     ProxyRequests Off 
     ProxyPass/http://b6.is:8080/B6/ 
     ProxyPassReverse/http://b6.is:8080/B6/ 
    </IfModule> 

그래서 모든 것이 루트에서 B6 webapp로 전달된다.

아니라이 줄을 추가했다으로 내가 쿠키 경로를 번역해야했던 모든 :

 ProxyPassReverseCookiePath /B6/

이 지금은 완벽하게 작동합니다.

관련 문제