В результате чтения руководства по Spring Security 3 создал небольшое web-приложение в котором интегрировал и задействовал следующие технологии:
- Maven 2
- JavaServer Faces 2. Реализация Mojarra 2.0.3.
- Java Persistence API 2. Реализация Hibernate 3.6.0.Final.
- Spring Framework 3.0.5.RELEASE.
- Spring Security 3.0.5.RELEASE.
- Derby DB
Подробно описывать как все устроено слишком долго, поэтому выкладываю Maven-проект на общее обозрение. В архиве лежат файлы проектов для IntelliJ IDEA и Eclipse.
Проект является черновым, но уже может послужить хорошей основой для web-проекта. Принимаются все предложения по улучшению и все вопросы по работе приложения.
Обновление от 17.01.2011 22:29
По просьбам заинтересованных захостил проект на Google Code: https://code.google.com/p/jsf2geek/
Обновление от 19.01.2011 23:10
Сделал капчу. Пример можно увидеть на странице “Регистрация”.



#1 by Slava Semushin on 16 Январь 2011 - 1:18
Quote
Думаю, что хорошо бы сделать svn export, чтобы в архиве не было файлов SVN-овских.Ну и немного смущают комментарии на русском вперемешку с английскими. И локализацию, в идеале бы добавить, чтобы не бросать из контроллера сообщения на русском языке.
Спасибо за пример!
#2 by Дмитрий Леонтьев on 16 Январь 2011 - 13:54
Quote
Здравствуйте, Slava! Спасибо за замечания. Файлы SVN из архива убрал. Сейчас проект находится в стадии черновика, поэтому цель сейчас заставить все работать. Замечания Ваши учту и постараюсь в ближайшее время сделать и i18n и i10n. Комментарии со временем тоже напишу. Также планируется добавить JUnit-тесты.
Сейчас только убрал папки .svn из архива и перезалил его. Кстати, если у Вас есть какие-то наработки, которыми Вам не жалко поделиться и Вы считаете что они будут полезны сообществу, можете отправлять их мне на email. Вставлю в проект.
#3 by Mikhail on 17 Январь 2011 - 7:06
Quote
На гуглокоде или гитхабе смотреть было бы удобней, имхо.
#4 by Serger on 17 Январь 2011 - 9:45
Quote
> На гуглокоде или гитхабе смотреть было бы удобней, имхо.
Кстати, да
#5 by Serger on 17 Январь 2011 - 9:47
Quote
…или тут: http://java.net/
#6 by Дмитрий Леонтьев on 17 Январь 2011 - 23:31
Quote
Захостил проект на https://code.google.com/p/jsf2geek/
#7 by Dweeb on 3 Февраль 2011 - 9:00
Quote
Развернул проект на IDEA. Вроде все работает, но никогда не имел дело с Derby. Не могу понять, что мне нужно для работы. Derby вроде установил, sysinfo выдает:
——— Информация Derby ——–
JRE – JDBC: Java SE 6 – JDBC 4.0
[/usr/share/javadb/lib/derby.jar] 10.3.2.1 – (599110)
[/usr/share/javadb/lib/derbytools.jar] 10.3.2.1 – (599110)
[/usr/share/javadb/lib/derbynet.jar] 10.3.2.1 – (599110)
[/usr/share/javadb/lib/derbyclient.jar] 10.3.2.1 – (599110)
——————————————————
Но при запуске проекта все равно вижу – java.sql.SQLNonTransientConnectionException: java.net.ConnectException : Ошибка соединения с сервером localhost на порту 1527 с сообщением В соединении отказано.
Может подскажешь что не так и ткнешь меня на нужную доку почитать?
#8 by Дмитрий Леонтьев on 3 Февраль 2011 - 9:21
Quote
Derby я тоже знаю поверхностно, но сложностей при запуске не было.
1) Скачал дистриб с http://db.apache.org/derby/
2) Распаковал
3) Запустил %DERBY_HOME%\bin\startNetworkServer.bat
4) Запускаю приложение, работает. База создается если еще не создана.
Единственное, что могу предложить – сделать одинаковой версию драйверов и СУБД. Судя по твоему консольному выводу, у тебя версия СУБД 10.3.2.1, а у меня в pom.xml подтягивается JDBC-драйвер версии 10.6.1.0. Пока больше ни чего не могу предложить )
#9 by Dweeb on 3 Февраль 2011 - 9:48
Quote
А ну вот оказывается надо было просто запустить:
/usr/share/javadb/bin/startNetworkServer
Теперь кое что другое не понятно. Когда захожу в http://localhost:8080/register.xhtml выдает ошибку:
An Error Occurred:
null source
- Stack Trace
java.lang.IllegalArgumentException: null source
at java.util.EventObject.(EventObject.java:38)
at javax.faces.event.SystemEvent.(SystemEvent.java:67)
at javax.faces.event.ComponentSystemEvent.(ComponentSystemEvent.java:69)
at javax.faces.event.PostRestoreStateEvent.(PostRestoreStateEvent.java:69)
at com.sun.faces.lifecycle.RestoreViewPhase.deliverPostRestoreStateEvent(RestoreViewPhase.java:256)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:245)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:112)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:109)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
Это что то не реализовано у тебя или мне надо что то еще настроить?
#10 by Дмитрий Леонтьев on 3 Февраль 2011 - 12:04
Quote
В конструктор java.util.EventObject передается null, хотя должен передаваться объект, на котором произошло событие. Фиг знает почему.
А что используешь для запуска, какой контейнер? Я тестировал на Tomcat 7.0.2. В Tomcat 6 нет, например, el-2.2, поэтому вызов метода с параметрами из EL-выражения не поддерживается, а на странице register.xhtml как раз событие типа preRenderView создается и регистрируется слушатель #{flash.keep(‘registerAccount’)}. Это означает что registerAccount из request сохраняется во flash перед рендерингом страницы.
А почему не используешь Application Context? В Idea в Run/Debug Configuration (где настраивается контейнер), на вкладке Deployment щелкни на org.jgeek.website:war exploded, должно появиться рядом поле ApplicationContext. Там должно быть что-то вроде /jgeek. Затем нужно перейти на вкладку Server и убедиться что Startup Page выглядит так: http://localhost:8080/jgeek/. Либо, если все же не хочешь чтобы был контекст, то на вкладке Deployment должен быть /, тогда можно использовать URL http://localhost:8080.
Проверь также чтобы все зависимости Maven скачались. Открой вьюху Maven Projects, там раскрой узел Dependencies. Если что-то не скачалось, то будет подчеркнуто красной волнистой линией. В этом случае нужно пощелкать на кнопке Force Reimport.
Я сейчас заново зачекаутил проект, скачал свежий Tomcat 7.0.6, задеплоил приложение, все работает.
Если не заработает, пиши, будем дальше разбираться.
#11 by Dweeb on 3 Февраль 2011 - 12:58
Quote
запускал на tomcat 6. Попробовал tomcat 7 и все заработало. спасибо за помощь.
#12 by Дмитрий Леонтьев on 3 Февраль 2011 - 13:03
Quote
Да не за что. Обращайся. Как сделать чтобы на Tomcat 6 запустить, писал мой коллега на http://habrahabr.ru/blogs/java/87973/.
#13 by Dweeb on 12 Февраль 2011 - 18:50
Quote
при создании проекта какой архетип мавена ты использовал?
#14 by Дмитрий Леонтьев on 20 Февраль 2011 - 15:28
Quote
Здравствуйте, Dweeb. При создании проекта использовал архетип maven-archetype-webapp:RELEASE. В общем, самый простой архетип web-приложения.
#15 by Dmitry on 23 Март 2011 - 18:37
Quote
Где можно скачать сорцы проекта под эклипсу? Из свн вытянуть не могу, так как в инет выхожу через прокси и эклипсе интернет недоступен.
#16 by Max on 31 Март 2011 - 1:20
Quote
Очень хорошая статья Дмитрий. Сейчас вот искал авторизацию с помощью Spring Security и нашел вашу статью. Она действительно очень полезна, но хотелось бы увидеть под эклипсу.
#17 by Nieky on 18 Май 2011 - 8:29
Quote
Не получается в эклипсе мавеном обработать:
Description Resource Path Location Type
ArtifactDescriptorException: Failed to read artifact descriptor for org.springframework.security:spring-security-config:jar:3.0.5.RELEASE: UnresolvableModelException: Failure to transfer org.springframework.security:spring-security-parent:pom:3.0.5.RELEASE from http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.springframework.security:spring-security-parent:pom:3.0.5.RELEASE from/to central (http://repo1.maven.org/maven2): org.jboss.netty.handler.codec.compression.CompressionException: decompression failure (-3): incorrect CRC32 checksum pom.xml /website line 1 Maven Dependency Problem
И таких несколько проблем. Что делать? гугл не дал особых резалтов(
#18 by Nieky on 18 Май 2011 - 9:18
Quote
через консоль получил (mvn war:inplace):
Missing:
———-
1) org.springframework:spring-aop:jar:3.0.5.RELEASE
Наверное нужно уже другую версию спринга юзать?
#19 by Антон Сидоров on 1 Июнь 2011 - 18:33
Quote
Здравствуйте, Леонид.
У меня аналогичная задача стоит на дипломе,разработать Web-приложение
на JAva EE.
На помощь уж не рассчитываю,хотел скачать код Вашей программы,не нашел как.
Отправьте пожалуйста на почту Ancid1@mail.ru
#20 by Александр on 17 Июнь 2011 - 11:45
Quote
Проект уже недоступен для скачивания?
#21 by Filipp on 17 Июнь 2011 - 11:50
Quote
Доброе время суток. Запустил приложение, работает. Меня интересует структура связей между таблицами. Вы не могли бы пояснить.
#22 by Filipp on 17 Июнь 2011 - 11:53
Quote
>>>>>>>>> Проект уже недоступен для скачивания?
Можешь сделать checkout c http://jsf2geek.googlecode.com/svn/trunk/
Тока для этого надо поставить svn client, например TortoieseSVN.
#23 by Filipp on 17 Июнь 2011 - 12:01
Quote
Type your comment here
Получается, что UserAccout знает свой UserAutority, и вдобавок он еще принадлежит к группе пользователей, которая тоже знает свой UserAutority.
#24 by Dmitry M. on 13 Август 2011 - 18:29
Quote
Добрый день,
Большое спасибо за статью! Я полный новичок в разработке под Java и Eclipse. Разобравшись с исходниками, решил сделать подобный проект, сам, с нуля, и столкнулся с небольшой проблемой – какой тип проекта в Eclipse выбирать при создании приложения – Java Project, Enterprise Application Project или Dynamic Web Project?
#25 by Alex on 19 Август 2011 - 15:39
Quote
Dynamic Web Project
#26 by Dmitry M. on 20 Август 2011 - 12:24
Quote
Спасибо.
#27 by Damir I on 9 Сентябрь 2011 - 23:52
Quote
Дима, добавь в web.xml:
org.springframework.web.context.request.RequestContextListener
#28 by Damir I on 9 Сентябрь 2011 - 23:53
Quote
more for this listener at http://stackoverflow.com/questions/2077558/warn-could-not-register-destruction-callback
#29 by Art on 23 Ноябрь 2011 - 18:43
Quote
Добрый день, а не могли бы всё таки описать всё то что долго, проект это хорошо но без комментариев по нему он становиться практически бесполезным в понимание механизмов, думаю любой читатель который не знаком с тонкостями настроек был бы очень вам благодарен, так как по этой теме на русском языке ничего найти не возможно.