2012-04-30 2 views
0

Я создаю простую WebApplication, используя сервлеты. Я новичок, но попытался изучить большую часть этой технологии. Я ничего не могу понять. Один из моих сервлетов является полезным BalusC FileServletКак заставить сервлет распознать вызывающий JSP и сеанс

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

Он отвечает на GET запросы с нужным файлом, красивым и чистым.

Я использую этот FileServlet служить CSV файлы для Dygraph

http://dygraphs.com/ 

У меня есть два типа пользователей: гости и администраторы. Гости должны иметь возможность просматривать график, но НЕ ДОЛЖНЫ СКАЧАТЬ файл CSV. Админы должны быть в состоянии сделать то и другое.

ФайлServlet отвечает на URL-шаблоны как: file/* (* - это имя файла), и это очень удобно, так как Dygraph читает файл, указанный в URL-адресе.

В этом веб-браузере есть loginServlet, и я хочу, чтобы избежать файлового хранилища для GIVE файла, если пользователь просто скопирует URL-адрес, который указан для Dygraph. FileServlet уже способен получать сеанс и loggeduser с этого сеанса, но я не знаю, как определить, какая страница была вызвана методом GET. Я хочу, чтобы файловый сервер служил файлу ТОЛЬКО при вызове из кода JSP, а не из адресной строки браузера.

Поясню немного:

Я имею в виду -как гостя USER- следующий код 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}»заменяется на сервлет для чего-то, что выглядит следующим образом:

„файл/2012-04-20_1.csv“

Так т он Dygraph загружает файл красиво и рисует линии.

НО, я хочу, чтобы FileServlet обнаруживал, когда пользователь копирует этот URL-адрес после ContextName и блокирует его, поэтому только Dygraph может загрузить файл.

Например, если пользователь в своем браузере:

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

Он не должен быть в состоянии загрузить его. Только админы должны быть в состоянии.

СЕЙЧАС, я думаю, что, возможно, я должен реализовать FileServlet, поэтому его нужно вызывать с другим шаблоном URL или с помощью метода POST, поэтому простая копия-паста пользователя не может пройти проверку «origining-JSP» ,

BTW, я возвращаюсь от попытки с Struts2, что слишком сложно для этого приложения. Я отказался от него для удобства и простоты разработки с помощью простых сервлетов и JSP.

+0

Похоже, что вам нужен фильтр сервлета, который проверяет URL-адрес и текущую роль пользователя и позволяет напрямую загружать только администраторов. Для других запросов просто верните 404 или отправьте перенаправление на JSP. –

+0

Хорошо, но я не думаю, что я реализовал роли пользователей. Я только делаю session.setAttribute («logonuser», «имя пользователя») в сеансе. Наверное, мне нужно сделать эту дополнительную работу ... не так ли? –

+0

Это зависит от ваших требований. Если какой-либо зарегистрированный пользователь может напрямую загрузить, тогда вы можете проверить, присутствует ли атрибут logonuser в сеансе, иначе переадресовывается, например, в сервлет регистрации. –

ответ

2

Используйте команду filter, чтобы проверить роль пользователя. Это, прежде чем какое-либо важное действие необходимо проверить, имеет ли пользователь право на это действие. Это фильтр сервлетов задачи.

Вы должны реализовать метод 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> 
+0

Это имеет смысл. Нужно ли мне выполнять эти «роли задач» самостоятельно? Похоже, я должен сначала реализовать их, а затем перейти к сервлет-фильтру. Теперь я сохраняю имя пользователя для сеанса, а затем FileServlet проверяет, называется ли это «admin». –

+0

Вам нужно установить переменную 'userRole' в сеансе:' session.setAttribute (userRole, "nameUserRole") '. Это действие должно быть выполнено после того, как пользователь успешно прошел этап авторизации. Поэтому в порядке получения полученной информации было ясно, какую роль ему следует назначить – kapand

+0

Итак, теперь. Предположим, что я реализовал этот метод. Теперь, может ли «FileServlet» обнаружить, был ли он вызван непосредственно по его шаблону URL-адреса или если он был вызван другим JSP? Я имею в виду, если пользователь, не являющийся администратором, вставляет вызов FileServlet в адресную строку браузера, он должен блокировать его. –

2

Используйте фильтр сервлетов, который проверяет подчиненный URL и на основе объекта сеанса идентифицирует роль пользователя. Если он найдет авторизованного пользователя, он может перейти на страницу загрузки.

Смежные вопросы