想要自己写一个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 οnlοad="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"));
}
%>