前一篇文章 https://my.oschina.net/thinwonton/blog/1417824 中介绍了cas-web工程的属性加载原理,如有兴趣可以看一下该文的开头。有了前文的铺垫,本文不再赘述,将直接介绍如何自定义登录页。
在cas-servlet.xml中定义了一个视图解析器,默认的前缀是/WEB-INF/view/jsp/default/ui/,在cas.properties属性文件中的cas.viewResolver.defaultViewsPathPrefix可以指定jsp的路径。
<bean id="internalViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="${cas.viewResolver.defaultViewsPathPrefix:/WEB-INF/view/jsp/default/ui/}"
p:suffix=".jsp"
p:order="3"/>
明白了这个原理后,把它修改为
cas.viewResolver.defaultViewsPathPrefix=/WEB-INF/custom-view/jsp/default/ui/
然后复制一份 /WEB-INF/view 文件夹,到/WEB-INF/custom-view,复制后的文件结构如图
好了,现在cas-web默认渲染的视图文件夹已经修改了。
看一下需要定制的页面
WEB-INF/custom-view/jsp/default/ui/includes/top.jsp 删除CAS图标
<!DOCTYPE html>
<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>CAS – Central Authentication Service</title>
<spring:theme code="standard.custom.css.file" var="customCssFile" />
<link rel="stylesheet" href="<c:url value="${customCssFile}" />" />
<link rel="icon" href="<c:url value="/favicon.ico" />" type="image/x-icon" />
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.6.1/html5shiv.js" type="text/javascript"></script>
<![endif]-->
</head>
<body id="cas">
<div id="container">
<header>
</header>
<div id="content">
WEB-INF/custom-view/jsp/default/ui/includes/bottom.jsp 删除版权
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
</div> <!-- END #content -->
<footer>
<div id="copyright">
</div>
</footer>
</div> <!-- END #container -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/headjs/1.0.3/head.min.js"></script>
<spring:theme code="cas.javascript.file" var="casJavascriptFile" text="" />
<script type="text/javascript" src="<c:url value="${casJavascriptFile}" />"></script>
</body>
</html>
修改登录页的内容
WEB-INF/custom-view/jsp/default/ui/casLoginView.jsp
<jsp:directive.include file="includes/top.jsp" />
<div id="cookiesDisabled" class="errors" style="display:none;">
<h2><spring:message code="screen.cookies.disabled.title" /></h2>
<p><spring:message code="screen.cookies.disabled.message" /></p>
</div>
<c:if test="${not empty registeredService}">
<c:set var="registeredServiceLogo" value="images/webapp.png"/>
<c:set var="registeredServiceName" value="${registeredService.name}"/>
<c:set var="registeredServiceDescription" value="${registeredService.description}"/>
<c:choose>
<c:when test="${not empty mduiContext}">
<c:if test="${not empty mduiContext.logoUrl}">
<c:set var="registeredServiceLogo" value="${mduiContext.logoUrl}"/>
</c:if>
<c:set var="registeredServiceName" value="${mduiContext.displayName}"/>
<c:set var="registeredServiceDescription" value="${mduiContext.description}"/>
</c:when>
<c:when test="${not empty registeredService.logo}">
<c:set var="registeredServiceLogo" value="${registeredService.logo}"/>
</c:when>
</c:choose>
<div id="serviceui" class="serviceinfo">
<table>
<tr>
<td><img src="${registeredServiceLogo}"></td>
<td id="servicedesc">
<h1>${fn:escapeXml(registeredServiceName)}</h1>
<p>${fn:escapeXml(registeredServiceDescription)}</p>
</td>
</tr>
</table>
</div>
<p/>
</c:if>
<div class="box" id="login">
<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true">
<form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />
<h2><spring:message code="screen.welcome.instructions" /></h2>
<section class="row">
<label for="username"><spring:message code="screen.welcome.label.netid" /></label>
<c:choose>
<c:when test="${not empty sessionScope.openIdLocalId}">
<strong><c:out value="${sessionScope.openIdLocalId}" /></strong>
<input type="hidden" id="username" name="username" value="<c:out value="${sessionScope.openIdLocalId}" />" />
</c:when>
<c:otherwise>
<spring:message code="screen.welcome.label.netid.accesskey" var="userNameAccessKey" />
<form:input cssClass="required" cssErrorClass="error" id="username" size="25" tabindex="1" accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" />
</c:otherwise>
</c:choose>
</section>
<section class="row">
<label for="password"><spring:message code="screen.welcome.label.password" /></label>
<%--
NOTE: Certain browsers will offer the option of caching passwords for a user. There is a non-standard attribute,
"autocomplete" that when set to "off" will tell certain browsers not to prompt to cache credentials. For more
information, see the following web page:
http://www.technofundo.com/tech/web/ie_autocomplete.html
--%>
<spring:message code="screen.welcome.label.password.accesskey" var="passwordAccessKey" />
<form:password cssClass="required" cssErrorClass="error" id="password" size="25" tabindex="2" path="password" accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" />
<span id="capslock-on" style="display:none;"><p><img src="images/warning.png" valign="top"> <spring:message code="screen.capslock.on" /></p></span>
</section>
<!--
<section class="row check">
<p>
<input id="warn" name="warn" value="true" tabindex="3" accesskey="<spring:message code="screen.welcome.label.warn.accesskey" />" type="checkbox" />
<label for="warn"><spring:message code="screen.welcome.label.warn" /></label>
<br/>
<input id="publicWorkstation" name="publicWorkstation" value="false" tabindex="4" type="checkbox" />
<label for="publicWorkstation"><spring:message code="screen.welcome.label.publicstation" /></label>
<br/>
<input type="checkbox" name="rememberMe" id="rememberMe" value="true" tabindex="5" />
<label for="rememberMe"><spring:message code="screen.rememberme.checkbox.title" /></label>
</p>
</section>
-->
<section class="row btn-row">
<input type="hidden" name="lt" value="${loginTicket}" />
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
<input class="btn-submit" name="submit" accesskey="l" value="<spring:message code="screen.welcome.button.login" />" tabindex="6" type="submit" />
<input class="btn-reset" name="reset" accesskey="c" value="<spring:message code="screen.welcome.button.clear" />" tabindex="7" type="reset" />
</section>
</form:form>
</div>
<%--修改content样式--%>
<script>
document.getElementById("content").style.width="320px";
document.getElementById("content").style.margin="0 auto";
</script>
<jsp:directive.include file="includes/bottom.jsp" />
OK,大功告成