如何使Servlet识别调用者JSP和会话

时间:2012-04-30 01:03:31

标签: java jsp servlets dygraphs

我正在使用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中指定的文件。

在这个webapp中有一个loginServlet,如果用户只是复制粘贴为Dygraph提供的URL,我希望能够避免使用fileservlet来提供文件。 FileServlet已经能够从该会话中获取会话和loggeduser,但我不知道如何检测调用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方法调用它,因此简单的用户副本 - 面食无法通过“origin-JSP”检查。

顺便说一句,我是从使用Struts2回来的,这对于这个应用来说太复杂了。为了方便和简单的servlet和JSP,我放弃了它。

2 个答案:

答案 0 :(得分:2)

使用filter检查用户角色。在此之前,需要采取任何重要措施来检查用户是否有权采取此行动。这是任务servlet过滤器。

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

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>

答案 1 :(得分:2)

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