我刚刚写了我的第一个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