<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://ab.edge-technologies.com/docs/index.php?action=history&amp;feed=atom&amp;title=Appboard%2F2.6%2Fbuilder%2Fsystem_administration%2Flogin_page%2Fcustom</id>
	<title>Appboard/2.6/builder/system administration/login page/custom - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://ab.edge-technologies.com/docs/index.php?action=history&amp;feed=atom&amp;title=Appboard%2F2.6%2Fbuilder%2Fsystem_administration%2Flogin_page%2Fcustom"/>
	<link rel="alternate" type="text/html" href="http://ab.edge-technologies.com/docs/index.php?title=Appboard/2.6/builder/system_administration/login_page/custom&amp;action=history"/>
	<updated>2026-04-08T12:20:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>http://ab.edge-technologies.com/docs/index.php?title=Appboard/2.6/builder/system_administration/login_page/custom&amp;diff=8332&amp;oldid=prev</id>
		<title>imported&gt;Jason.nicholls: 1 revision</title>
		<link rel="alternate" type="text/html" href="http://ab.edge-technologies.com/docs/index.php?title=Appboard/2.6/builder/system_administration/login_page/custom&amp;diff=8332&amp;oldid=prev"/>
		<updated>2015-04-30T10:59:33Z</updated>

		<summary type="html">&lt;p&gt;1 revision&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:59, 30 April 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>imported&gt;Jason.nicholls</name></author>
	</entry>
	<entry>
		<id>http://ab.edge-technologies.com/docs/index.php?title=Appboard/2.6/builder/system_administration/login_page/custom&amp;diff=8331&amp;oldid=prev</id>
		<title>imported&gt;Jason.nicholls: /* Examples */</title>
		<link rel="alternate" type="text/html" href="http://ab.edge-technologies.com/docs/index.php?title=Appboard/2.6/builder/system_administration/login_page/custom&amp;diff=8331&amp;oldid=prev"/>
		<updated>2015-02-26T05:31:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Examples&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Custom Login Page Examples}}&lt;br /&gt;
[[Category:AppBoard 2.6]]&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
This document provides some examples of modifying and producing completely custom login pages for AppBoard. For more general information about login pages and how to configure the system login page, refer to the [[appboard/2.6/builder/system_administration/login_page|Login Page]] documentation.&lt;br /&gt;
&lt;br /&gt;
By default the different login page styles shipped with AppBoard are simple HTML forms that allow the user to enter the required information, and then &amp;lt;tt&amp;gt;POST&amp;lt;/tt&amp;gt; it to the server so the server can authenticate and establish a session.&lt;br /&gt;
&lt;br /&gt;
Typical customizations are:&lt;br /&gt;
&lt;br /&gt;
* simply changing the logo graphic&lt;br /&gt;
* various styling changes (colours, fonts, etc...)&lt;br /&gt;
* addition of notices or terms &amp;amp; conditions&lt;br /&gt;
* hiding the Domain field for single-domain implementations&lt;br /&gt;
* making the Domain field a drop-down&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Required Fields and Submission ==&lt;br /&gt;
&lt;br /&gt;
The following fields are required to log into AppBoard:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;login&amp;#039;&amp;#039;&amp;#039;: set to &amp;#039;&amp;#039;yes&amp;#039;&amp;#039;. Typically this is a hidden field&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;userid&amp;#039;&amp;#039;&amp;#039;: This would be a visible field to allow a user to enter their user name.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;password&amp;#039;&amp;#039;&amp;#039;: This would be a visible password field to allow a user to enter their password.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;domainSelect&amp;#039;&amp;#039;&amp;#039;: Another text input to allow a user to enter their domain.&lt;br /&gt;
&lt;br /&gt;
The form is then &amp;lt;tt&amp;gt;POST&amp;lt;/tt&amp;gt;ed to: &amp;lt;tt&amp;gt;/enportal/servlet/pd&amp;lt;/tt&amp;gt;. Using &amp;lt;tt&amp;gt;GET&amp;lt;/tt&amp;gt; is also possible but not recommended as all all requests are logged and get requests include all parameters, which means user passwords would also get logged.&lt;br /&gt;
&lt;br /&gt;
== Included Login Pages ==&lt;br /&gt;
&lt;br /&gt;
The login pages shipped with AppBoard all follow the same structure. A main &amp;lt;tt&amp;gt;login.jsp&amp;lt;/tt&amp;gt; Java Server Page which performs browser version checking, auto-fills previous values, handles error responses, presents a HTML form for the user to complete. Along with the JSP there will be other supporting images and CSS resources.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Browser Type Checking ===&lt;br /&gt;
&lt;br /&gt;
If a client does not meed the minimum browser requirements the login page will redirect the client to &amp;lt;tt&amp;gt;/enportal/enPortalInvalidBrowser.jsp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This works in three parts with the default login pages. The first is to load the Edge JspConfigBean:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;jsp:useBean id=&amp;quot;JspConfigBean&amp;quot; scope=&amp;quot;application&amp;quot; class=&amp;quot;com.edgetech.util.config.JspConfig&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;% config.getServletContext().setAttribute(&amp;quot;JspConfigBean&amp;quot;, JspConfigBean); %&amp;gt;&lt;br /&gt;
 &amp;lt;/jsp:useBean&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then the default minimum versions are retrieved by the JSP:&lt;br /&gt;
&lt;br /&gt;
 // get minimum versions from the Portal server&lt;br /&gt;
 float minIEVersion = JspConfigBean.getMinIEVersion();&lt;br /&gt;
 float minNetscapeVersion = JspConfigBean.getMinNetscapeVersion();&lt;br /&gt;
 float minChromeVersion = JspConfigBean.getMinChromeVersion();&lt;br /&gt;
&lt;br /&gt;
And finally a check is performed to determine whether to redirect:&lt;br /&gt;
&lt;br /&gt;
 if ( ! ((isChrome &amp;amp;&amp;amp; version &amp;lt; &amp;lt;%=minChromeVersion%&amp;gt;) || (isNav &amp;amp;&amp;amp; version &amp;lt; &amp;lt;%=minNetscapeVersion%&amp;gt;) || (isIE &amp;amp;&amp;amp; version &amp;lt; &amp;lt;%=minIEVersion%&amp;gt;)) ) {&lt;br /&gt;
 ...&lt;br /&gt;
 } else {&lt;br /&gt;
     // The user is trying to use an unsupported version of IE or netscape.&lt;br /&gt;
     rootWindow.location.replace(&amp;quot;&amp;lt;%=JSPUtilities.out(URLUtil.getPortalContext(), true)%&amp;gt;/enPortalInvalidBrowser.jsp&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
Depending on the deployment it may be useful to remove this check, or make this check more explicit due to standard operating environment and/or applications used within the organization. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Auto-fill &amp;#039;&amp;#039;User Name&amp;#039;&amp;#039; and &amp;#039;&amp;#039;Domain&amp;#039;&amp;#039; Fields ===&lt;br /&gt;
&lt;br /&gt;
{{Note|1=Modern browsers often will auto-fill forms on behalf of the user already making this section redundant. Also realize that even if the JSP auto-fill code is disabled the browser may still auto-fill forms. In the case of the browser auto-filling form fields it is necessary to modify the form inputs and specify the &amp;lt;tt&amp;gt;autocomplete=&amp;quot;off&amp;quot;&amp;lt;/tt&amp;gt; attribute.}}&lt;br /&gt;
&lt;br /&gt;
If a user has previously logged into AppBoard then it&amp;#039;s possible for the server to retrieve the users &amp;#039;&amp;#039;User Name&amp;#039;&amp;#039; and &amp;#039;&amp;#039;Domain&amp;#039;&amp;#039; last used via cookies stored in the browser. This is implemented in the default JSP pages by first loading some utilities:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;%@ page import=&amp;quot;com.edgetech.eportal.util.*&amp;quot; %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ page import=&amp;quot;com.edgetech.eportal.dispatch.DispatchUtilities&amp;quot; %&amp;gt;&lt;br /&gt;
 &amp;lt;%@ page import=&amp;quot;com.edgetech.eportal.web.JSPUtilities&amp;quot; %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then doing some lookups and setting default values for the user and domain:&lt;br /&gt;
&lt;br /&gt;
 // Lookup the UserID/Domain values from the cookie to pre-fill the login form&lt;br /&gt;
 String user = DispatchUtilities.getRequestAccessor().getUserName(request);&lt;br /&gt;
 String domain = DispatchUtilities.getRequestAccessor().getDomainName(request);&lt;br /&gt;
 if ( (domain == null) || domain.equals(&amp;quot;null&amp;quot;) ) {&lt;br /&gt;
     domain = &amp;quot;&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 if ( (user == null) || user.equals(&amp;quot;null&amp;quot;) ) {&lt;br /&gt;
     user = &amp;quot;&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 user = JSPUtilities.toHTMLString(user);&lt;br /&gt;
 domain = JSPUtilities.toHTMLString(domain);&lt;br /&gt;
&lt;br /&gt;
=== Handling Errors ===&lt;br /&gt;
&lt;br /&gt;
In the event of an un-successful login attempt it should be indicated to the user. The JSP handles this by checking for error conditions on loading:&lt;br /&gt;
&lt;br /&gt;
 String error_Text = request.getParameter(&amp;quot;error&amp;quot;);&lt;br /&gt;
 if (error_Text == null)&lt;br /&gt;
 {&lt;br /&gt;
     error_Text = (String) request.getAttribute(&amp;quot;error&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 if (error_Text == null)&lt;br /&gt;
 {&lt;br /&gt;
     error_Text = &amp;quot;&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Once the page loads there is a javascript call made to &amp;lt;tt&amp;gt;error_checks&amp;lt;/tt&amp;gt;. This actually performs a number of checks including the minimum browser checks. If anything is in error then &amp;lt;tt&amp;gt;setErrorState&amp;lt;/tt&amp;gt; is called to modify the style of the page to indicate an error condition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
{{Note|Do not modify the login pages shipped with AppBoard, refer to [[appboard/2.6/builder/system_administration/login_page#Modifying_Login_Pages|Modifying Login Pages]] for more information.}}&lt;br /&gt;
&lt;br /&gt;
=== Custom Logo ===&lt;br /&gt;
&lt;br /&gt;
Replacing the logo but otherwise using the shipped login pages is the easiest and most common login page customization.&lt;br /&gt;
&lt;br /&gt;
# Make a copy of a shipped login page directory as mentioned in [[appboard/2.6/builder/system_administration/login_page#Modifying_Login_Pages|Modifying Login Pages]].&lt;br /&gt;
# The logo image for all shipped themes will be in this location: &amp;lt;tt&amp;gt;.../images/logo.png&amp;lt;/tt&amp;gt;&lt;br /&gt;
# The default logo size is 340 x 200 for the classic login pages, and 340 x 133 for the CSS3 and Flat styles.&lt;br /&gt;
# The simplest approach is to create a new logo that matches the dimensions of the existing logo to avoid any layout issues. Replace the logo.png file with your new logo.&lt;br /&gt;
# Set the system default login page to use the new login page, refer to the [[appboard/2.6/builder/system_administration/login_page|Login Page]] documentation for more information.&lt;br /&gt;
&lt;br /&gt;
=== Minimal Login Page ===&lt;br /&gt;
&lt;br /&gt;
The most basic login page is a HTML form without using JSP, javascript, or images and styling. Of course this doesn&amp;#039;t handle error checking or browser detection etc... but serves as an example of the minimum needed to write a completely custom login page:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;[html,N]&lt;br /&gt;
 &amp;lt;html&amp;gt;&lt;br /&gt;
   &amp;lt;head&amp;gt;&lt;br /&gt;
     &amp;lt;title&amp;gt;Minimal Login Page&amp;lt;/title&amp;gt;&lt;br /&gt;
   &amp;lt;/head&amp;gt;&lt;br /&gt;
   &amp;lt;body&amp;gt;&lt;br /&gt;
     &amp;lt;h1&amp;gt;Minimal Login Page&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
     &amp;lt;form name=&amp;quot;loginForm&amp;quot; method=post action=&amp;quot;/enportal/servlet/pd&amp;quot;&amp;gt;&lt;br /&gt;
       &amp;lt;input name=&amp;quot;login&amp;quot; type=&amp;quot;hidden&amp;quot; value=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
       &amp;lt;table&amp;gt;&lt;br /&gt;
         &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;User Name:&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;userid&amp;quot; size=&amp;quot;28&amp;quot; maxlength=&amp;quot;80&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Password:&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;password&amp;quot; size=&amp;quot;28&amp;quot; maxlength=&amp;quot;80&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Domain:&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt; &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;domainSelect&amp;quot; size=&amp;quot;28&amp;quot; maxlength=&amp;quot;80&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
         &amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot;&amp;gt; &amp;lt;input type=&amp;quot;submit&amp;quot; value=”login”&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;/table&amp;gt;&lt;br /&gt;
     &amp;lt;/form&amp;gt;&lt;br /&gt;
   &amp;lt;/body&amp;gt;&lt;br /&gt;
 &amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting a Default Domain ===&lt;br /&gt;
&lt;br /&gt;
For implementations with a single Domain for all users the Domain field may add confusion so can be set to a particular value and even hidden.&lt;br /&gt;
&lt;br /&gt;
# First make a new copy of an existing login page to start modifying. &lt;br /&gt;
# Edit &amp;lt;tt&amp;gt;login.jsp&amp;lt;/tt&amp;gt;&lt;br /&gt;
## find the line line with: &amp;lt;tt&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;domain&amp;quot; ...&amp;lt;/tt&amp;gt;&lt;br /&gt;
## modify the &amp;lt;tt&amp;gt;value&amp;lt;/tt&amp;gt; from a JSP variable to the desired value, such as:&lt;br /&gt;
##: &amp;lt;tt&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;domain&amp;quot; value=&amp;quot;&amp;#039;&amp;#039;&amp;#039;myDomain&amp;#039;&amp;#039;&amp;#039;&amp;quot; ...&amp;lt;/tt&amp;gt;&lt;br /&gt;
# Set the system login page to use your new login page.&lt;br /&gt;
&lt;br /&gt;
In addition, if this field should be completely hidden then change the &amp;lt;tt&amp;gt;type&amp;lt;/tt&amp;gt; attribute from &amp;lt;tt&amp;gt;text&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;hidden&amp;lt;/tt&amp;gt;. In this case though some additional HTML and/or CSS changes may be necessary to improve the aesthetic of the form.&lt;/div&gt;</summary>
		<author><name>imported&gt;Jason.nicholls</name></author>
	</entry>
</feed>