想要自己写一个login和editor页面,可以让用户直接登录就可以编辑某个页面。从网上找到了一段登陆的代码:
<%@ page session="true" import="org.opencms.main.*, org.opencms.jsp.*,org.opencms.file.*, java.lang.String" %> <% CmsJspActionElement cms = new CmsJspActionElement(pageContext,request,response); String user = request.getParameter("user"); String password = request.getParameter("password"); String url = request.getParameter("url"); if(url==null || url.length()==0 || url.equalsIgnoreCase("null")) url = ""; boolean loginFailed = false; //form was submitted => try to log in and redirect to given URl if((user != null) && (user.length() != 0)) { try{ CmsObject cmsObject = cms.getCmsObject(); cmsObject.loginUser(user, password); CmsProject cmsproject = cmsObject.readProject("Offline"); cmsObject.getRequestContext().setCurrentProject(cmsproject); cmsObject.getRequestContext().setSiteRoot("/sites/default/"); //login successful - redirect to given URL response.sendRedirect(url); } catch ( CmsException e ) { loginFailed = true; } } %> <% //no user submitted or login failed => show login form if(user==null || user.length()==0 || loginFailed) { %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>Frontend login</title> </head> <body onload="document.forms[0].elements[0].focus()"> <% if (loginFailed) { %> <em>Login failed!</em> <% } %> <h1>please login:</h1> <form method="post" action="<%=cms.info("opencms.url")%>"> <input type="hidden" name="url" value="<%=url%>" /> <p>username: <input name="user" /></p> <p>password: <input name="password" type="password" /></p> <p><input type="submit" /></p> </form> </body> </html> <% } %>登陆成功了,可是opencms却不让我编辑页面,只能编辑/site/default/下的资源。一开始以为是
cmsObject.getRequestContext().setSiteRoot("/sites/default/");
引起的,可是把root设置到'/site/mysite/'却还是不行,没办法,我只好调试opencms的源代码,发现每次跳转到新的页面,site root 都会被定到"/site/default/",而我要的文件在/site/mysite/下面,为什么会这样呢?后来开到org.opencms.workplace.CmsLoginHelper.login方法后发现原来少了这段代码:
// only for workplace users, so that direct edit works if (OpenCms.getRoleManager().hasRole(getCms(), CmsRole.WORKPLACE_USER)) { // get / create the workplace settings CmsWorkplaceSettings wpSettings = getSettings(); if (wpSettings == null) { // create the settings object wpSettings = new CmsWorkplaceSettings(); wpSettings = initWorkplaceSettings(getCms(), wpSettings, false); } // set the settings for the workplace wpSettings.setSite(getCms().getRequestContext().getSiteRoot()); wpSettings.setProject(getCms().getRequestContext().currentProject().getUuid()); wpSettings.setUser(getCms().getRequestContext().currentUser()); HttpSession session = getJsp().getRequest().getSession(true); storeSettings(session, wpSettings); }
原来我没有把siteRoot设置到session里面,所以每次条到新的jsp页面siteRoot就会被重置了。希望有这方面需求的兄弟看完可以有点启示,不用再挣扎了。
这里是我写的代码:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="org.opencms.jsp.*, org.opencms.main.*, org.opencms.file.*, java.lang.String, org.opencms.workplace.*" %> <% String uri = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort(); String userName = request.getParameter("name"); String password = request.getParameter("password"); String projectName = "Offline"; try{ new CmsLoginHelper(pageContext,request,response).login(userName, password, projectName, "/sites/mysite", "news/news_1.html"); response.sendRedirect("/opencms/opencms/system/workplace/editors/editor.jsp?resourcelist=&resource=news%2Fnews_1.html"); } catch (Exception e) { System.out.println("Can' t login user " + userName + ": " + e); e.printStackTrace(); // Redirect to error-Site response.sendRedirect(uri+request.getParameter("errorUri")); } %>