我正在使用Spring MVC编写Java Web应用程序.我有一个后台进程通过数据库查找必须通过电子邮件发送给我的用户的通知.这些电子邮件消息需要包含应用程序的超链接.这似乎是一个相当常见的网络应用程序模式,但我遇到了麻烦.
如何使用服务器名称和上下文路径派生应用程序的完全限定URL?我无法访问HttpServletRequest中的任何方法,因为我将其作为后台进程运行,而不是响应Web请求.我能做的最好的就是访问ServletContext.
目前我将基本URL放入配置文件并在启动时读取它,但是此应用程序将获得许可并部署到客户的应用程序服务器,如果可能,我希望他们不必手动配置它.
作为我的集成策略的一部分,我有一些SQL脚本运行以更新数据库.所有这些脚本做的第一件事就是检查它们是否需要运行,例如:
if @version <> @expects
begin
declare @error varchar(100);
set @error = 'Invalid version. Your version is ' + convert(varchar, @version) + '. This script expects version ' + convert(varchar, @expects) + '.';
raiserror(@error, 10, 1);
end
else
begin
...sql statements here...
end
Run Code Online (Sandbox Code Playgroud)
效果很好!除非我需要添加存储过程."create proc"命令必须是一批sql命令中的唯一命令.在我的IF语句中放入"create proc"会导致此错误:
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
哎哟! 如何将CREATE PROC命令放在我的脚本中,并让它只在需要时执行?
这与我提出的另一个问题有关.总而言之,我有一个URL的特殊情况,当一个表单发布到它时,我不能依赖cookie进行身份验证或维护用户的会话,但我不知何故需要知道他们是谁,我需要知道他们已经登录了!
我想我想出了解决问题的方法,但需要充实.这就是我在想的.我创建一个名为"username"的隐藏表单字段,并在其中放置用户的用户名加密.然后,当表单POST时,即使我没有从浏览器收到任何cookie,我知道他们已经登录,因为我可以解密隐藏的表单字段并获取用户名.
我能看到的主要安全漏洞是重播攻击.如何阻止某人获取该加密字符串,并以该用户身份进行POST?我知道我可以使用SSL来更难以窃取该字符串,也许我可以定期轮换加密密钥来限制字符串有用的时间,但我真的很想找到一个防弹解.有人有什么想法吗?ASP.Net ViewState是否阻止重播?如果是这样,他们是如何做到的?
编辑:我希望解决方案不需要存储在数据库中的任何内容.应用程序状态是可以的,除了它将无法在IIS重新启动或在Web场或园林场景中完全工作.我现在接受克里斯的回答,因为我不相信它甚至可以在没有数据库的情况下保证这一点.但如果有人想出一个不涉及数据库的答案,我会接受它!
我正试图从我的网络应用程序运行批处理文件,作为另一个用户.出于某种原因,批处理文件挂起!我可以看到"cmd.exe"在任务管理器中运行,但它只是永远坐在那里,无法被杀死,批处理文件没有运行.这是我的代码:
SecureString password = new SecureString();
foreach (char c in "mypassword".ToCharArray())
password.AppendChar(c);
ProcessStartInfo psi = new ProcessStartInfo();
psi.WorkingDirectory = @"c:\build";
psi.FileName = Environment.SystemDirectory + @"\cmd.exe";
psi.Arguments = "/q /c build.cmd";
psi.UseShellExecute = false;
psi.UserName = "builder";
psi.Password = password;
Process.Start(psi);
Run Code Online (Sandbox Code Playgroud)
如果您没有猜到,此批处理文件将构建我的应用程序(与执行此命令的应用程序不同的应用程序).
Process.Start(psi); 行应该立即返回,但批处理文件似乎挂起,没有执行.有任何想法吗?
编辑:请参阅下面的答案,了解批处理文件的内容.
我添加了这些行:
psi.RedirectStandardOutput = true;
Process p = Process.Start(psi);
String outp = p.StandardOutput.ReadLine();
Run Code Online (Sandbox Code Playgroud)
并在调试模式下逐步完成它们.代码挂在了ReadLine()
.我很难过!
这个问题关系到这一个,虽然我想我是有点太啰嗦那里真正得到一个很好的答案.我会保持简短.
我正在开发一个Web处理程序(ashx),它接受来自aspx页面的表单帖子.当处理程序收到此表单帖子时,为了完成它需要做的事情,它需要知道登录的用户(User.Identity.Name),但我不能依赖浏览器发送的cookie.
我知道我可以获取Session.SessionID并将其放在隐藏的表单字段中,但是一旦我的处理程序收到表单帖子,我如何使用该SessionID来计算登录用户的身份?
我正在使用StateServer模式进行会话状态.
我希望在我的传统ASP经典网站中实现httpOnly.谁知道怎么做?
我在ASP.Net网站上使用Yahoo Uploader,Yahoo UI Library的一部分,允许用户上传文件.对于那些不熟悉的人,上传者通过使用Flash小程序来帮助我更好地控制FileOpen对话框.我可以为文件类型指定一个过滤器,允许选择多个文件等.这很好,但它有以下记录的限制:
由于已知的Flash错误,在Windows中的Firefox中运行的上传器不会通过上传发送正确的cookie; 它不是发送Firefox cookie,而是为相应的域发送Internet Explorer的cookie.作为解决方法,我们建议使用无cookie上传方法或将document.cookie附加到上传请求.
因此,如果用户使用的是Firefox,我不能依赖Cookie来保存他们上传文件时的会话.我需要他们的会议,因为我需要知道他们是谁!作为一种解决方法,我正在使用Application对象:
Guid UploadID = Guid.NewGuid();
Application.Add(Guid.ToString(), User);
Run Code Online (Sandbox Code Playgroud)
因此,我正在创建一个唯一的ID,并将其用作将Page.User
对象存储在Application范围内的键.上传文件时,我将该ID作为POST中的变量包含在内.然后,在接受文件上传的处理程序中,我抓住User对象:
IPrincipal User = (IPrincipal)Application[Request.Form["uploadid"]];
Run Code Online (Sandbox Code Playgroud)
这实际上有效,但它有两个明显的缺点:
如果IIS,应用程序池,甚至只是应用程序在用户访问上载页面和实际上载文件之间重新启动,它们的"uploadid"将从应用程序范围中删除,并且上载失败,因为我无法对它们进行身份验证.
如果我扩展到Web场(可能甚至是Web园)场景,这将完全破坏.我可能不会担心,除了我计划将来扩展这个应用程序.
有没有人有更好的方法?有没有办法让我在POST变量中传递实际的ASP.Net会话ID,然后在另一端使用该ID来检索会话?
我知道我可以通过会话ID Session.SessionID
,我知道如何使用YUI将其发布到下一页.我不知道如何使用它SessionID
从状态服务器获取会话.
是的,我正在使用状态服务器来存储会话,因此它们会持续执行应用程序/ IIS重新启动,并且可以在Web场方案中运行.
我在 ASP.Net 项目中使用 TinyMCE,我需要进行拼写检查。我发现的唯一 TinyMCE 插件在服务器端使用 PHP,我想我可以分解并在我的服务器上安装 PHP 并这样做,但坦率地说,这是多么痛苦。我不想那样做。
事实证明,Firefox 的内置拼写检查对我来说很好用,但它似乎不适用于 TinyMCE 编辑器框。我已经启用了 gecko_spellcheck 选项,它应该可以修复它,但它没有。
有人知道一个不错的富文本编辑器,它不会破坏浏览器的拼写检查吗?
asp.net ×3
c# ×2
security ×2
session ×2
.net ×1
asp-classic ×1
encryption ×1
httponly ×1
java ×1
java-ee ×1
javascript ×1
spring-mvc ×1
sql-server ×1
yui ×1