In the
How to check what objects are stored in HttpSesession entry i mentioned about how to use the
com.ibm.ws.webcontainer.httpsession.SessionInspectServlet
servlet for inspecting content of a servlet.
The
PortletSession
object is based on
HttpSession
, with difference that when you store attribute in the
PortletSession
in
PORTLET_SCOPE
, the portal server will name space that attribute and store it in the
HttpSession
, You can also set an attribute in the
PortletSession
using
APPLICATION_SCOPE
it will be stored in the
HttpSession
without any name spacing.
The side effect of this layering is we can use the same
SessionInspectionServlet
for inspecting content of a
PortletSession
.
If you want to use SessionInspectionServlet then you need to make sure that value of
enable-serving-servlets-by-class-name
is set to true in your ibm-web-ext.xmi file. By default when you create a portlet this value is set to true(You might to add a step to set
enable-serving-servlets-by-class-name
to false in your security hardening procedure). You can check this value by going to
WebSphere\wp_profile\installedApps\\.ear\Contact.war\WEB-INF\ibm-web-ext.xmi
for portlet that is installed on your portal, for the portlets that your running through the RAD just check that value in portlet application inside your workspace.
Once you ensure that
enable-serving-servlets-by-class-name
is set to true the next step would be to figure out the context path of your portlet .war file. You can do this by looking at ibm-web-ext.xmi file of the portlet that you deploy through RAD
<?xml version="1.0" encoding="UTF-8"?>
<web-ext
xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee
http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd"
version="1.0">
<reload-interval value="3"/>
<context-root uri=".ActionScopeRequestAttribute" />
<enable-directory-browsing value="true"/>
<enable-file-serving value="true"/>
<enable-reloading value="true"/>
<enable-serving-servlets-by-class-name value="true" />
</web-ext>
Value of uri attribute in
context-root
element defines the context-root of your web application.
If your portlet is installed using Portal admin console then you will have to look inside the application.xml in the
WebSphere\wp_profile\installedApps\\.ear\META-INF
folder
<?xml version="1.0" encoding="UTF-8"?><application id="Application_ID" version="5"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/application_5.xsd">
<display-name>Contact_war</display-name>
<module>
<web>
<web-uri>Contact.war</web-uri>
<context-root>/wps/PA_Contact</context-root>
</web>
</module>
</application>
The value of
context-root
is used for defining the context-root of your portlet. Once you know the context-root go to
http://localhost:10039/context-root/servlet/com.ibm.ws.webcontainer.httpsession.SessionInspectServlet
URL for inspecting value of the servlet.
In order to test this feature i did create a portlet that sets one session attribute in
PORTLET_SCOPE
and other session attribute in
APPLICATION_SCOPE
, i did hit the portlet so that the values get set in
PorteltSession
, this is how my code looks like
request.getPortletSession().setAttribute("applicationScopeAttribute",
"testValue",PortletSession.APPLICATION_SCOPE);
request.getPortletSession().setAttribute("portletScopeAttribute",
"testValue",PortletSession.PORTLET_SCOPE);
Now in the same browser i did open another tab and when i did hit the SessionInspection servlet this is what i see
As you can see the attribute stored in
APPLICATION_SCOPE
gets stored as it is. But for the attribute that is stored in
PORTLET_SCOPE
the portal server will add
javax.portlet.p.<portletwindowid>?
prefix