Это скорее совет, чем ответ, но если вы используете Spring MVC в своем веб-приложении, хорошей идеей является использование Spring HandlerInterceptor вместо Filter
. Он может выполнять ту же работу, но также - Может работать с ModelAndView. Его методы можно вызвать до и после обработки запроса или после завершения запроса. - Он может быть легко протестирован.
1 Внедрите интерфейс HandlerInterceptor и добавьте аннотацию @Component к вашему классу
@Component
public class SecurityInterceptor implements HandlerInterceptor {
private static Logger log = LoggerFactory.getLogger(SecurityInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.getSession(true);
if(isLoggedIn(request))
return true;
response.getWriter().write("{\"loggedIn\":false}");
return false;
}
private boolean isLoggedIn(HttpServletRequest request) {
try {
UserSession userSession = (UserSession) request.getSession(true).getAttribute("userSession");
return userSession != null && userSession.isLoggedIn();
} catch(IllegalStateException ex) {
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
2 Настройте свой перехватчик
@Configuration
public class WebConfig implements WebMvcConfigurer {
private HandlerInterceptor securityInterceptor;
@Autowired
public void setSecurityInterceptor(HandlerInterceptor securityInterceptor) {
this.securityInterceptor = securityInterceptor;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(securityInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/logout");
}
}
Спасибо за всю справку. Конечное решение, которое мы реализовали, взяло немного из каждого ответа.
Мы нашли легче обработать работу с несколькими средами с помощью простых пакетных файлов. Я не предполагаю, что это - лучший способ сделать это, но для нашего данного сценария и требований, это работало хорошо. Дополнение "Проект" с Вашим названием проекта и "Среда" с Вашим именем среды (dev, тест, этап, производство, безотносительно).
Вот область задач нашего "ccnet.config" файла.
<!-- override settings -->
<exec>
<executable>F:\Source\Project\Environment\CruiseControl\CopySettings.bat</executable>
</exec>
<!-- compile -->
<msbuild>
<executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
<workingDirectory>F:\Source\Project\Environment\</workingDirectory>
<projectFile>Project.sln</projectFile>
<buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
<targets>Rebuild</targets>
<timeout>0</timeout>
<logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
<!-- clickonce publish -->
<exec>
<executable>F:\Source\Project\Environment\CruiseControl\Publish.bat</executable>
</exec>
первой вещью, которую Вы заметите, является тот CopySettings.bat выполнения. Это копирует определенные настройки для среды, такие как соединения с базой данных.
Затем, стандартные выполнения задачи MSBUILD. Любые ошибки компиляции пойманы здесь и обработаны как нормальные.
последней вещью выполниться является Publish.bat. Это на самом деле работает, MSBUILD "восстанавливают" снова из командной строки, и параметры от CruiseControl автоматически передаются в и создаются. Затем, MSBUILD требуется "опубликовать" цель. Те же самые параметры даны тому, чтобы публиковать, как восстанавливание было выпущено. Это сохраняет номера сборки в синхронизации. Кроме того, наши исполняемые файлы называют по-другому (т.е. - ProjectDev и ProjectTest). Мы заканчиваем с различными номерами версий и именами, и это позволяет ClickOnce делать свою вещь.
последняя часть Publish.bat копирует фактические файлы в их новые дома. Мы не используем publish.htm, как все наши пользователи находятся в сети, мы просто даем им ярлык на файл манифеста на их рабочем столе, и они могут нажать и всегда выполнять корректный исполняемый файл с номером версии, который связывает в CruiseControl.
Здесь CopySettings.bat
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\app.config" "F:\Source\Project\Environment\Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.Designer.vb" "F:\Source\Project\Environment\Project\My Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.settings" "F:\Source\Project\Environment\Project\My Project" /Y /I /R
И наконец, здесь Publish.bat
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:rebuild "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationRevision=%CCNetLabel% /property:AssemblyName="ProjectEnvironment" /property:PublishUrl="\\Server\bin\Project\Environment\\"
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:publish "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationVersion="1.0.0.%CCNetLabel%" /property:AssemblyVersion="1.0.0.%CCNetLabel%" /property:AssemblyName="ProjectEnvironment"
XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish" "F:\Binary\Project\Environment" /Y /I
XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish\Application Files" "F:\Binary\Project\Environment\Application Files" /Y /I /S
Как, я сказал, это, вероятно, не сделало способа, которым CruiseControl и разработчики MSBUILD предназначили вещи работать, но это действительно работает. Если необходимо вчера получить эту работу, это могло бы быть решение, которое Вы ищете.Удачи!
Мы сделали это и можем дать Вам некоторые подсказки для запуска.
2 вещи необходимо знать:
Для использования MSBuild для генерации деклараций ClickOnce вот команда, которую необходимо будет дать:
msbuild /target:publish /p:Configuration=Release /p:Platform=AnyCPU; "c:\yourProject.csproj"
, Который скажет MSBuild разрабатывать Ваш проект и генерировать файлы развертывания ClickOnce в каталог bin\Release\YourProject.publish .
Все, что это оставляют, должно скопировать те файлы в долю/везде, где FTP/UNC, и Вы все установлены.
можно сказать CruiseControl.NET создавать использование тех параметров MSBuild.
Вам тогда будет нужна задача сборки CruiseControl.NET взять сгенерированные файлы развертывания и скопировать их в долю UNC или FTP. Мы используем пользовательскую небольшую программу консоли C# для этого, но Вы могли столь же легко использовать сценарий Powershell.
Я не забываю делать это в прошлом году для проекта ClickOnce, я продолжал работать. Я помню его берущий меня навсегда для выяснения, но здесь это. То, что я хотел, чтобы мои сценарии сделали, должно было генерировать различный установщик, который указал на наш dev ENV и различный для напоминания. Не только это, но и мне был нужен он для введения правильной информации об управлении версиями, таким образом, существующие клиенты 'поймут', что существует новая версия там, которая является смыслом clickOnce. В этом сценарии необходимо заменить собственными именами серверов и т.д. Прием должен сохранить publish.htm и project.publish файл и ввести новый номер версии на основе версии, которая предоставляется Вам CC.NET.
Вот то, на что был похож мой сценарий сборки:
<target name="deployProd">
<exec program="<framework_dir>\msbuild.exe" commandline="<project>/<project>.csproj /property:Configuration=PublishProd /property:ApplicationVersion=${build.label}.*;PublishUrl=\\<prod_location>\binups$\;InstallUrl=\\<prod_location>\binups$\;UpdateUrl=\\<prod_location>\binups$\;BootstrapperComponentsUrl=\\<prod_location>\prereqs$\ /target:publish"/>
<copy todir="<project>\bin\PublishProd\<project>.publish">
<fileset basedir=".">
<include name="publish.htm"/>
</fileset>
<filterchain>
<replacetokens>
<token key="CURRENT_VERSION" value="${build.label}"/>
</replacetokens>
</filterchain>
</copy>
</target>
Hope это помогает
Вы хотите использовать задачи поколения декларации ClickOnce в msbuild. Процесс немного долог обветренный, таким образом, я просто собираюсь указать на Вас на несколько ссылок. Вот ссылка на msdn и демонстрационная статья для обнадеживающего запущения Вас.
Просто смогите передав $ {CCNetLabel} в CCNET.config msbuild, задачей было бы большое улучшение.