我正在做Servlet过滤器吗?

时间:2011-06-01 14:26:20

标签: jsp servlets servlet-filters

美好的一天!

我正在尝试禁用不属于成功登录页面的访问权限。我将登录用户名存储在会话中,以便我可以确定会话是否为空。

我有几个页面所以我决定在xml中创建一个过滤器并过滤servlet,所以我不需要在所有页面上放置if(session == null)代码。

我在servlet中的代码如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here
            HttpServletRequest req = (HttpServletRequest)request;
            HttpServletResponse res = (HttpServletResponse)response;

            HttpSession session = req.getSession(false);
            RequestDispatcher rd;

            //need to get the servlet path
            String url = req.getServletPath();
            if( url.equals("/LoginServlet") || url.equals("/LogoutServlet") || url.equals("/login.html") ){
                chain.doFilter(request, response);
            } else {
                if(session == null){
                    rd = req.getRequestDispatcher("index.html");
                    rd.forward(req, res);
                } else {
                    chain.doFilter(request,response);
                }
            }
    }

和我的xml过滤器如下:

<filter>
    <display-name>sessionFilter</display-name>
    <filter-name>sessionFilter</filter-name>
    <filter-class>com.test.demoSession.filter.sessionFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</filter>

问题是......

  
      
  1. 我仍然可以访问其他servlet而无需进入登录屏幕。   我的代码有什么问题。
  2.   
  3. 我怎样才能做得更好?
  4.   

1 个答案:

答案 0 :(得分:1)

您只检查是否已创建会话,而不是用户是否已登录。这是错误的。会话可以在用户登录之前很久就已创建。

登录用户时,应将其设置为会话属性

request.getSession().setAttribute("user", user);

在过滤器中,您应该检查

User user = (User) request.getSession().getAttribute("user");

if (user == null) {
    // Not logged in.
} else {
    // Logged in.
}

另见: