【问题标题】:User must pass through action first before rendering JSP用户在渲染 JSP 之前必须先通过操作
【发布时间】:2015-04-10 07:14:27
【问题描述】:

我的操作类通常会有一个 action 字段变量,该变量在 execute() 方法中分配了一个值:

public class MyAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    private String action;

    @Override
    public String execute() throws Exception {      
        action = "true";

        // code here

        return SUCCESS;
    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }
}

在 JSP 中,我检查 action 变量(现在作为请求传递)是否为 null。如果是null,会重定向到action类,否则会继续渲染页面:

<head>
    <c:if test="${action == null}">
        <c:redirect url="myaction" />
    </c:if>
</head>

我这样做是为了确保用户在尝试非法跳转到 JSP 时首先通过该操作。

它按预期工作,但还有其他优雅的方法吗?

【问题讨论】:

  • 你做错了。只需将您的 jsp-s 放在 WEB-INF 下即可。
  • 只能通过操作访问页面。重定向不是问题。
  • @ohtph 一般来说,客户端不应该直接请求 JSP 页面。 WEB-INF 下的 JSP 页面可供 服务器 访问,例如,当它们由操作呈现时。当容器已经为您执行此操作并且您所要做的就是遵循标准的最佳实践时,编写代码以防止直接访问 JSP 是一个非常奇怪的想法。
  • @AleksandrM 和 Dave:由于actionless results,在使用 Convention 插件时,仅将 JSP 置于 WEB-INF 下是行不通的。相关:stackoverflow.com/q/29185042/1654265
  • @ohtph 如果他们在 WEB-INF 下,他们可以猜到他们想要的一切——他们无法访问它们。 “正确的行动”在很大程度上取决于你实际在做什么,而 IMO,如果他们已经在猜测,试图“帮助”他们基本上只是在引导最终被误导的人。

标签: java jsp struts2


【解决方案1】:

从动作上下文中获取名称。它具有当前动作的动作映射,其中包括动作名称。您还应该知道,Struts 标记在没有操作上下文的情况下无法工作,但只有在 JSP 与映射过滤器一起使用时才能工作。

<c:set var="actionName"><s:property value="%{#context['struts.actionMapping'].name}"/></c:set>
action name: ${actionName}<br/>
<c:if test="${empty actionName}">
  <c:redirect url="myaction" />
</c:if>

编辑:

防止直接访问jsp页面的示例过滤器

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

  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    if (request.getRequestURI().endsWith(".jsp")) {
      DispatcherType dt = request.getDispatcherType();
      if (dt == DispatcherType.FORWARD || dt == DispatcherType.INCLUDE)
        //handle dispatcher results
        filterChain.doFilter(request, response);
      else
        response.sendError(404, "Direct access to JSP");
    } else {
        //let's struts handle the request
        filterChain.doFilter(request, response);

    }

  }

  @Override
  public void destroy() {

  }
}

【讨论】:

  • 嗨 RomanC,我可以在动作之前调用拦截器。 JSP 有类似的东西吗?在渲染 JSP 之前我可以调用什么来确保它首先通过操作?
  • 你可以调用过滤器。
  • 你也可以发布一个例子吗?
  • 经过深思熟虑后,我意识到将 JSP 保留在 WEB-INF 下是非常可维护的,如前所述。当用户已经在猜测 JSP 名称时“帮助”用户(正如我最初的意图)只会鼓励滥用(好提示)。我赞成这个答案。 :)
  • 这是我的问题。我知道我的意思(建议 WEB-INF 的人也是如此)。但是,每当您的答案未被接受时,您似乎总是会遇到问题。在我确认它们有效之前,我不会盲目地接受答案,不是因为我不相信解决方案,而是我希望能够证明我接受的信息。我(还)不能接受这个,因为我没有在需要的时候测试它。如果这就是你一直威胁我的原因,你可以无视我的问题。
猜你喜欢
  • 1970-01-01
  • 2021-11-29
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多