我试图制作一个过滤器来阻止未登录的用户访问某些页面。为此,我使用以下doFilter
方法创建了一个过滤器类
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String url = request.getRequestURI();
boolean allowedRequest = false;
System.out.println(url);
if(urlList.contains(url)) {
allowedRequest = true;
System.out.println("in list");
}
if (!allowedRequest) {
Object o = request.getSession().getAttribute("UserInfo");
if (null == o) {
System.out.println("Hey i am in");
response.sendRedirect("/login.jsp");
}
}
chain.doFilter(req, res);
} // end of doFilter
为了允许不需要用户登录的页面我在init()中创建了一个arraylist url-list
现在发生了一件非常奇怪的蠢事。假设我有两页home.jsp和dcr.jsp。当我尝试访问home.jsp而没有登录时,我成功地重定向到login.jsp,但是当我试图访问dcr.jsp时它没有被重定向,尽管它进入循环if(null == o)我能理解因为我在控制台中打印该行.THis是我在服务器中获得的输出 这是我在服务器中获得的输出
/dcrmaintenance.jsp
Hey i am in
这告诉我null == o是真的。
页面dcr.jsp访问会话对象,由于用户未登录,因此按预期获取java.lang.NullPointerException但我无法理解为什么即使进入循环后重定向也没有发生。如果有人可以如果我犯了错误,我将不胜感激。
答案 0 :(得分:9)
response.sendRedirect("/login.jsp");
后return;
。
答案 1 :(得分:3)
我相信你应该调用sendRedirect或doFilter。 E.g。
if (requiresLogin)
response.sendRedirect("/login.jsp");
else
chain.doFilter(req,resp);
答案 2 :(得分:0)
chain.doFilter(req, res);
您的应用程序中还运行了哪些其他过滤器?您发送重定向,但继续使用过滤器链。我猜另一个过滤器正在再次修改响应。如果您使用过滤器,只需在重定向后返回。
您可以在Java WebApp中定义安全约束,而不是过滤器。查看安全约束。
简短的例子:
<security-constraint>
<web-resource-collection>
<web-resource-name>Restricted Area</web-resource-name>
<url-pattern>*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>Authorized</role-name>
</auth-constraint>
</security-constraint>
答案 3 :(得分:0)
我认为你必须改变你的web.xml ...... 您必须将受限资源放入适当的文件夹。这样,Filter Servlet将限制分配在&#34; restricted&#34;中的文件。文件夹。(http://www.developer.com/security/article.php/3467801/Securing-J2EE-Applications-with-a-Servlet-Filter.htm)(我认为使用Filter Servlet的原因是编写自己的授权系统。 - 这样你就不必在web.xml中定义安全约束,你必须在Data中定义它基地;))))
<!--Servlet Filter that handles site authorization.-->
<filter>
<filter-name>AuthorizationFilter</filter-name>
<filter-class>examples.AuthorizationFilter</filter-class>
<description>This Filter authorizes user access to application
components based upon request URI.</description>
<init-param>
<param-name>error_page</param-name>
<param-value>../../login.html</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AuthorizationFilter</filter-name>
<url-pattern>/restricted/*</url-pattern>
</filter-mapping>