我使用JSF,Hibernate,Spring创建了一个Web应用程序。我添加了一个用于检查会话的过滤器。我的过滤器代码是:
public class AdminFilter implements Filter{
private ArrayList<String> urlList;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String urls = filterConfig.getInitParameter("avoid-urls");
StringTokenizer token = new StringTokenizer(urls, ",");
urlList = new ArrayList<String>();
while (token.hasMoreTokens()) {
urlList.add(token.nextToken());
}
}
// Checking if user is logged in
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req= (HttpServletRequest) request;
HttpServletResponse resp= (HttpServletResponse) response;
String url = req.getServletPath();
HttpSession session = req.getSession();
if(!urlList.contains(url) && session.getAttribute("user")==null)
{
resp.sendRedirect(req.getContextPath() + "/backend/login/index.xhtml");
}
chain.doFilter(req, resp);
}
@Override
public void destroy() {
// throw new UnsupportedOperationException("Not supported yet.");
}
}
在过滤器的init方法中,我有一些避免URL应该跳过会话检查,比如登录页面本身。这是正确的,但这个过滤器限制我的CSS,图像和JS加载在登录页面上。 建议我过滤器中的问题是什么?
答案 0 :(得分:3)
您的登录页面需要一些资源(CSS,JS,图像),这些资源是由浏览器在单独的请求中请求的,这些资源将被Filter截获,因为您没有任何跳过此类资源请求的参数(用于登录时)它将阻止此请求
建议:
你可以使用Spring-Security,而不是花时间写你的,它通过配置获得了很大的灵活性
答案 1 :(得分:3)
根据您当前的配置,目前您的过滤器忽略了URL是否用于获取CSS,图像或任何其他资源。
boolean staticResources = (url.contains("css") || url.contains("images"));
if(!urlList.contains(url) && session.getAttribute("user")==null && !staticResources) {
resp.sendRedirect(req.getContextPath() + "/backend/login/index.xhtml");
}
这将避免会话检查静态内容。
更好的方法是使用声明安全性作为Java EE Web Security使用领域的一部分。