【问题标题】:How to make Servlet recognize caller JSP and session如何让 Servlet 识别调用者 JSP 和会话
【发布时间】:2012-04-30 01:03:31
【问题描述】:

我正在使用 servlet 构建一个简单的 WebApplication。我是一个初学者,但已经尝试过学习这项技术的大部分内容。有件事我想不通。我的 servlet 之一是有用的 BalusC FileServlet

http://balusc.blogspot.mx/2007/07/fileservlet.html

它使用所需文件响应 GET 请求,干净整洁。

我使用这个 FileServlet 为 Dygraph 提供 CSV 文件

http://dygraphs.com/

我有两种类型的用户:访客和管理员。客人应该能够看到图表,但不能下载 CSV 文件。管理员应该能够做到这两点。

fileServlet 响应 URL 模式为:file/*(* 是文件名),当 Dygraph 读取 URL 中指定的文件时非常方便。

在这个 web 应用程序中构建了一个 loginServlet,如果用户只是复制粘贴为 Dygraph 提供的 URL,我希望能够避免使用 fileservlet 来提供文件。 FileServlet 已经能够从该会话中获取会话和登录用户,但我不知道如何检测调用 GET 方法的页面是什么。我希望 fileservlet 仅在从 JSP 代码中调用时才提供文件,而不是从浏览器的地址栏中。

让我解释一下:

我的意思是 - 作为访客用户 - 以下 Javascript 代码应该显示图形(FileServlet 为文件提供服务)

<div id="graphdiv2" style="width:640px; height:480px;">
<script type="text/javascript">
g2 = new Dygraph(
document.getElementById("graphdiv2"),
"${messages.rutacsv}", // path to CSV file
{
rollPeriod: 10,
showRoller: true
}
);
</script>            
</div>

变量: "${messages.rutacsv}" 被 servlet 替换为如下所示:

“文件/2012-04-20_1.csv”

因此 Dygraph 可以很好地加载文件并绘制线条。

但是,我希望 FileServlet 能够检测到用户何时在 ContextName 之后复制粘贴此 URL 并阻止它,因此只有 Dygraph 可以下载文件。

例如,如果用户在他的浏览器中输入:

http://localhost:8080/MyWebApp/file/2012-04-20_1.csv

它应该无法下载它。只有管​​理员才能做到。

现在,我想也许我应该实现 FileServlet,因此必须使用另一个 URL 模式或 POST 方法调用它,这样一个简单的用户复制意大利面就无法通过“origining-JSP”检查。

顺便说一句,我尝试使用 Struts2 回来了,这对于这个应用程序来说太复杂了。为了方便和易于使用简单的 servlet 和 JSP 进行开发,我放弃了它。

【问题讨论】:

  • 看起来你需要的是 Servlet 过滤器,它检查 url 和当前用户角色,并且只允许管理员直接下载。对于其他请求,只需返回 404 或发送重定向到 JSP。
  • 好的,但我认为我没有实现用户角色。我只在会话上执行 session.setAttribute("logonuser","username") 。我想我必须做那些额外的工作......不是吗?
  • 这取决于您的要求。如果任何登录用户可以直接下载,那么您可以检查会话中是否存在logonuser 属性,否则例如重定向到登录servlet。

标签: java jsp servlets dygraphs


【解决方案1】:

使用filter 检查用户角色。也就是说,在进行任何重要操作之前,必须检查用户是否有权执行此操作。这是任务 servlet 过滤器。

您必须在扩展javax.servlet.Filter 的类中实现方法doFilter(),如下所示:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws   IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;

    HttpSession session = req.getSession();

    String currentRole = (String) session.getAttribute("userRole");

    if ("admin".equals(currentRole)) {
         successRedirect(); 
    } else {
         failRedirect();
    }
    chain.doFilter(request, response);
}

别忘了将此过滤器映射到 web.xml 文件中所需的地址:

<filter>
    <filter-name>CheckRightAccessFilter</filter-name>
    <filter-class>yourproject.CheckRightAccessFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CheckRightAccessFilter</filter-name>
    <url-pattern>*.csv</url-pattern>
</filter-mapping>

【讨论】:

  • 这是有道理的。我必须自己实现那个“任务角色”吗?听起来我应该先实现它们,然后再使用 Servlet 过滤器。我现在存储会话的用户名,然后 FileServlet 检查它是否被命名为“admin”,就是这样。
  • 您需要在会话中设置一个变量userRolesession.setAttribute(userRole,"nameUserRole")。此操作必须在用户成功通过授权阶段后执行。因此,根据收到的信息,很清楚应该为他分配什么角色
  • 好的,现在。假设我已经实现了该方法。现在,“FileServlet”能否检测到它是由他的 URL 模式直接调用还是由另一个 JSP 调用?我的意思是,如果非管理员用户将对 FileServlet 的调用粘贴到浏览器地址栏,它应该阻止他。
  • 一旦这些用户通过映射到配置文件中给定过滤器的引用通过,过滤器将被触发并阻止不需要的用户。
【解决方案2】:

使用 servlet 过滤器检查提交的 url,并根据会话对象识别用户角色。如果找到授权用户,则可以重定向到下载页面

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2011-02-27
    • 2013-04-12
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多