我有一个LAMP设置,我只是希望能够保护网页上的内容(图像,CSS,视频等),以便只有登录的用户才能访问它.
我意识到我可以使用.htaccess轻松完成这项工作.但是我不想使用身份验证弹出窗口,我希望能够使用会话并且还能够注销.
我正在使用php来完成使用mysql进行身份验证并创建会话.这非常有效.但仍然可以访问图像,CSS,JavaScript等.
仅当存在有效的php会话时,如何才允许访问内容?
我遇到过使用mod_rewrite将文件转发到php文件(比如auth.php?file = ...)并在那里进行会话检查.对于已经检查过的页面中的每个图像,检查会话似乎效率低下.这似乎是一个黑客,我一直认为有一个更清洁的方式来做到这一点.
是否有像mod_session_cookie这样的apache的mod可以检查我的会话数据库中是否存在具有会话密钥的cookie,如果是,则为目录设置Allow all?
或者,是否可以使用mod_auth_mysql,但也能够使用PHP表单而不是身份验证弹出窗口使用会话和登录?
编辑:
这是我解决问题的方法:
在我的apache配置文件(不是.htaccess)中,我添加了:
RewriteLock /var/www/lib/rewrite.lock
<VirtualHost>
#...
RewriteEngine on
RewriteMap sessionValid prg:/var/www/lib/allow.php
<Directory /var/www/client/*>
RewriteEngine on
RewriteCond %{HTTP_COOKIE} !client-cookie=([^;]+)
RewriteRule .* - [L,R=403]
RewriteCond %{HTTP_COOKIE} client-cookie=([^;]+)
RewriteCond ${sessionValid:%1} !valid
RewriteRule .* - [L,R=403]
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
脚本allow.php:
#!/usr/bin/php5
<?php
set_time_limit(0);
echo "";
$stdin = fopen("php://stdin","r");
$db = mysql_connect(...);
mysql_select_db(..., $db);
$querypre = "SELECT ID FROM Sessions WHERE ID='";
while (1) {
$line = trim(fgets($stdin));
$query = $querypre.mysql_real_escape_string($line)."'";
$result = mysql_query($query);
if …Run Code Online (Sandbox Code Playgroud) 我虽然这很简单,但我找不到答案.我需要知道如何从iframe中访问iframe的名称.我正在尝试这样的事情,但它不起作用.
<iframe name="thename">
<script type="text/javascript">
alert(parent.name);
</script>
</iframe>
Run Code Online (Sandbox Code Playgroud) 说我有一个ruby方法:
def blah(foo=17)
...
end
Run Code Online (Sandbox Code Playgroud)
在代码中我想用一个特定的参数"blah(a)"来调用blah,或者使用它的默认参数"blah()"调用blah.如果没有指定方法名两次,有没有办法做到这一点?我试图避免:
if a.nil?
blah()
else
blah(a)
end
Run Code Online (Sandbox Code Playgroud)
因为它使代码看起来比它复杂.我能想出的最好(没有测试)是:
args=[]
args << a unless a.nil?
a.send :blah, args
Run Code Online (Sandbox Code Playgroud) 一个页面可以有一个属性MasterType,使Page.Master被强类型:
<%@ MasterType VirtualPath="~/Site.master" %>
Run Code Online (Sandbox Code Playgroud)
如果我的所有页面都继承了继承System.Web.UI.Page自己的特定类,this.Master那么我是否可以访问其中的属性,以便我可以调用母版页的方法?
我已经创建了一个UserControl CatalogBrowser,它具有一个属性ListedFamilies,可以公开控件中当前列出的Family对象.这是该物业的代码.
public List<Family> ListedFamilies {
get {
List<Family> returnList = new List<Family>();
foreach (Object obj in this.familyObjectListView.Objects) {
returnList.Add((Family)obj);
}
return returnList;
}
set {
this.familyObjectListView.ClearObjects();
this.familyObjectListView.Objects = value;
}
}
Run Code Online (Sandbox Code Playgroud)
现在在我使用此控件的表单中,我一直遇到Visual Studio在Form的设计器文件中添加以下行的问题.
this.catalogBrowserControl1.ListedFamilies = ((System.Collections.Generic.List<SOMLib.Family>)(resources.GetObject("catalogBrowserControl1.ListedFamilies")));
Run Code Online (Sandbox Code Playgroud)
这导致我的程序崩溃,因为我没有(或想要)我的项目中的资源来初始化此集合属性的值.
如何防止Visual Studio自动尝试初始化此属性?
在Java中,我知道可以这样做:
public class Greeter {
public void greetEventually() {
final String greeting = "Hello!";
Job j = new Job() {
public void run() {
System.out.println(greeting);
}
};
j.schedule();
}
}
Run Code Online (Sandbox Code Playgroud)
这将Job在将来的某个时刻执行匿名.这是有效的,因为允许匿名类引用封闭范围中的最终变量.
我不确定的是以下情况:
public class Greeter {
private String greeting;
// ... Other methods that might mutate greeting ...
public void greetEventually() {
Job j = new Job() {
public void run() {
System.out.println(greeting);
}
};
j.schedule();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的匿名Job是指封闭类的非final字段.作业运行时,我是否会看到greeting创建作业时的字段值,或者执行作业时的值?我想我知道答案,但我认为这是一个有趣的问题,起初它让我和几个同事再次猜测自己几分钟.
我使用servlet和JSP开发了一个Web应用程序.我本身并没有使用任何框架,而是使用我自己的自制MVC框架.我使用MySQL作为后端.
我想做以下事情:
问题是:目前我的所有代码都是从客户端收到的请求运行的.
如何在服务器端运行定期任务?
我现在的一个解决方案是在控制器的init函数中创建一个线程.还有其他选择吗?
我怎样才能使用JQuery检查一个值是否属于下拉列表?
我想将我的MediaElent上的歌曲从track1.mp3更改为track2.mp3.以下是代码:
MyMediaElement.Stop();
Uri u = new Uri("track2.mp3", UriKind.Relative);
MyMediaElement.Source=u;
MyMediaElement.Play();
Run Code Online (Sandbox Code Playgroud)
MediaElement更改源但不会启动.这段代码可能有什么问题?
我必须在这里找到一些简单的东西.
请使用以下代码:
public IEnumerable<int> getInt(){
for(int i = 0; i < 10; i++){
yield return i;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以这样称呼:
foreach (int j in obj.getInt()){
//do something with j
}
Run Code Online (Sandbox Code Playgroud)
如何在没有foreach循环的情况下使用getInt方法:
IEnumerable<int> iter = obj.getInt();
// do something with iter ??
Run Code Online (Sandbox Code Playgroud)
谢谢.
EDITS
对于那些想知道为什么我想要这个的人.我正在迭代两件事:
IEnumerator<int> iter = obj.getInt().GetEnumerator();
foreach(object x in xs){
if (x.someCondition) continue;
iter.MoveNext();
int n = iter.current();
x.someProp = n;
etc...
}
Run Code Online (Sandbox Code Playgroud) c# ×3
.net ×2
java ×2
apache ×1
arguments ×1
asp.net ×1
closures ×1
default ×1
html ×1
ienumerable ×1
iframe ×1
javascript ×1
master-pages ×1
mediaelement ×1
mysql ×1
parameters ×1
php ×1
playback ×1
ruby ×1
servlets ×1
session ×1
silverlight ×1
winforms ×1
yield-return ×1