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

来源:互联网 发布:java构造器使用实例 编辑:程序博客网 时间:2024/06/05 09:25

  本文使用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已经无效,所以两种方法同样有效,之后开发最好就是一起用。

0 0
原创粉丝点击