使用Tomcat j_security_check实现用户登录、注销功能

  本文使用Tomcat容器自身的访问控制机制实现简单用户身份认证和访问授权。

认证授权

  在tomcat-users.xml中配置系统内用户和角色。

<role rolename="admin"/>
<role rolename="assistant"/>
<role rolename="user"/>
<user username="user1" password="123456" roles="admin"/>
<user username="user2" password="123456" roles="assistant"/>
<user username="user3" password="123456" roles="assistant"/>
<user username="user4" password="123456" roles="user"/>
<user username="user5" password="123456" roles="user"/>

  之后配置Web应用中web.xml,如下。

<security-constraint>
    <display-name>Example Security Constraint</display-name>
    <web-resource-collection>
        <web-resource-name>My Test</web-resource-name>
        <url-pattern>/pages/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
        <role-name>assistant</role-name>
        <role-name>user</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>Example Form-Based Authentication Area</realm-name>
    <form-login-config>
        <form-login-page>/pages/Login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
</login-config>
<security-role>
    <description> the role is administrator</description>
    <role-name>role1</role-name>
</security-role>

  <url-pattern>属性配置需要授权的URL,本文指定整个pages目录中的页面都需要认证授权。<auth-constraint>属性配置能够访问授权URL的角色,角色阈值限于之前配置的tomcat-users.xml。<login-config>属性配置登录相关,<auth-method>属性值配置为FORM,因为这里采用自己实现的Login页面和error登录失败显示页面。<form-login-page>指定登录页面为/pages/Login.jsp,<form-error-page>指定登录失败页面为/error.jsp
  Login.jsp页面中核心代码如下。

<form class="form-signin" method="post" name="Login" action="j_security_check">
    <h2 class="form-signin-heading">请登陆</h2>
    <div class="login-wrap">
        <input  class="form-control" type="text"  name="j_username" placeholder="用户名" id="usrID">
        <input  class="form-control" type="password"  name="j_password" placeholder="密码" id="usrPsw">
        <label class="checkbox">
            <input type="checkbox" value="remember-me">记住我
            <span class="pull-right">
                <a data-toggle="modal" href="#myModal">忘记密码?</a>
            </span>
        </label>
        <button class="btn btn-lg btn-login btn-block" type="submit" style="margin-top:20px" onclick="setCookie()">登陆</button>
    </div>
</form>

  form的action处理程序固定为j_security_check,用户名、密码两个input组件的name属性固定为j_usernamej_password

注销

  Tomcat内置的认证访问机制使用session保存用户的认证授权信息,用户注销功能只需置session会话无效,专门写了一个LogoutServlet。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class Logout
 */
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.invalidate();
//      request.logout();
        response.sendRedirect("pages");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

  设置session无效之后跳转到登录URL即可,正常页面中使用<a href="../logout">退出登陆</a>,整个显示像这样。
  登录。

这里写图片描述

  注销。

这里写图片描述

  request.logout()方法使安全上下文无效,但是session会话仍然有效,理论上来说用户能够通过之前的URL继续访问应用。but,实际上不可以,因为当用户登出跳之后转到登录URL时,Tomcat容器已经新创建了一个session,保证之前的session已经无效,所以两种方法同样有效,之后开发最好就是一起用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值