如何在Liferay Portal设置条款页为默认着陆页并基于Session实现强制确认
问题与解决方案:Liferay Portal登录后条款验证需求
需求说明
- 用户登录Liferay Portal成功后,需重定向至包含公司条款文本与「Accept」按钮的页面
- 必须点击按钮方可访问应用,未点击则无法进入
- 点击按钮后在Session中设置
TERMS_ACCEPTED=true,且刷新浏览器无法绕过验证
尝试方案
在portal_normal.vm中编写的代码:
#if (!$is_login_page) #if (!$is_signed_in) <script> window.location= '/c/portal/login'; </script> #else #if(!$is_accepted) <p id="terms-para" style=""> CLICK THE ACCEPT BUTTON TO PROCEED. </p> <button id="accept-button">Accept</button> <div id ="terms-footer" ></div> </div> <script> var acceptButton = document.getElementById("accept-button"); acceptButton.addEventListener('click', ()=>{ #set ($is_accepted = $request.getSession().setAttribute("TERMS_ACCEPTED", true)) window.location.reload(); }); </script>
遇到的问题
- 刷新页面时,无需点击Accept按钮,Session属性
TERMS_ACCEPTED就会被设为true - 用Cookie可实现功能,但Cookie可被浏览器编辑,希望仅通过Session实现
解答
1. 能否通过portal_normal.vm实现需求?
不行。因为Velocity模板(.vm文件)是服务器端渲染的,你写的#set ($is_accepted = $request.getSession().setAttribute("TERMS_ACCEPTED", true))会在页面加载时就执行,完全不受前端按钮点击事件的控制——这就是刷新页面Session属性自动被设置的根本原因。前端JS运行在浏览器端,无法触发服务器端的Velocity代码执行,两者运行时机和环境完全分离。
2. 制作独立JSP页面并设为默认着陆页的实施步骤
步骤1:创建条款验证JSP页面
在Liferay自定义模块或主题的WEB-INF/jsp目录下创建terms-validation.jsp,代码示例:
<%@ page import="javax.servlet.http.HttpSession" %> <%@ taglib prefix="liferay-portlet" uri="http://liferay.com/tld/portlet" %> <%@ taglib prefix="liferay-theme" uri="http://liferay.com/tld/theme" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <liferay-theme:defineObjects /> <% HttpSession session = request.getSession(); Boolean termsAccepted = (Boolean) session.getAttribute("TERMS_ACCEPTED"); // 已接受条款则重定向到主页 if (termsAccepted != null && termsAccepted) { response.sendRedirect("/web/your-site-home"); return; } %> <!DOCTYPE html> <html> <head> <title>公司条款确认</title> </head> <body> <h1>公司使用条款</h1> <div style="margin: 20px 0;"> <!-- 替换为实际条款文本 --> <p>请阅读并接受以下条款:...</p> </div> <form action="${request.contextPath}/terms/accept" method="post"> <button type="submit">Accept</button> </form> </body> </html>
步骤2:创建处理接受请求的Servlet
自定义Servlet来处理按钮提交,完成Session属性设置:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet("/terms/accept") public class TermsAcceptServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.setAttribute("TERMS_ACCEPTED", true); // 重定向至站点主页 response.sendRedirect("/web/your-site-home"); } }
步骤3:设置默认着陆页
- 登录Liferay后台,进入控制面板 → 站点 → 站点设置
- 左侧菜单选择URL → 着陆页
- 将着陆页设置为
terms-validation.jsp对应的访问URL(例如/terms-validation,需确保JSP可通过路由直接访问,或通过portlet配置映射)
步骤4:添加全局拦截过滤器
为防止用户直接跳转至其他页面,添加全局过滤器验证Session状态:
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebFilter("/*") public class TermsValidationFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; HttpSession session = req.getSession(false); String requestURI = req.getRequestURI(); // 排除无需验证的页面/资源 if (requestURI.contains("/c/portal/login") || requestURI.contains("/terms-validation") || requestURI.contains("/terms/accept") || requestURI.contains("/o/") || requestURI.contains("/css/") || requestURI.contains("/js/")) { chain.doFilter(request, response); return; } // 验证登录状态与条款接受状态 if (session != null && session.getAttribute("USER_INFO") != null) { // 已登录用户 Boolean termsAccepted = (Boolean) session.getAttribute("TERMS_ACCEPTED"); if (termsAccepted == null || !termsAccepted) { // 未接受条款则重定向至验证页面 res.sendRedirect("/terms-validation"); return; } } chain.doFilter(request, response); } }
步骤5:打包部署
将上述JSP、Servlet、Filter打包为Liferay模块(WAR或JAR格式),部署至Liferay服务器即可生效。
内容的提问来源于stack exchange,提问作者user18781702
相关产品推荐
相关产品推荐

