Это мой рабочий класс @Configuration
для обработки запросов CORS, используемых только в среде разработки.
@Configuration
//@Profile(PROFILE_DEV)
public class CorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("*")
.allowedMethods("*");
}
};
}
}
Вы также должны настроить Spring Security на игнорирование HttpMethod.OPTIONS
, используемого запросом предполетной проверки (в качестве исключения, которое вы упомянули)
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
//...
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
//others if you need
.antMatchers(HttpMethod.OPTIONS, "/**");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.exceptionHandling()
.and()
.headers()
.frameOptions()
.disable()
.and()
.authorizeRequests()
.antMatchers("/api/register").permitAll()
.antMatchers("/api/activate").permitAll()
.antMatchers("/api/authenticate").permitAll()
.antMatchers("/api/**").authenticated();
}
}
Потому что, когда вы используете cors, у вас есть Simple Request и Предварительно выданный запрос , который запускает HttpMethod.OPTIONS
В MFC я полагаю, что является самым легким сначала сериализировать размер карты и затем затем выполнить итерации через все элементы.
Вы не указывали, используете ли Вы std::map
или MFC CMap
, но версия на основе std::map
мог быть похожим на это:
void MyClass::Serialize(CArchive& archive)
{
CObject::Serialize(archive);
if (archive.IsStoring()) {
archive << m_map.size(); // save element count
std::map<int, MapData>::const_iterator iter = m_map.begin(),
iterEnd = m_map.end();
for (; iter != iterEnd; iter++) {
archive << iter->first << iter->second;
}
}
else {
m_map.clear();
size_t mapSize = 0;
archive >> mapSize; // read element count
for (size_t i = 0; i < mapSize; ++i) {
int key;
MapData value;
archive >> key;
archive >> value;
m_map[key] = value;
}
}
}
Если бы ошибка происходит при чтении архива, одна из операций потоковой передачи должна выдать исключение, которое было бы затем поймано платформой на более высоком уровне.
Я не знаю много о MFC, но Ваша проблема скорее тривиально решена с помощью Повышения. Сериализация
struct MapData {
int m_int;
std::string m_str;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & m_int;
ar & m_str;
}
};
std::map< int, MapData > theData;
template<class Archive>
void serialize(Archive & ar, std::map< int, MapData > & data, const unsigned int version)
{
ar & data;
}
И затем позже были Вы, хотят сделать реальную архивацию:
std::ofstream ofs("filename");
boost::archive::binary_oarchive oa(ofs);
oa << theData;
Именно.
(правовая оговорка: кодируйте просто введенный в этом поле, не протестированном вообще, опечатка были предназначены ;)