美好的一天!
我试图在不成功登录的页面上禁用访问权限。我将登录用户名存储在会话中,以便可以确定会话是否为空。
我有几个页面,所以我决定在xml和filter servlet中创建一个过滤器,因此不需要将if(session == null)代码放在所有页面上。
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>
问题是…
我仍然可以访问其他servlet,而无需进入登录屏幕。我的代码有什么问题。 我该如何做得更好?
您仅在检查是否已创建会话,而不在检查用户是否已登录。这是错误的。会话 可以 在用户登录之前 就 已经创建。
登录用户时,应将其设置为会话属性
request.getSession().setAttribute("user", user);
在过滤器中,您应该检查一下
User user = (User) request.getSession().getAttribute("user"); if (user == null) { // Not logged in. } else { // Logged in. }