过去我们使用SSO解决方案进行身份验证。 servlet过滤器正在检查登录等。 为了降低成本,我们希望用对我们数据库的简单认证来替换它。
这里的计划是使用旧的登录/密码更改jsp(位于sso服务器上)并以这种方式直接在我们的应用程序中调用它(如果过滤器检测到未登录的用户):
req.getRequestDispatcher("/auth/login.jsp").include(req, response);
显示页面,但仅显示文本。图像和样式表未显示。 (无法找到)。
<img src="/auth/platform.jpg" alt="platform" class="left" />
我尝试了其他几种方法,但所有这些版本都没有用。我知道,相对路径不起作用!
<img src="auth/platform.jpg" />
<img src=".auth/platform.jpg" />
<img src="<%=request.getContextPath()%>/auth/platform.jpg" />
我输出以下内容,一切都是空的。
ServletPath: <%request.getServletPath(); %> <br />
ServletContext: <%request.getServletContext();%> <br />
ContextPath: <%request.getContextPath(); %> <br />
LocalAddr: <%request.getLocalAddr(); %> <br />
PathInfo: <%request.getPathInfo(); %> <br />
RemoteAddr: <%request.getRemoteAddr(); %> <br />
RemoteHost: <%request.getRemoteHost(); %> <br />
在原始项目(登录页面所在的项目)中,jsp看起来只有:
<img src="images/platform.jpg" />
它有效,也有相对引用...
通过以这种方式引用样式表(或上述任何其他方式)也找不到样式表:
<link href="/auth/style.css" rel="stylesheet" type="text/css" />
但如果我使用这种方式,它会起作用!
<style>
<%@ include file="/auth/style.css"%>
</style>
这是我的结构:
我的web.xml中还需要其他内容吗?
我知道,如今将使用JSF,但这是一个旧项目,应该尽可能少地进行修改。
这是http错误消息:
ERROR] 500 - GET /auth/platform.jpg (127.0.0.1) 2720 bytes
Request headers
Host: localhost:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://localhost:8888/Application.html?gwt.codesvr=127.0.0.1:9997&groupId=xxx
Cookie: JSESSIONID=b56c92nn81g51d28ys2l65dg2
Connection: keep-alive
Response headers
Accept-Ranges: bytes
Content-Type: text/html
Content-Length: 2720
Last-Modified: Thu, 30 Apr 2015 11:43:38 GMT
答案 0 :(得分:0)
JSP中图像和CSS的路径应该相对于servlet的URL而不是JSP文件本身。
答案 1 :(得分:0)
您可以将HTML标记设置为应用程序的上下文根(例如http://locahost:8080/myapp),文档中的所有相对网址都将相对于此进行解析:
http://www.w3schools.com/tags/tag_base.asp
因此,在JSP中,您可以执行以下操作
<%
String path = request.getContextPath();
String basePath = request.getScheme()
+ "://"
+ request.getServerName()
+ ":"
+ (request.getServerPort() != 80
? request.getServerPort()
: "") + path + "/";
%>
<head>
<base href="<%=basePath%>" />
<!-- relative link to a folder 'css' in the webapp root -->
<link href="css/my-css.css" rel="stylesheet" media="screen" />
</head>
</html>
您可以通过使用或调整此方法来避免使用scriptlet
how to get the base url from jsp request object?
如果您没有使用模板库,那么您可以创建一个标记文件,以避免在所有页面中重复此操作。
答案 2 :(得分:0)
搜索了几个小时后,我找到了“不显示图片和加载样式表”的原因。
使用以下HTML代码,我得到了一个HTTP 200(直接...)
<img src="images/xxx.jpg" />
未显示图像的原因是验证(servlet)过滤器,它检查现有会话(用户登录等)。由于这是一个登录页面,因此没有有效的会话,所有其他请求(加载样式表和图像)都被阻止。
我的过滤器看起来像:
Guice.createInjector(..., new ServletModule() {
@Override
protected void configureServlets() {
filter("/*").through(MyFilter.class);
}
}
允许图像(jpgs)的最简单方法是将以下内容添加到我的doFilter()中:
if (httpServletRequest.getRequestURI().endsWith(".jpg")) {
chain.doFilter(request, response);
}
问题是要找出,那就是导致问题的过滤器......
谢谢你们。