MVC架构下:如何检测调用控制器Servlet的JSP页面?
检测调用通用Servlet的JSP页面的几种方法
这是MVC架构里很常见的需求,我整理了几个实用的方案,你可以根据具体场景选择:
隐藏表单字段(最推荐)
在每个JSP的表单里添加一个隐藏输入字段,明确标记当前页面的标识:<!-- userForm.jsp中的表单示例 --> <form action="CommonController" method="post"> <input type="hidden" name="sourcePage" value="userForm.jsp"> <!-- 其他业务表单字段 --> <button type="submit">提交请求</button> </form>然后在你的通用Servlet里,直接获取这个参数做判断:
String sourcePage = request.getParameter("sourcePage"); if ("userForm.jsp".equals(sourcePage)) { // 处理来自userForm.jsp的请求逻辑 } else if ("productForm.jsp".equals(sourcePage)) { // 处理来自productForm.jsp的请求逻辑 }优点:完全可控,不受浏览器设置或请求方式限制,可靠性最高,是生产环境最常用的方案。
URL请求参数(适合GET请求场景)
如果是通过<a>标签跳转发起的GET请求,可以在URL里携带来源页面的参数:<!-- productList.jsp中的链接示例 --> <a href="CommonController?source=productList.jsp">点击处理商品列表请求</a>Servlet里同样通过
request.getParameter("source")获取标识,逻辑和隐藏字段一致,适合无表单的跳转场景。HTTP Referer请求头(仅作辅助手段)
你可以通过请求头里的Referer字段获取来源URL,再从中解析出JSP页面名称:String referer = request.getHeader("Referer"); if (referer != null) { // 从URL中截取最后一段作为页面标识 String sourcePage = referer.substring(referer.lastIndexOf("/") + 1); }注意:这个方法可靠性较低——部分浏览器可能禁用Referer头,用户直接在地址栏输入Servlet地址时也不会有该字段,所以只能作为补充方案,不能单独依赖。
会话属性(适合页面跳转场景)
如果是通过request.getRequestDispatcher().forward()或<jsp:forward>跳转至Servlet,可以在跳转前的JSP里设置会话属性:<%-- cart.jsp中的跳转逻辑示例 --%> <% session.setAttribute("sourcePage", "cart.jsp"); %> <jsp:forward page="CommonController" />然后在Servlet中读取该属性,用完记得及时清除避免混淆:
String sourcePage = (String) request.getSession().getAttribute("sourcePage"); // 执行对应逻辑后清除属性 request.getSession().removeAttribute("sourcePage");缺点:会话属性会在整个会话周期留存,必须手动清除,否则可能导致后续请求的判断错误,适合特定的跳转场景。
内容的提问来源于stack exchange,提问作者muskan singhal
相关产品推荐
相关产品推荐

