您的位置:首页 > 运维架构 > Tomcat

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

2017-04-20 22:25 881 查看
  本文使用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_username
j_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已经无效,所以两种方法同样有效,之后开发最好就是一起用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐