You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:设置默认着陆页

  1. 登录Liferay后台,进入控制面板 → 站点 → 站点设置
  2. 左侧菜单选择URL → 着陆页
  3. 将着陆页设置为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:50:25