美好的一天!
我正在尝试禁用不属于成功登录页面的访问权限。我将登录用户名存储在会话中,以便我可以确定会话是否为空。
我有几个页面所以我决定在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>
问题是......
- 我仍然可以访问其他servlet而无需进入登录屏幕。 我的代码有什么问题。
- 我怎样才能做得更好?
醇>
答案 0 :(得分:1)
您只检查是否已创建会话,而不是用户是否已登录。这是错误的。会话可以在用户登录之前很久就已创建。
登录用户时,应将其设置为会话属性
request.getSession().setAttribute("user", user);
在过滤器中,您应该检查
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
// Not logged in.
} else {
// Logged in.
}