我剛剛寫了我的第一個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這正是我想要做的。除此之外,由於某些原因,我無法訪問存儲用戶名的同一個會話。
如果我完全搞錯了,你能指點我一個正確完成這個工作的網頁嗎?我花了數小時搜索,我發現的所有例子似乎都適用於除我之外的所有人:)。
瀏覽器是否接受Cookie?向我們展示過濾器的代碼和設置會話屬性的代碼。 –
感謝您的回覆!見上面的更新。 – user934948
你有這個工作嗎?如果可以,請發佈更新?我正在嘗試做同樣的事情,並想知道我是否會遇到同樣的問題。 – Ayyoudy