一尘不染

我是否正确执行了Servlet过滤器?

jsp

美好的一天!

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

我有几个页面,所以我决定在xml和filter 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. 我该如何做得更好?

阅读 200

收藏
2020-06-10

共1个答案

一尘不染

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

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

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

在过滤器中,您应该检查一下

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

if (user == null) {
    // Not logged in.
} else {
    // Logged in.
}
2020-06-10