我在jsp中创建了一个小型web-app,其中包含一个带登录的起始页面和一些带有注销的受限页面,其中包括使用过滤器和servlet控制的所有内容。我开始制作它是因为我想学习如何使用过滤器和servlet,并认为我已经很好地成功了。
当我确保一切都发生在'root'url-pattern中时,一切正常,但问题是我希望受限制的页面位于自己的url-pattern目录中......
在我的受限制网页上,我已将(< @ include ...>)一个包含此表格的退出页面包含在内:
<form method=POST action=LC>
<table align="right">
<tr>
<td>Navn:</td>
<td><b><%=login.getName() %></b></td>
</tr>
<tr>
<td>Aktør:</td>
<td><b><%= login.getAktoer() %></b></td>
</tr>
<tr>
<td><input type="submit" value="Log ud"></td>
</tr>
<tr>
<td></td>
<td><b><%= login.getMeddelelse() %></b></td>
</tr>
</table>
</form>
此页面上的提交将用户发送到一个控制servlet,它只清除一个LoginBean,在同一个bean上将boolean isLoggedin值设置为false,最后将sendRedirect'设置为我的起始页面。当所有页面都在“root”url-pattern目录中时,这很有效。
我的一个限制页面是Yellow.jsp。就像现在一样,它只是跟随servlet映射:
<servlet>
<servlet-name>ptYellow</servlet-name>
<jsp-file>/Yellow.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>ptYellow</servlet-name>
<url-pattern>/Yellow.jsp</url-pattern>
</servlet-mapping>
我想要的是:
<servlet-mapping>
<servlet-name>ptYellow</servlet-name>
<url-pattern>/RestrictedPages/YellowZone/Yellow.jsp</url-pattern>
</servlet-mapping>
但是当我尝试像这样映射并尝试从Yellow.jsp页面注销时,它只是吐出404错误,因为它试图在'/ RestrictedPages / YellowZone /'中访问我的注销控制servlet目录。
它试图访问:
的http://本地主机:8080 / MyApp的/ RestrictedPages / YellowZone / LC
(LC是我的Logout Control servlet)
什么时候应该去:
的http://本地主机:8080 / MYAPP / LC
我希望以不同的url模式在许多不同的受限页面上包含我的注销,因此它不应该映射到相同的url模式(这似乎无法解决问题)。
我绝对不想在所有受限制的页面上硬编码注销表格,当我知道它应该可以“包含”它...
我猜我必须在我的注销表格动作属性中写一些特别的东西,但是无法弄清楚要写什么。我尝试过这样的东西:
行动= * / LC
和
动作= / .. / LC
从大多数不相关的代码中删除,我的xml文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<welcome-file-list>
<welcome-file>StartSide.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>control.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<servlet-name>AC</servlet-name>
</filter-mapping>
<filter>
<filter-name>YellowFilter</filter-name>
<filter-class>control.YellowFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>YellowFilter</filter-name>
<url-pattern>/RestrictedPages/YellowZone/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>ptYellow</servlet-name>
<jsp-file>/Yellow.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>ptYellow</servlet-name>
<url-pattern>/RestrictedPages/YellowZone/Yellow.jsp</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>start</servlet-name>
<jsp-file>/StartSide.jsp</jsp-file>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>start</servlet-name>
<url-pattern>/start</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>AC</servlet-name>
<servlet-class>control.ActorControl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AC</servlet-name>
<url-pattern>/AC</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LC</servlet-name>
<servlet-class>control.LogoutControl</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LC</servlet-name>
<url-pattern>/LC</url-pattern>
</servlet-mapping>
</web-app>
如果有人可以指出我做错了什么会很棒...我可以看到在url-patterns上使用过滤器的很多潜力,但是当我不能做简单的东西时对我没用喜欢回到网址模式....
我正在使用Eclipse Helios和apache-tomcat 7.0,如果它有任何相关性......
(我用了几个小时试图寻找答案,但我认为我不确切知道要搜索的内容)
编辑:拼写错误和澄清
EDIT2:我试图在我的Logout.jsp页面上做一些映射(这是我在限制页面上包含的注销页面),但这似乎无法解决问题要么......
编辑3:今晚我已经解决了这个问题。
我尝试将这段代码添加到我的YellowFilter.java中(并将名称= Logout添加到Logout.jsp中的提交按钮):
try{
if(httpReq.getParameter("logout").equals("Log ud"))
httpResp.sendRedirect("LC");
} catch(NullPointerException e)
{
}
它也没有用,它仍然只是试图访问
的http://本地主机:8080 / MyApp的/ RestrictedPages / YellowZone / LC
我还尝试从我的注销表单中删除action参数,因此它只会POST到同一页面。这也无济于事......
此外,我试图在xml文件中编辑我的Logout控制servlet的servlet-mapping:
<servlet-mapping>
<servlet-name>LC</servlet-name>
<url-pattern>/*/*/LC</url-pattern>
</servlet-mapping>
没用,然后我尝试了:
<servlet-mapping>
<servlet-name>LC</servlet-name>
<url-pattern>/*/LC</url-pattern>
</servlet-mapping>
也没用,所以我尝试了:
<servlet-mapping>
<servlet-name>LC</servlet-name>
<url-pattern>/*LC</url-pattern>
</servlet-mapping>
这也不起作用......
/叹了口气,非常烦人的问题,并且不能放手......答案 0 :(得分:0)
我找到了一个非常简单的问题解决方案。我只是将Logout.jsp中的form方法更改为method = GET而不是POST,然后编写action = /'myappname'/'name-of-servlet':
<form method=GET action=/Prototype/LC>
<table align="right">
<tr>
<td>Navn:</td>
<td><b><%=login.getName() %></b></td>
</tr>
<tr>
<td>Aktør:</td>
<td><b><%= login.getAktoer() %></b></td>
</tr>
<tr>
<td><input type="submit" value="Log ud"></td>
</tr>
<tr>
<td></td>
<td><b><%= login.getMeddelelse() %></b></td>
</tr>
</table>
</form>
现在这个解决方案对我来说非常明显了,我忽略了这一点,我真的希望别人有同样的问题xD ...
将我的问题标题改为'回到url-pattern(从jsp页面调用servlet)'