我有个过滤器是防止用户直接输入项目下的路径进入页面。通俗点就是除了让用户从登录页面进入系统,其他都不能进入系统。在我的登录页面中有个验证码,当login.jsp页面加载的时候会访问一个sevlet,然后这个servlet会画一个验证码发回到login.jsp页面上。问题是:当我写了个下面的过滤器后,验证码的地方就变成一个小红叉,页面的背景图片也没了,过滤器不写的话都有。这是为什么啊?login.jsp:<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>登陆页面</title>
    
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> <script type="text/javascript">
function volidate(){
var form = document.myForm;
if(form.userName.value == ""){
alert("请输入用户名");
form.userName.focus();
return false;
}
if(form.userPwd.value == ""){
alert("请输入密码");
form.userPwd.focus();
return false;
}
if(form.volidateNum.value == ""){
alert("请输入验证码");
form.volidateNum.focus();
return false;
}
}

</script>  </head>
  
  <body backGround="images/home_background.gif" style="background-repeat: no-repeat;background-position: center;color: #4169E1;">
    
    <%
     Cookie[] c = request.getCookies();
     Cookie cookie = null;
     if(c != null){
     for(Cookie ck:c){
     if(ck.getName().equals("loging")){
     cookie = ck;
     break;
     }
     }
     }
    %>
    
    <c:if test="<%=cookie !=null %>">
     <jsp:forward page="/servlet/loginServlet">
     <jsp:param value="<%=cookie.getValue() %>" name="AutoLoginUserName"/>
     </jsp:forward>
    </c:if>
    
    <div style="position:absolute;top:400px;left:740px;">
    <form name="myForm" action="servlet/loginServlet" method="post" onsubmit="return volidate()">
     <table>
     <tr>
     <td colspan="2" align="center">
     <h1>欢迎登陆</h1>
     </td>
     </tr>
<tr>
<td colspan="2"></td>
</tr>    
<tr>
<td>用户:</td>
<td><input type="text" name="userName" /></td>
<td><span id="userNameLabel"></span></td>
</tr>    
<tr>
<td>密码:</td>
<td><input type="password" name="userPwd"/></td>
<td><span id="userPwdLabel"></span></td>
</tr>    
<tr>
<td>验证码</td>
<td><input type="text" name="volidateNum" /></td>
</tr>    
<tr>
<td><img src="servlet/ImageServlet"/></td>
<td><a href="<%=basePath%>/login/login.jsp">看不清换一张</a></td>
</tr>    
<tr>
<td colspan="2">
<input type="checkbox" name="autoLogin">两周内不用再登录
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="确认"/>&nbsp;&nbsp;
<input type="reset" value="重置"/>&nbsp;&nbsp;
</td>
<td><span id="submitLabel" style="color: red;">${tips }</span></td>
</tr>    
<tr>
<td><input type="hidden" name="code"/></td>
</tr>
     </table>
    </form>
    </div>
  </body>
</html>
过滤器代码:import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import com.lee.model.Operator;public class CheckUserFilter implements Filter { public void destroy() {
// TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request;
// 如果已经创建会话则取出会话
HttpSession session = req.getSession(false);
Operator operator = null;
if(session!=null){
// 查看会话中是否有Operator对象
operator = (Operator)session.getAttribute("operator");
}

if(operator!=null||req.getRequestURI().endsWith("login.jsp")){
chain.doFilter(request, response);
}else{
HttpServletResponse rep = (HttpServletResponse)response;
rep.sendRedirect(req.getContextPath()+"/login/login.jsp");
}

} public void init(FilterConfig arg0) throws ServletException { }}
web.xml:<filter>
<filter-name>CheckUser</filter-name>
<filter-class>com.lee.filter.CheckUserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CheckUser</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

解决方案 »

  1.   

    <jsp:forward page="/servlet/loginServlet">
                <jsp:param value="<%=cookie.getValue() %>" name="AutoLoginUserName"/>
    </jsp:forward>转发?我觉得应该包含进来吧include
      

  2.   

    很明显 你请求图片的请求被 Filter 过滤掉了 
      

  3.   

    果然啊,是被我过滤掉了。import java.io.IOException;import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;import com.lee.model.Operator;public class CheckUserFilter implements Filter {    public void destroy() {
            // TODO Auto-generated method stub    }    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {        HttpServletRequest req = (HttpServletRequest)request;
            // 如果已经创建会话则取出会话
            HttpSession session = req.getSession(false);
            Operator operator = null;
            if(session!=null){
                // 查看会话中是否有Operator对象
                operator = (Operator)session.getAttribute("operator");
            }
            
            if(operator!=null||req.getRequestURI().endsWith("login.jsp")||req.getRequestURI().endsWith("ImageServlet"){//改成这样验证码可以得到了
                chain.doFilter(request, response);
            }else{
                HttpServletResponse rep = (HttpServletResponse)response;
                rep.sendRedirect(req.getContextPath()+"/login/login.jsp");
            }
            
        }    public void init(FilterConfig arg0) throws ServletException {    }}但是为什么背景图片也不显示呢??
    我是在body中加的属性backGround="images/home_background.gif",照理这与过滤器应该没什么关系吧。
      

  4.   

    if(operator!=null||req.getRequestURI().endsWith("login.jsp")||req.getRequestURI().endsWith("ImageServlet"){//改成这样验证码可以得到了