2011-09-08 141 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/

现在,它完美的作品。