Gjort alla länkar till bookmarkable och sett till att endast ha defaultkonstruktorer på sidorna. Fixat exceptions och sidor man kan kasta för 404 och om man inte har rättigheter på något som man inte kan kolla med befintliga mekanismer. Fixat diverse buggar i templatessidorna

git-svn-id: svn://svn.dsv.su.se/scipro/scipro/trunk@540 73ecded7-942e-4092-bab0-0e58ef0ee984
This commit is contained in:
dan-kjel 2011-03-30 17:31:06 +00:00
parent 755c4be7ef
commit e1ae365d77
23 changed files with 296 additions and 109 deletions

@ -8,15 +8,16 @@ import org.apache.wicket.ResourceReference;
import org.apache.wicket.Response;
import org.apache.wicket.Session;
import org.apache.wicket.authorization.strategies.CompoundAuthorizationStrategy;
import org.apache.wicket.injection.web.InjectorHolder;
import org.apache.wicket.protocol.http.WebApplication;
import org.odlabs.wiquery.ui.themes.IThemableApplication;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import se.su.dsv.scipro.basepages.DemoPage;
import se.su.dsv.scipro.basepages.SystemSettingsPage;
import se.su.dsv.scipro.knol.resource.page.BookmarkableResourcePage;
import se.su.dsv.scipro.basepages.SystemSettingsPage;
import se.su.dsv.scipro.basepages.errorpages.AccessDeniedPage;
import se.su.dsv.scipro.basepages.errorpages.NotFoundPage;
import se.su.dsv.scipro.knol.resource.page.BookmarkableResourcePage;
import se.su.dsv.scipro.knol.resource.page.ResourcePage;
import se.su.dsv.scipro.loginlogout.pages.LoginPage;
import se.su.dsv.scipro.loginlogout.pages.LogoutPage;
@ -28,15 +29,17 @@ import se.su.dsv.scipro.project.pages.ProjectStartPage;
import se.su.dsv.scipro.repository.RepositoryApplication;
import se.su.dsv.scipro.repository.pages.SysAdminFilePage;
import se.su.dsv.scipro.schedule.pages.EventPage;
import se.su.dsv.scipro.schedule.pages.ScheduleGeneratorPage;
import se.su.dsv.scipro.schedule.pages.SchedulePlannerPage;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplateDetailsPage;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplatesAdminPage;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplatesEditorAdminPage;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplatesEditorSupervisorPage;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplatesSupervisorPage;
import se.su.dsv.scipro.security.auth.ComponentSecurityLogger;
import se.su.dsv.scipro.security.auth.MetaDataActionStrategy;
import se.su.dsv.scipro.security.auth.RoleBasedAuthorizationStrategy;
import se.su.dsv.scipro.wiquery.themes.ThemeResourceReference;
import se.su.dsv.scipro.workerthreads.Scheduler;
/**
* Application object for your web application. If you want to run this application without deploying, run the Start class.
@ -95,17 +98,28 @@ public class SciProApplication extends RepositoryApplication implements IThemabl
mountBookmarkablePage("res", BookmarkableResourcePage.class);
mountBookmarkablePage("demo", DemoPage.class);
mountBookmarkablePage("project/schedule/event", EventPage.class);
mountBookmarkablePage("project/schedule/generator", ScheduleGeneratorPage.class);
mountBookmarkablePage("templates/details", ScheduleTemplateDetailsPage.class);
mountBookmarkablePage("admin/templates", ScheduleTemplatesAdminPage.class);
mountBookmarkablePage("supervisor/templates", ScheduleTemplatesSupervisorPage.class);
mountBookmarkablePage("admin/templates/editor", ScheduleTemplatesEditorAdminPage.class);
mountBookmarkablePage("supervisor/templates/editor", ScheduleTemplatesEditorSupervisorPage.class);
/*
* Error pages
*/
mountBookmarkablePage("404", NotFoundPage.class);
mountBookmarkablePage("403", AccessDeniedPage.class);
getApplicationSettings().setAccessDeniedPage(AccessDeniedPage.class);
addComponentInstantiationListener(getSpringInjector());
CompoundAuthorizationStrategy cas = new CompoundAuthorizationStrategy();
cas.add(new RoleBasedAuthorizationStrategy());
cas.add(new MetaDataActionStrategy());
getSecuritySettings().setAuthorizationStrategy(cas);
//getResourceSettings().setThrowExceptionOnMissingResource(false);
//getResourceSettings().addStringResourceLoader(new JpaStringResourceLoader());
getSecuritySettings().setUnauthorizedComponentInstantiationListener(new ComponentSecurityLogger());

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<div class="span-22 last append-bottom">
<h3>403: Forbidden</h3>
<span>You don't have access to the requested page</span>
</div>
</wicket:extend>
</body>
</html>

@ -0,0 +1,27 @@
package se.su.dsv.scipro.basepages.errorpages;
import javax.servlet.http.HttpServletResponse;
import se.su.dsv.scipro.basepages.MenuPage;
public class AccessDeniedPage extends MenuPage {
public AccessDeniedPage(){}
@Override
protected void configureResponse() {
super.configureResponse();
getWebRequestCycle().getWebResponse().getHttpServletResponse().setStatus(HttpServletResponse.SC_FORBIDDEN);
}
@Override
public boolean isVersioned() {
return false;
}
@Override
public boolean isErrorPage() {
return true;
}
}

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<div class="span-22 last append-bottom">
<h3>404: Page not found</h3>
<span>The requested page was not found</span>
</div>
</wicket:extend>
</body>
</html>

@ -0,0 +1,34 @@
package se.su.dsv.scipro.basepages.errorpages;
import javax.servlet.http.HttpServletResponse;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import se.su.dsv.scipro.basepages.MenuPage;
public class NotFoundPage extends MenuPage {
public NotFoundPage(final PageParameters pp){
}
public NotFoundPage(){
this(new PageParameters());
}
@Override
protected void configureResponse() {
super.configureResponse();
getWebRequestCycle().getWebResponse().getHttpServletResponse().setStatus(HttpServletResponse.SC_NOT_FOUND);
}
@Override
public boolean isVersioned() {
return false;
}
@Override
public boolean isErrorPage() {
return true;
}
}

@ -32,42 +32,23 @@ public class MainMenuPanel extends Panel {
/*
* Project
*/
add(new Link<Void>("projectScheduleLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
PageParameters pp = new PageParameters();
pp.add("pid", String.valueOf(SciProSession.get().getActiveProject().getId()));
setResponsePage(SchedulePlannerPage.class, pp);
}
});
final PageParameters projectScheduleParams = new PageParameters();
if(SciProSession.get().getActiveProject() != null){
projectScheduleParams.put("pid", String.valueOf(SciProSession.get().getActiveProject().getId()));
}
add(new BookmarkablePageLink<SchedulePlannerPage>("projectScheduleLink", SchedulePlannerPage.class, projectScheduleParams));
/*
* Supervisor
*/
add(new Link<Void>("supervisorTemplatesLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
setResponsePage(ScheduleTemplatesSupervisorPage.class);
}
});
add(new BookmarkablePageLink<ScheduleTemplatesSupervisorPage>("supervisorTemplatesLink", ScheduleTemplatesSupervisorPage.class));
/*
* Admin
*/
add(new Link<Void>("sysadminTemplatesLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
setResponsePage(ScheduleTemplatesAdminPage.class);
}
});
add(new BookmarkablePageLink<ScheduleTemplatesAdminPage>("sysadminTemplatesLink", ScheduleTemplatesAdminPage.class));
}
private BookmarkablePageLink<Void> getMenuLink(String id, final Class<? extends Page> targetPageClass, final Class<? extends Page> containerClass){

@ -0,0 +1,15 @@
package se.su.dsv.scipro.exceptions;
import org.apache.wicket.Component;
import org.apache.wicket.authorization.UnauthorizedInstantiationException;
public class AccessDeniedException extends UnauthorizedInstantiationException {
private static final long serialVersionUID = 1L;
public AccessDeniedException(final Component comp){
super(comp.getClass());
System.out.println("Access denied to page "+ comp.getClass().getCanonicalName());
//TODO: Possibly log exception...
}
}

@ -0,0 +1,18 @@
package se.su.dsv.scipro.exceptions;
import org.apache.wicket.Page;
import org.apache.wicket.RestartResponseAtInterceptPageException;
import org.apache.wicket.WicketRuntimeException;
import se.su.dsv.scipro.basepages.errorpages.NotFoundPage;
public class PageNotFoundException extends WicketRuntimeException {
private static final long serialVersionUID = 1L;
public PageNotFoundException(final Page page){
throw new RestartResponseAtInterceptPageException(NotFoundPage.class);
//TODO: Possibly log something...
}
}

@ -49,6 +49,7 @@ import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateDetailsPanel;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateFilterPanel;
import se.su.dsv.scipro.schedule.templates.panels.models.ScheduleTemplatesModel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
import se.su.dsv.scipro.util.ScheduleGenerator;
import se.su.dsv.scipro.util.ScheduleGeneratorResult;
import se.su.dsv.scipro.util.WiQueryCoreEffectsHelper;
@ -69,6 +70,10 @@ public class ScheduleGeneratorPage extends SchedulePage {
public ScheduleGeneratorPage(final PageParameters pp){
super(pp);
if(project.getProjectSchedule() != null){
setResponsePage(SchedulePlannerPage.class, pp);
}
templateModel = new ScheduleTemplatesModel();
dialog = new Dialog("dialog");
@ -281,7 +286,7 @@ public class ScheduleGeneratorPage extends SchedulePage {
projectEventDao.save(e);
}
final PageParameters pp = new PageParameters();
pp.put("id", project.getId());
pp.put("pid", project.getId());
setResponsePage(SchedulePlannerPage.class, pp);
}
});

@ -1,15 +1,15 @@
package se.su.dsv.scipro.schedule.pages;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.data.dao.interfaces.ProjectDao;
import se.su.dsv.scipro.data.dataobjects.Project;
import se.su.dsv.scipro.data.dataobjects.User;
import se.su.dsv.scipro.exceptions.AccessDeniedException;
import se.su.dsv.scipro.exceptions.PageNotFoundException;
import se.su.dsv.scipro.project.pages.ProjectPage;
import se.su.dsv.scipro.schedule.panels.SchedulePlannerPanel;
import se.su.dsv.scipro.security.auth.roles.Roles;
public abstract class SchedulePage extends ProjectPage {
@ -28,7 +28,12 @@ public abstract class SchedulePage extends ProjectPage {
}
if(project == null || pid == null){
//TODO: 404
throw new PageNotFoundException(this);
}
if(!SciProSession.get().authorizedForRole(Roles.SYSADMIN) &&
!projectDao.isPartOf(SciProSession.get().getUser(), project)){
throw new AccessDeniedException(this);
}
}
}

@ -98,7 +98,7 @@ public class SchedulePlannerPanel extends Panel implements ISchedulePlannerPanel
@Override
public void onClick() {
final PageParameters pp = new PageParameters();
pp.put("id", project.getId());
pp.put("pid", project.getId());
setResponsePage(ScheduleGeneratorPage.class, pp);
}
};
@ -115,7 +115,7 @@ public class SchedulePlannerPanel extends Panel implements ISchedulePlannerPanel
ps.setProject(project);
ps = projectScheduleDao.save(ps);
final PageParameters pp = new PageParameters();
pp.put("id", project.getId());
pp.put("pid", project.getId());
setResponsePage(SchedulePlannerPage.class, pp);
}
};

@ -6,26 +6,26 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.basepages.MenuPage;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.exceptions.PageNotFoundException;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateDetailsPanel;
import se.su.dsv.scipro.security.auth.Authorization;
@Authorization(requiresLoggedInUser=false)
public class ScheduleTemplateDetailsPage extends MenuPage {
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
public ScheduleTemplateDetailsPage(final PageParameters pp){
Long id = pp.getAsLong("id");
Long id = pp.getAsLong("tid");
if(id == null){
//TODO: 404
throw new PageNotFoundException(this);
}
ScheduleTemplate s = scheduleTemplateDao.load(id);
if(s == null){
//404
throw new PageNotFoundException(this);
}
add(new ScheduleTemplateDetailsPanel("scheduleTemplateDetailsPanel", s));

@ -1,33 +0,0 @@
package se.su.dsv.scipro.schedule.templates.pages;
import org.apache.wicket.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.basepages.MenuPage;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateFormPanel;
import se.su.dsv.scipro.security.auth.Authorization;
@Authorization(requiresLoggedInUser=false)
public class ScheduleTemplateEditorPage extends MenuPage {
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
public ScheduleTemplateEditorPage(final PageParameters pp, Long id, final boolean isSysAdminView){
super(pp);
ScheduleTemplate st = null;
if(id != null){
st = scheduleTemplateDao.load(id);
}
add(new ScheduleTemplateFormPanel("scheduleTemplateFormPanel", st, isSysAdminView));
}
public ScheduleTemplateEditorPage(final boolean isSysAdminView){
this(new PageParameters(), null, isSysAdminView);
}
}

@ -0,0 +1,21 @@
package se.su.dsv.scipro.schedule.templates.pages;
import org.apache.wicket.PageParameters;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateFormPanel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
@Authorization(authorizedRoles={Roles.SYSADMIN})
public class ScheduleTemplatesEditorAdminPage extends ScheduleTemplatesEditorPage {
public ScheduleTemplatesEditorAdminPage(final PageParameters pp) {
super(pp);
add(new ScheduleTemplateFormPanel("scheduleTemplateFormPanel", template, true));
}
public ScheduleTemplatesEditorAdminPage(){
this(new PageParameters());
}
}

@ -0,0 +1,8 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<wicket:child />
</wicket:extend>
</body>
</html>

@ -0,0 +1,35 @@
package se.su.dsv.scipro.schedule.templates.pages;
import org.apache.wicket.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import se.su.dsv.scipro.SciProSession;
import se.su.dsv.scipro.basepages.MenuPage;
import se.su.dsv.scipro.data.dao.interfaces.ScheduleTemplateDao;
import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.exceptions.AccessDeniedException;
import se.su.dsv.scipro.exceptions.PageNotFoundException;
public abstract class ScheduleTemplatesEditorPage extends MenuPage {
@SpringBean
private ScheduleTemplateDao scheduleTemplateDao;
protected ScheduleTemplate template = null;
public ScheduleTemplatesEditorPage(final PageParameters pp){
super(pp);
Long id = pp.getAsLong("tid");
if(id != null){
template = scheduleTemplateDao.load(id);
}
if(template != null && !SciProSession.get().getUser().equals(template.getCreator())){
throw new AccessDeniedException(this);
}
}
}

@ -0,0 +1,8 @@
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body>
<wicket:extend>
<div wicket:id="scheduleTemplateFormPanel"></div>
</wicket:extend>
</body>
</html>

@ -0,0 +1,21 @@
package se.su.dsv.scipro.schedule.templates.pages;
import org.apache.wicket.PageParameters;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplateFormPanel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
@Authorization(authorizedRoles={Roles.EMPLOYEE})
public class ScheduleTemplatesEditorSupervisorPage extends ScheduleTemplatesEditorPage {
public ScheduleTemplatesEditorSupervisorPage(final PageParameters pp) {
super(pp);
add(new ScheduleTemplateFormPanel("scheduleTemplateFormPanel", template, false));
}
public ScheduleTemplatesEditorSupervisorPage(){
this(new PageParameters());
}
}

@ -4,7 +4,10 @@ import org.apache.wicket.PageParameters;
import se.su.dsv.scipro.basepages.MenuPage;
import se.su.dsv.scipro.schedule.templates.panels.ScheduleTemplatePanel;
import se.su.dsv.scipro.security.auth.Authorization;
import se.su.dsv.scipro.security.auth.roles.Roles;
@Authorization(authorizedRoles={Roles.EMPLOYEE})
public class ScheduleTemplatesSupervisorPage extends MenuPage {
public ScheduleTemplatesSupervisorPage(final PageParameters pp){

@ -61,7 +61,7 @@ public class ScheduleTemplateDetailsPanel extends Panel {
final PageParameters pp = new PageParameters();
pp.put("id", template.getId());
pp.put("tid", template.getId());
BookmarkablePageLink<ScheduleTemplateDetailsPage> directLink = new BookmarkablePageLink<ScheduleTemplateDetailsPage>("directLink", ScheduleTemplateDetailsPage.class, pp);
add(directLink);

@ -1,19 +1,15 @@
package se.su.dsv.scipro.schedule.templates.panels;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.navigation.paging.AjaxPagingNavigator;
import org.apache.wicket.datetime.PatternDateConverter;
import org.apache.wicket.datetime.markup.html.basic.DateLabel;
import org.apache.wicket.extensions.ajax.markup.html.AjaxIndicatorAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.PageableListView;
@ -29,10 +25,11 @@ import se.su.dsv.scipro.data.dataobjects.ScheduleTemplate;
import se.su.dsv.scipro.icons.ActionIcon;
import se.su.dsv.scipro.icons.AjaxActionIcon;
import se.su.dsv.scipro.icons.ImageIcon;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplateEditorPage;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplatesEditorAdminPage;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplatesEditorSupervisorPage;
import se.su.dsv.scipro.schedule.templates.pages.ScheduleTemplatesEditorPage;
import se.su.dsv.scipro.schedule.templates.panels.models.ScheduleTemplatesModel;
import se.su.dsv.scipro.util.JavascriptEventConfirmation;
import se.su.dsv.scipro.util.SelectOption;
import se.su.dsv.scipro.util.WiQueryCoreEffectsHelper;
public class ScheduleTemplatePanel extends Panel {
@ -58,10 +55,11 @@ public class ScheduleTemplatePanel extends Panel {
private WebMarkupContainer templateListContainer;
private ScheduleTemplatesModel templateModel;
private WebMarkupContainer templateDetailsContainer;
private boolean isSysAdminView = false;
public ScheduleTemplatePanel(String id, final boolean isSysAdminView) {
super(id);
this.isSysAdminView = isSysAdminView;
templateModel = new ScheduleTemplatesModel();
templateDetailsContainer = new WebMarkupContainer("templateDetailsContainer");
@ -91,17 +89,8 @@ public class ScheduleTemplatePanel extends Panel {
item.add(new DateLabel("templateUpdated", new Model<Date>(s.getLastModified()), pc));
ImageIcon editIcon = new ImageIcon("editIcon", ImageIcon.ICON_EDIT);
Link<Void> editLink = new Link<Void>("editLink"){
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
setResponsePage(new ScheduleTemplateEditorPage(new PageParameters(), s.getId(), isSysAdminView));
}
@Override
public boolean isVisible(){
return isSysAdminView || s.getCreator().equals(SciProSession.get().getUser());
}
};
BookmarkablePageLink<ScheduleTemplatesEditorPage> editLink = getEditorLink("editLink", s.getId());
editLink.setVisible(isSysAdminView || s.getCreator().equals(SciProSession.get().getUser()));
editLink.add(editIcon);
item.add(editLink);
@ -159,20 +148,25 @@ public class ScheduleTemplatePanel extends Panel {
templateListContainer.add(templateList);
add(templateListContainer);
Link<Void> createNewLink = new Link<Void>("createNew"){
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
setResponsePage(new ScheduleTemplateEditorPage(isSysAdminView));
}
};
createNewLink.add(new ActionIcon("createNewIcon", ActionIcon.ICON_ADD, "Create new"));
BookmarkablePageLink<ScheduleTemplatesEditorPage> createNewLink = getEditorLink("createNew", null);
createNewLink.add(new ImageIcon("createNewIcon", ImageIcon.ICON_ADD, "Create new"));
add(createNewLink);
add(templateDetailsContainer);
}
public void reloadTemplateList(){
templateModel.reloadModel();
}
private BookmarkablePageLink<ScheduleTemplatesEditorPage> getEditorLink(String id, Long tid){
PageParameters pp = new PageParameters();
if(tid != null){
pp.put("tid", tid);
}
if(isSysAdminView){
return new BookmarkablePageLink<ScheduleTemplatesEditorPage>(id, ScheduleTemplatesEditorAdminPage.class, pp);
} else {
return new BookmarkablePageLink<ScheduleTemplatesEditorPage>(id, ScheduleTemplatesEditorSupervisorPage.class, pp);
}
}
}

@ -28,8 +28,15 @@
<filter-mapping>
<filter-name>wicket.WicketWarp</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/404</location>
</error-page>
<!-- Session timeout set to 8 hours -->
<session-config>
<session-timeout>480</session-timeout>
@ -39,7 +46,7 @@
<context-param>
<param-name>configuration</param-name>
<param-value>development</param-value>
<!-- param-value>deployment</param-value-->
<!-- <param-value>deployment</param-value>-->
</context-param>