如何在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生成的,需要修改路由配置:
- 找到
liferay-portlet.xml中对应portlet的友好URL配置 - 打开对应的路由规则文件(比如
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
相关产品推荐
相关产品推荐

