首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注销用户- Java 6安全性

注销用户- Java 6安全性
EN

Stack Overflow用户
提问于 2013-11-17 00:21:58
回答 1查看 2.4K关注 0票数 0

我有一个表示安全内容的servlet,注释如下:

代码语言:javascript
复制
@WebServlet(name = "GreetingServlet", urlPatterns = {"/greeting"})

@ServletSecurity(
        @HttpConstraint(
            rolesAllowed = {"TutorialUser"} ) )

和web.xml如下:

代码语言:javascript
复制
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
  <display-name>hello2_basicauth</display-name>


  <!--other servlet names and mappings are defined via annotations-->


  <security-role>
    <role-name>TutorialUser</role-name>
  </security-role>

  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>file</realm-name>
  </login-config>
</web-app>

当我第一次进入/greeting路径时,出现了用户名/密码提示(早些时候我使用add_user.sh为Jboss创建了用户)。输入正确的凭据后,我能够看到servlet提供的安全内容。

现在的问题是,每当我再次访问/greeting路径时,就不再要求我提供凭据。

我在注销servlet下面实现了:

代码语言:javascript
复制
    @WebServlet(name = "Logout", urlPatterns = "/logout")
@ServletSecurity(
        @HttpConstraint(
                rolesAllowed = {"TutorialUser"}                 // 403 if user not present ...    // default add user to file realm and assign to TutorialUser group
        )
)
public class Logout extends HttpServlet {

    public static final Logger logger = Logger.getLogger(Logout.class.getCanonicalName());

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        logger.info("---- Principal = " + request.getUserPrincipal());
        request.logout();
        logger.info("---- Principal = " + request.getUserPrincipal());
    }
}

但是,它不起作用(我仍然可以访问/greeting的资源,而无需登录)。控制台在访问/logout时记录这一点。

代码语言:javascript
复制
 INFO  [servlets.Logout] (http--127.0.0.1-8080-4) ---- Principal = duke3                                                                                              
 INFO  [servlets.Logout] (http--127.0.0.1-8080-4) ---- Principal = null  
EN

回答 1

Stack Overflow用户

发布于 2013-11-17 13:31:48

是的,这就是基本身份验证的工作方式。大致顺序是:

  • 使用基本身份验证,浏览器将记住受保护的资源和凭据,并将它们与每个请求一起发送回受保护的资源。
  • 服务器创建会话并根据会话cookie对用户进行授权,尽管再次发送凭据(因此服务器不必每次只查看一次数据库)。
  • 注销servlet将被调用并正确销毁会话。但是,在下一个请求到受保护的资源时,浏览器发送凭据,服务器透明地将用户重新登录!(您可以通过检查会话cookie在注销后是否已更改来验证这一点。)

我们能做些什么?

  1. 接受事物的工作方式,即使您的逻辑适应基本身份验证。
  2. 使用表单身份验证(更漂亮,如您所期望的那样工作)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20025644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档