Showing posts with label Weblogic. Show all posts
Showing posts with label Weblogic. Show all posts

Thursday, February 21, 2013

Side by Side Deployments (Rolling/Hot/InPlace Deployments)

One of the great features of ADF/Weblogic is side by side deployments. This allows you to deploy two different versions of an application to a Weblogic server without the need for an outage. Weblogic is smart enough deal with current and new session. Once the new version of the application has been deployed to the server the old version of the application set in to "Retired" status and the new version is set to "Active". The retired version of the application maintains any active sessions until they end (also has the option to expire all sessions immediately or after a set time period). Whilst the new active version of the application handles all the new sessions, this is quite a cool feature. I've used this a fair bit and it seems to work quite well. This only catch is if you are a deploying a large ear file the response times of the server do suffer.

Anyway, here is how you do it.

Firstly create a two test applications.

Create a MANIFEST.MF file and paste the following details inside. Take note of the Archive-Version, this is the version number that weblogic looks for when it decides to retire or promote the new application. 


You will need to create a new deployment profile.


Then define your new manifest file.


Then do the same as above but increment the Archive Version and do the above two steps to the second application.


In order to test that the side by side deployment worked. Deploy the first application and it should appear as 'Active' in the weblogic console, then deploy the second application and the first application should get set to 'Retired' and the new application will be set to 'Active'. 

To ensure that you don't have an outage you can test the site with a load testing too such as LoadUI as I did below. You can see an increase in response time when the second application is being deployed. In reality, it is Oracle's recommendation that you have the Admin Server running on a separate machine to your managed servers. So when you do a side by side deployment in "theory" you shouldn't see an increase in response times as you can in the below test.



Friday, September 28, 2012

ADF - Removing the Application Name from URL (Weblogic)

In order to remove the root context of an ADF or WebCenter application or the application name from the URL, it's quite a simple Weblogic configuration change.

Change the root context of an application can be done from via changing the application.xml. However, this can be quite an involved change if you are using a continuous intergration server such as Hudson or Jenkins as you will need to modify the build scripts to decompile the .ear copy in the new application.xml and then recompile the .ear. 

You will be happy to know Oracle have made a simple yet not well documented fix for this. As per the instructions below: 

1) Go to http://127.0.0.1:7101/console

2) Environment > Servers > DefaultServer(admin) > Protocols Tab > HTTP Tab

3) Modify the "Default WebApp Context Root" to /application_name


4) Hit Save

5) Go to Deployments

6) Select FMW Welcome Application - Undeploy (Check the box and click delete)

7) Restart Weblogic Server.

Go to http://127.0.0.1:7101/ or the home page of your application http://127.0.0.1:7101/faces/home.jspx and your application should come up. 

If faces is also an issue, for you this can also be removed, with a little more effort and the use of a java filter.


Thursday, October 20, 2011

Using WebLogic Server Embedded LDAP

Recently, I've had the need to setup user authentication with webcenter and noticed that weblogic had it's own built in LDAP server. I didn't find my information around on the OTN or google about it so I thought I'd share what I learnt. Below is how to setup LDAP on a WLS and authenticate against it in Java.

Setting up Embedded LDAP on the Intergrated WLS


You will need to set the credential and confirm credential to a new password and check the Anonymous Bind Allowed check box. In this example we will use “welcome1”.

All the below methods can be used to interface with the WLS Embedded LDAP.

If you need to explore the WLS embedded LDAP directory structure you can download JXpolrer and use the following details.

Localhost Details:
Host: 127.0.0.1:7101
Base DN: dn=DefaultDomain
User DN: cn=Admin
Password: welcome1



Variables



private String ldapServer = "ldap://127.0.0.1:7101"; private String ldapPassword = "welcome1"; private String ldapDC = "DefaultDomain";

Change Password

public String changePassword(String username, String oldPassword, String newPassword, String confirmNewPassword) { if (oldPassword.equals(newPassword)) { System.out.println("new and old passwords match"); return "Your new password must be different from your old password."; } if (!newPassword.equals(confirmNewPassword)) { System.out.println("new password and confirmed password don't match"); return "Your new password must match your confirmed password."; } if (!isAuthenticated(username, oldPassword)) { System.out.println("old password was not authenticated"); return "Your old password is incorrect."; } String ldapUri = ldapServer; String admindn = "cn=Admin"; String admincred = ldapPassword; String usersContainer = "ou=people,ou=myrealm,dc=" + ldapDC; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldapUri); env.put(Context.SECURITY_PRINCIPAL, admindn); env.put(Context.SECURITY_CREDENTIALS, admincred); try { InitialDirContext initialContext = new InitialDirContext(env); DirContext ctx = initialContext; ModificationItem[] mods = new ModificationItem[1]; Attribute mod0 = new BasicAttribute("userpassword", newPassword); mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, mod0); ctx.modifyAttributes("uid=" + username + "," + usersContainer, mods); ctx.close(); return "Password Changed!"; } catch (NamingException e) { System.out.println(e); return "Woops! Something went wrong!"; } }

Create User

public String createUser(String firstname, String lastname, String username, String password, String confirmPassword) { if (!password.equals(confirmPassword)) { return "Passwords do not match."; } String ldapUri = ldapServer; String admindn = "cn=Admin"; String admincred = ldapPassword; String usersContainer = "ou=people,ou=myrealm,dc=" + ldapDC; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldapUri); env.put(Context.SECURITY_PRINCIPAL, admindn); env.put(Context.SECURITY_CREDENTIALS, admincred); try { DirContext ctx = new InitialDirContext(env); Attributes attrs = new BasicAttributes(true); Attribute objclass = new BasicAttribute("ObjectClass"); objclass.add("top"); objclass.add("inetorgperson"); objclass.add("wlsuser"); Attribute surname = new BasicAttribute("sn"); surname.add(lastname); Attribute givenname = new BasicAttribute("givenname"); givenname.add(firstname); Attribute cn = new BasicAttribute("cn"); cn.add(username); Attribute mail = new BasicAttribute("mail"); mail.add(username); Attribute name = new BasicAttribute("displayname"); name.add(firstname + " " + lastname); Attribute pwd = new BasicAttribute("userpassword"); pwd.add(password); attrs.put(objclass); attrs.put(mail); attrs.put(givenname); attrs.put(name); attrs.put(cn); attrs.put(surname); attrs.put(pwd); ctx.createSubcontext("uid=" + username + "," + usersContainer, attrs); ctx.close(); return "success"; } catch (NameAlreadyBoundException e) { System.out.println(e); return "User already exists."; } catch (NamingException e) { System.out.println(e); return "Woops! Something went wrong!"; } }

Reset Password

public String resetPassword(String username) { SecureRandom random = new SecureRandom(); String randomString = new BigInteger(130, random).toString(32); String newPassword = randomString.substring(0, 8); String ldapUri = ldapServer; String admindn = "cn=Admin"; String admincred = ldapPassword; String usersContainer = "ou=people,ou=myrealm,dc=" + ldapDC; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldapUri); env.put(Context.SECURITY_PRINCIPAL, admindn); env.put(Context.SECURITY_CREDENTIALS, admincred); try { InitialDirContext initialContext = new InitialDirContext(env); DirContext ctx = initialContext; ModificationItem[] mods = new ModificationItem[1]; Attribute mod0 = new BasicAttribute("userpassword", newPassword); mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, mod0); ctx.modifyAttributes("uid=" + username + "," + usersContainer, mods); ctx.close(); return newPassword; } catch (NamingException e) { System.out.println(e); return ""; } }

Check Authenticated

public boolean isAuthenticated(String username, String password) { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldapServer); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "uid=" + username + ",ou=people,ou=myrealm,dc=" + ldapDC); env.put(Context.SECURITY_CREDENTIALS, password); try{ DirContext ctx = new InitialDirContext(env); String authorised = ctx.AUTHORITATIVE; ctx.close(); return true; }catch(NamingException e){ System.out.println(e); return false; } }