问题描述
这是Filter的实现类代码packagelee;importjavax.servlet.*;importjavax.servlet.http.*;importjavax.servlet.annotation.*;importjava.io.*;publicclassAuthorityFilterimplementsFilter{//FilterConfig可用于访问Filter的配置信息privateFilterConfigconfig;//实现初始化方法publicvoidinit(FilterConfigconfig){System.out.println("初始化");this.config=config;}//实现销毁方法publicvoiddestroy(){System.out.println("销毁");this.config=null;}//执行过滤的核心方法publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{System.out.println("核心办法");//获取该Filter的配置参数Stringencoding=config.getInitParameter("encoding");StringloginPage=config.getInitParameter("loginPage");StringproLogin=config.getInitParameter("proLogin");//设置request编码用的字符集request.setCharacterEncoding(encoding);//①HttpServletRequestrequ=(HttpServletRequest)request;HttpSessionsession=requ.getSession(true);//获取客户请求的页面StringrequestPath=requ.getServletPath();//如果session范围的user为null,即表明没有登录//且用户请求的既不是登录页面,也不是处理登录的页面if(session.getAttribute("user")==null&&!requestPath.endsWith(loginPage)&&!requestPath.endsWith(proLogin)){//forward到登录页面System.out.println(session.getAttribute("user"));request.setAttribute("tip","您还没有登录");request.getRequestDispatcher(loginPage).forward(request,response);}//"放行"请求else{System.out.println("放行");chain.doFilter(request,response);}}}
这是配置文件<?xmlversion="1.0"encoding="GBK"?><web-appxmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!--定义Filter--><filter><!--Filter的名字--><filter-name>authority</filter-name><!--Filter的实现类--><filter-class>lee.AuthorityFilter</filter-class><!--下面三个init-param元素配置了三个参数--><init-param><param-name>encoding</param-name><param-value>GBK</param-value></init-param><init-param><param-name>loginPage</param-name><param-value>/login.jsp</param-value></init-param><init-param><param-name>proLogin</param-name><param-value>/proLogin.jsp</param-value></init-param></filter><!--定义Filter拦截的URL地址--><filter-mapping><!--Filter的名字--><filter-name>authority</filter-name><!--Filter负责拦截的URL--><url-pattern>/*</url-pattern></filter-mapping></web-app>
这是登录jsp的页面代码<%@pagecontentType="text/html;charset=GBK"language="java"errorPage=""%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><title>登录页面</title><metaname="website"content=""/></head><body><h2>登录页面</h2><%if(request.getAttribute("tip")!=null){out.println("<fontcolor='red'>"+request.getAttribute("tip")+"</font>");}%><formmethod="post"action="proLogin.jsp">用户名:<inputtype="text"name="name"/><br/><inputtype="submit"value="登录"/></form></body></html>
这是登录成功的JSP页面<%@pagecontentType="text/html;charset=GBK"language="java"errorPage=""%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><title>登录页面</title><metaname="website"content=""/></head><body><h2>登录页面</h2><%session.setAttribute("user",request.getParameter("name"));%>登录成功,可以访问该应用的其他页面</body></html>
问题是这样子的:想要知道Filter是如何拦截客户端发来的请求的,所以在其实现类中的办法中都有向控制台打印字符的语句。但是实际上,控制台却什么消息都没有。然而让人困惑的是,Filter似乎有拦截到了客户端的请求。(Test为项目名称)现象一:输入:http://localhost:8080/Test/a.jsp①,浏览器跳转到login界面(a.jsp并不存在项目中),控制台无反应,登录成功后可进入登录成功画面,此时更加让我疑惑不解的事又发生了,再次输入①,第一次回车,登录界面,第二次回车404页面,第三次回车又是login界面,之后一直回车都不变(以上都是在同一个浏览器,同一页面中进行的)疑问:1,客户端是发送了一个不存在的页面请求,按道理如果Filter没有拦截到的话,应该会出现404页面的,但如果拦截到并转到login界面的话,应该有打印的才对。2,浏览器显示成功界面时,为何会出现login界面,404,login界面现象2:如果在浏览器中输入http://localhost:8080/Test/filter.jsp其中filter.jsp是项目中存在的一个简单的显示页面,此时浏览器能成功显示此页面,并没有跳转到login界面,再输入其他类似filtersss.jsp这些页面,浏览器不管回车多少次都显示404错误页面,但是更加奇怪的事情又发生了,输入之前的不存在的a.jsp,又成功跳转到了login界面并且出现了404-login的情况疑问:1拦截器Filter的作用不如前期预想的发展,似乎服务器端记住了类似a.jsp,这些不存在的页面,只要出现a,jsp,aa.jsp.aa就会实现跳转现象2:如果将a.jsp改成z.jsp这些一样不存在的页面时又会一直出现404错误页面现在头都大了,都不知道问题是在哪里了,希望大神能指点一下。本人也实在是不知道怎么调试JAVAEE的项目,感觉IDE能提供的异常信息都隐形了,无从下手
解决方案
解决方案二:
太长了,也太困了~~看你问题写的这么详细,帮顶下吧
解决方案三:
看上去好像没什么问题,如果项目不是太大的话,可以发出来看看。也可以通过以下方法试试:1.可能是应用服务器上部署的是跟你现在测试的项目的项目名称一样的项目,删除应用服务器上部署的项目,同时清空情况工作目录,重新部署项目;2.可能是浏览器的缓存问题,清空浏览器缓存;3.可能是代理问题,打开host文件,看看你访问的域名或ip有没有指定到别的服务器上;
解决方案四:
引用2楼gaofuqi的回复:
看上去好像没什么问题,如果项目不是太大的话,可以发出来看看。也可以通过以下方法试试:1.可能是应用服务器上部署的是跟你现在测试的项目的项目名称一样的项目,删除应用服务器上部署的项目,同时清空情况工作目录,重新部署项目;2.可能是浏览器的缓存问题,清空浏览器缓存;3.可能是代理问题,打开host文件,看看你访问的域名或ip有没有指定到别的服务器上;
1项目重新部署在服务器上时,问题仍然存在。那说明一下我平时部署项目的方法。这是一个书上的例子,我是直接将源码上的WEB-INF文件以及JSP文件一起复制到项目的WebContent路径下,然后刷新我的Test项目,然后运行测试的。2浏览器缓存问题,在清空浏览器缓存的情况下问题仍然存在。但是不知道Eclipse的内置浏览器有没有清空缓存,因为打开内置浏览器的下拉框时仍然有我以前项目的路径3host路径如下,也不存在任何问题以下是项目网盘地址链接:http://pan.baidu.com/s/1sjsdvtV密码:1awt有劳各位了
解决方案五:
怀疑是浏览器缓存问题。别用回车,使用Ctrl+F5强制刷新,看看服务端控制台有没有输出,前面页面有没有正确跳转。
解决方案六:
引用4楼zhangjihao的回复:
怀疑是浏览器缓存问题。别用回车,使用Ctrl+F5强制刷新,看看服务端控制台有没有输出,前面页面有没有正确跳转。
能讲一讲eclipse内置浏览器与普通浏览器之间的区别吗?我也怀疑是的确是缓存的问题。因为我在笔记本上重新部署项目时又可以了。而且由于这个项目是平时用来测试用的,所以每当测试一个项目时,会把以前项目的WebContent直接删除,再重建路径。不知会不会产生影响?
解决方案七:
先就楼主的这个问题已不收。楼主没有看EL和JSTL吗?
解决方案八:
先就楼主的这个问题已不说。楼主没有看EL和JSTL吗?
解决方案九:
看了半天也看不出哪里有问题。置于浏览器缓存的问题楼上已经说了。楼主如果解决了有劳告诉我下是怎么解决的