2011-09-08 140 views
0

我剛剛寫了我的第一個servlet過濾器,並且已經有問題了。我想要做的是做過濾器句柄驗證,以便如果請求受保護的頁面,過濾器將切入並重定向到登錄頁面。如果登錄成功,過濾器會將用戶重定向到請求的原始頁面。將會話變量從jsp傳遞給servlet過濾器

舉個例子,有問題的頁面之一是博客頁面。當用戶點擊「發表評論」時,如果他還沒有登錄,他將被過濾器重定向到登錄頁面。直到這裏,過濾器才能工作。然後用戶登錄並檢查用戶名/密碼。如果他們沒問題,會話變量會在jsp中設置,並且頁面會重新定向到評論頁面。該請求通過篩選器檢查會話變量。但無論如何,我從請求中獲得的會話似乎是沒有設置屬性的新會話。我試過調用request.getSession(false),並且似乎總是返回null。所以不要給我同一個會話,以便我的jsp頁面共享。

我正在使用tomcat 7.0.2。我不知道這是否是tomcat特有的,或者是我錯過了一些非常明顯的事情。

希望你cna幫助我。

吉斯利

- 更新 -

這裏是我的代碼。猜猜這會很有幫助:)。

基本上,我有一個登錄頁面,一個博客頁面和一個評論頁面。在博客頁面上,我有此鏈接:

<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)時,我總是得到空值。即使會話變量在JSP中始終存在,如果它沒有結束。

我已經嘗試在頁面之間傳遞會話變量,並且完美地工作。但是,在頁面中設置會話變量並在下一次重定向時讀取它總是失敗。

我覺得有一些非常明顯的東西讓我盯着臉,而我只是在這上面工作太久纔看到它!

希望你們能幫忙!

- 進一步更新 -

太小空間寫作評論:)。我想要做的是這個。我想讓我的jsp頁面獨立於登錄頁面。即我希望過濾器充當中介。因此,當我將用戶發送到我的評論頁面時,我不必擔心他是否已登錄。如果他沒有登錄,過濾器應將他重定向到登錄頁面,然後將其發送到原始目的地。我的博客不是唯一需要身份驗證的東西,我希望將這個邏輯放在同一個位置。

出於安全原因,我不想傳遞用戶名/密碼作爲請求參數。我希望兩者都保持爲會話屬性。

我不明白你說什麼,我在登錄頁面做的事情應該在過濾器中完成。我需要一個頁面來詢問用戶的用戶名和密碼,我不想將這些請求發送出去。我在這裏看到一個例子,link這正是我想要做的。除此之外,由於某些原因,我無法訪問存儲用戶名的同一個會話。

如果我完全搞錯了,你能指點我一個正確完成這個工作的網頁嗎?我花了數小時搜索,我發現的所有例子似乎都適用於除我之外的所有人:)。

+1

瀏覽器是否接受Cookie?向我們展示過濾器的代碼和設置會話屬性的代碼。 –

+0

感謝您的回覆!見上面的更新。 – user934948

+0

你有這個工作嗎?如果可以,請發佈更新?我正在嘗試做同樣的事情,並想知道我是否會遇到同樣的問題。 – Ayyoudy

回答

1

我在大量的谷歌搜索和挖掘後解決了這個問題。

我沒有提到的一件事是,我讓Tomcat運行在代理之後。而代理沒有提供會話cookie。在我的虛擬主機定義中,我有這個:

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

所以,一切都從根傳遞到B6 webapp。

我不得不這樣做翻譯的Cookie路徑,以及是要加入這一行:

 ProxyPassReverseCookiePath /B6/

現在,它完美的作品。