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

如何在Liferay 6.2友好URL中将/?/替换为/-/以完成安全修复?

解决Liferay 6.2中URL替换/?/为/-/的方案

针对你提到的Liferay 6.2安全修复需求,我整理了几个实用的实现方案,你可以根据自己的代码场景选择:

1. 直接修改JSP中的href代码

既然你是通过JSP间的href传递变量,最直接的方式就是找到生成目标链接的JSP文件,手动替换URL中的分隔符。
比如原来的链接拼接代码可能是这样:

<a href="${pageContext.request.contextPath}/chi-tiet-tin/?/${actionName}/${newsId}">编辑文章</a>

直接把/?/替换为/-/即可:

<a href="${pageContext.request.contextPath}/chi-tiet-tin/-/${actionName}/${newsId}">编辑文章</a>

⚠️ 注意:如果你的链接是通过Liferay官方API(比如PortletURL、RenderURL)动态生成的,不要硬改字符串,用下面的方案更稳妥。

2. 通过Liferay URL生成API调整路径

如果链接是用Liferay的API动态生成的,你可以在生成URL后做字符串替换处理:

// 在后台Java代码或JSP脚本中生成RenderURL
RenderURL renderURL = renderRequest.createRenderURL();
// 生成原始URL后替换分隔符
String safeUrl = renderURL.toString().replace("/?/", "/-/");

然后在JSP中输出处理后的URL:

<a href="${safeUrl}">编辑文章</a>

3. 全局URL重写(Servlet Filter方案)

如果不想逐个修改JSP,或者有些链接是系统自动生成的,推荐用Servlet Filter做全局拦截重定向,既能统一处理所有旧链接,也能兼容历史访问:

步骤1:创建Filter类

public class SafeURLRewriteFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpReq = (HttpServletRequest) request;
        String requestURI = httpReq.getRequestURI();
        
        // 检测并替换URL中的不安全分隔符
        if (requestURI.contains("/?/")) {
            String newURI = requestURI.replace("/?/", "/-/");
            HttpServletResponse httpResp = (HttpServletResponse) response;
            // 用301永久重定向,兼顾SEO和兼容性
            httpResp.sendRedirect(newURI);
            return;
        }
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {}
}

步骤2:在web.xml中配置Filter

<filter>
    <filter-name>SafeURLRewriteFilter</filter-name>
    <filter-class>com.yourcompany.filter.SafeURLRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SafeURLRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

4. 调整Liferay友好URL路由(如果用了Friendly URL)

如果这个链接是Liferay友好URL生成的,需要修改路由配置:

  1. 找到liferay-portlet.xml中对应portlet的友好URL配置
  2. 打开对应的路由规则文件(比如routes.xml),把旧的路由模式中的/?/替换为/-/:
<route>
    <pattern>/chi-tiet-tin/-/{action}/{id}</pattern>
    <generated-parameter name="action">{action}</generated-parameter>
    <generated-parameter name="id">{id}</generated-parameter>
</route>

最后提醒

  • 替换完成后一定要全面测试相关功能,确保参数能正常传递到后台
  • 使用Filter方案时,要注意避免出现循环重定向的问题
  • Liferay 6.2是较旧的版本,部分API可能和新版本不兼容,代码要适配该版本的规范

内容的提问来源于stack exchange,提问作者lploc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:47:47