Servlets 如何在web.xml中配置url映射以限制访问?

Servlets 如何在web.xml中配置url映射以限制访问?,servlets,web.xml,Servlets,Web.xml,我有以下结构的几页 --项目 |---网络内容 |----行政/* |----作者/* |----只读/* |----Index.jsp 我想限制用户访问Admin、Author和Readonly下的页面。我不希望任何人访问这些页面。如果有人试图这样做,应该重定向到index.jsp 我想到的最简单的解决方案是使用过滤器,但我正在尝试使用web.xml,是否有可能?(url映射示例) 保护区 /* 工程类 移民专家 开发者 /更新/* 基本的 服务门户 如果您希望没有人能够直接访问这些

我有以下结构的几页

--项目
|---网络内容
|----行政/*
|----作者/*
|----只读/*
|----Index.jsp
我想限制用户访问
Admin
Author
Readonly
下的页面。我不希望任何人访问这些页面。如果有人试图这样做,应该重定向到
index.jsp

我想到的最简单的解决方案是使用
过滤器
,但我正在尝试使用
web.xml

,是否有可能?(url映射示例)


保护区
/*   
工程类
移民专家
开发者
/更新/*
基本的
服务门户
如果您希望没有人能够直接访问这些页面,只需将它们放在
/WEB-INF
文件夹中即可

项目
`--网络内容
|--WEB-INF
||——管理
||——作者
|`--只读
`--Index.jsp
这样,页面就不可公开访问,而只能由执行转发的servlet访问。当终端用户试图直接访问它时,他只会得到一个HTTP404错误

另一种方法是配置无角色的


限制对某些文件夹的直接访问
受限文件夹
/管理员/*
/作者/*
/只读/*
当终端用户试图访问它们时,他将得到的只是一个HTTP403错误

无论哪种方式,都不可能用这种方式将最终用户重定向到
index.jsp
。只有
过滤器才能做到这一点。您可以将
index.jsp
配置为404或403的错误页面位置

<error-page>
    <error-code>404</error-code>
    <location>/index.jsp</location>
</error-page>

404
/index.jsp

但这将涵盖所有404(或403),不确定这是否是您想要的。

如果您想通过角色权限对页面/文件夹进行高级访问,则必须在web xml文件中设置安全约束

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>DESC_OF_FOLDER</web-resource-name>
      <url-pattern>/users/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>REGISTERED_USER_ROLE</role-name>
    </auth-constraint>
  </security-constraint>
希望这有帮助

更新

对于登录页面的重定向,web.xml中也应该有类似的内容

<form-login-config>
  <form-login-page>/login.jsp</form-login-page>
  <form-error-page>/error.jsp</form-error-page>
</form-login-config>

/login.jsp
/error.jsp

或者换句话说,我希望只允许访问'index.jsp',而不考虑角色或授权。很抱歉,我在这里找到了一个示例,其中包含url映射中的示例和控件身份验证。。。我试着帮忙。为什么你在谷歌上找到的片段都是复制粘贴的,而你却根本不明白自己在回答什么?只需回答您可以从头开始回答的问题,并详细解释其工作原理。同意您的观点,使用index.jsp处理404将是一个坏主意。如果我能够只完成第一部分,我甚至会很高兴。然后我认为保持404的身份就可以了。为什么最终用户只会被重定向到索引页面,只针对最终用户甚至不应该知道的一组特定URL?你是否在网络中的某个地方有指向这些受限URL的所有现有链接?好吧,那你真的不能绕过一个过滤器。确保筛选器执行301重定向,而不是302重定向,这样searchbots将从索引中删除旧URL。同意,终端用户应该知道他试图访问的任何受限URL。第二,这些链接还没有公开,所以你的观点很有说服力
        if ((request.getUserPrincipal().getName()) != null) {
            String userName = request.getUserPrincipal().getName().trim();
            .....

            if (request.isUserInRole("REGISTERED_USER_ROLE")) {
                .....
            } 
         }
<form-login-config>
  <form-login-page>/login.jsp</form-login-page>
  <form-error-page>/error.jsp</form-error-page>
</form-login-config>