我正在尝试创建一个过滤器,确保用户在转到任何其他页面之前已登录
这里我有2个问题(我知道)。
1)我遇到只允许jsp文件的问题。当我尝试访问我的页面时,tomcat会抛出错误
java.lang.IllegalArgumentException: Invalid <url-pattern> /public/*.jsp in filter mapping
但是当我的网址映射是/ public / *时,它按预期工作
编辑1:原来我使用了错误的映射,感谢下面的一些评论,对于来到此页面的任何人来说,这是解决方案的一部分:http://www.roguewave.com/portals/0/products/hydraexpress/docs/3.5.0/html/rwsfservletug/4-3.html
2)当我确实获得了/public/*
的重定向时,我能够进入我的登录页面,但所有样式都缺失了
这是我在web.xml中的过滤器
EDIT2:下面的代码段现在反映了我对答案所做的更改
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>authentication.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
这就是我在过滤器中尝试的内容
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);
// Get the requested address
String from = URLEncoder.encode(req.getRequestURI(), "UTF-8");
if(req.getQueryString() != null){
from += "?" + req.getQueryString();
}
System.err.println("from str: " + from);
System.out.println("Serv path: " + req.getServletPath());
if(!req.getServletPath().startsWith("/public/login")){
if(session == null || session.getAttribute("username") == null){
res.sendRedirect(req.getContextPath() + "/public/login.jsp?from="+from);
}else{
System.out.println("Username: " + session.getAttribute("username"));
// pass the request along the filter chain
chain.doFilter(request, response);
}
}else{
chain.doFilter(request, response);
}
}
有关改进我的过滤器的任何建议吗?
答案 0 :(得分:1)
网址格式不是真正的全局匹配,只支持两种类型的通配符:/someting/*
和*.something
http://www.roguewave.com/portals/0/products/hydraexpress/docs/3.5.0/html/rwsfservletug/4-3.html
在样式方面,您必须允许加载登录页面使用的资源(CSS,Javascript,图像等)而不使用会话,就像您允许访问登录页面本身一样。