我已经实现了一个使用基本身份验证(使用 spring 安全性)的 Web 服务器。
我在访问 URL 时禁用了默认身份验证入口点(而不是使用 www-authentication 标头响应 401,它只返回 401),目的是防止浏览器显示身份验证弹出窗口。
我能够使用 javascript 代码和 curl 等命令行工具连接到服务器,但是当我使用浏览器(chrome 和 firefox)对其进行测试时,它们只是不发送标头。
curl -v -u user:password localhost:8080/user
GET /user HTTP/1.1
Host: localhost:8080
Authorization: Basic dXNlcjpwYXNzd29yZA==
User-Agent: curl/7.58.0
Accept: /
Chrome:版本 71.0.3578.98(官方版本)(64 位)
http://user:password@localhost:8080/user
GET /user HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/ 71.0.3578.98 Safari/537.36
DNT: 1
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng, / ;q=0.8
Accept-Encoding: gzip, deflate, br 接受语言:en-AU,en;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-GB;q=0.6,en-US;q=0.5
为什么浏览器不发送身份验证标头。
我做了一个模板类数组:这是必要的代码:
#ifndef ARRAY_H
#define ARRAY_H
#include <iostream>
#include <cstdarg>
template< typename T >
class Array
{
public:
Array(size_t length = 0, ...);
~Array();
private:
T *m_values;
size_t m_len;
};
template< typename T>
Array< T >::Array(size_t len, ...) : m_values(0), m_len(len)
{
if(len != 0)
{
m_values = new T[len];
va_list ap;
va_start(ap, len);
for(size_t i(0); i < len; i++)
m_values[i] = va_arg(ap, T);
va_end(ap);
}
else
m_values = NULL;
}
template< typename T >
Array< T >::~Array()
{
delete[] m_values; …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
// in global space
int v[50000];
// in a function
int n;
std::cin >> n;
for(int i(0); i < n; ++i)
std::cin >> v[i];
std::map<int, int, std::greater<int>> m;
for(int i(n-1); i > -1; --i){
auto it(m.find(m[v[i]]));
if(it == std::end(m)){
m[v[i]] = i; // (1)
// m.insert({m[v[i]], i}); (2)
// m.insert(std::make_pair(m[v[i]], i)); (3)
}
}
std::cout << "map : \n";
for(auto &x: m)
std::cout << x.first << ' ' << x.second << '\n';
Run Code Online (Sandbox Code Playgroud)
假设我们输入:3 1 2 3使用第一版地图插入我得到了预期的结果:
3 2
2 …
我有一个像这样的第一个构造函数
X::X(const std::vector<int>& v1, const std::vector<int>& v2, const std::vector<int>& v3) : _v1(v1), _v2(v2), _v3(v3){
} // _v1 , _v2 and _v3 are members
Run Code Online (Sandbox Code Playgroud)
对于这种行为,我还应该实现移动构造函数版本
X::X(std::vector<int>&&, std::vector<int>&&, std::vector<int>&&);
Run Code Online (Sandbox Code Playgroud)
但是可以像这样使用const左值引用和右值引用的混合类型的参数
X::X(const std::vector<int>&, std::vector<int>&&, const std::vector<int>&);
Run Code Online (Sandbox Code Playgroud)
是实现所有可能的构造函数的最佳实践,即2 ^ 3?
c++ ×3
arguments ×1
browser ×1
constructor ×1
dictionary ×1
insert ×1
templates ×1
webserver ×1