Perl Catalyst - 防止url中出现双重路径,例如http:/mydomainnameloginlogin。

问题描述 投票:0回答:2

我正在创建一个Catalyst应用程序,目前我有一个简单的登录页面,我通过进入网址来访问。

http://mydomainname/login

这样做很完美,它获取了html页面,并使用它引用的css文件创建了一个漂亮的登录页面。

然而,如果我也去下面的网址。

http://mydomainname/login/login

我创建的登录页面仍然会被显示出来,只是这次它只是显示基本的按钮,文本框等等,而没有css,因为它似乎没有访问css文件进行样式设计。

这种情况在路径中包含'login'的情况下都会发生。

例如:

http://mydomainname/login/login
http://mydomainname/login/login/login
http://mydomainname/login/login/login/login/login

等等...

我想要的显然是 http://mydomainname/login/login 不工作或重定向到只是 http://mydomainname/login 比如说,我的Login.pm控制器

我的Login.pm控制器我有。

sub default : Private {
    my ( $self, $c ) = @_;

    $c->forward('login');  
}

sub login : Path('/login') {  
        my ( $self, $c ) = @_;

        $c->stash->{title} = 'Login Page';
        $c->stash->{pagetype} = "html";
        $c->stash->{template} = "login.html";
}

首先,控制器应该是这样的吗?我需要做什么来防止这个双url路径的问题发生呢? (例如 http://mydomainname/login/loginhttp://mydomainname/login/login/login/login).

html css perl model-view-controller catalyst
2个回答
0
投票

第一个 /login 正在从控制器名称中进行匹配,而第二个 /login 正在从Action名称(子)中匹配。

您需要将整个 login 子到你的Root控制器中,或者将其逻辑移到现有的 default 处理程序。就我个人而言,我更喜欢把登录和注销这样的操作放到Root控制器中。它们不太可能有其他的东西链到它们上面或者依赖于它们。Login.pm有其他动作或方法吗?

缺少的CSS样式很可能是login.html中相对路径的问题,或者是主程序中静态资源的配置问题。你应该可以用浏览器的开发工具来调试这个问题。


0
投票

明确说不应该有参数。

sub login :Path('/login') :Args(0) {

那么控制器就不会匹配 /login/etc/etc/etc

© www.soinside.com 2019 - 2024. All rights reserved.