Shiro与基本web环境整合登陆验证实例

1. 用maven导入Shiro依赖包

 <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.2.2</version>
</dependency>
 <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.3</version>
  </dependency> 

2.配置web.xml

   <!-- 初始化shiro web environment -->
    <listener>
          <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
  </listener>

<!-- 设置shiro拦截器-->
   <filter>
      <filter-name>ShiroFilter</filter-name>
      <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
  </filter>

  <filter-mapping>
      <filter-name>ShiroFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

3.配置初始化shiro的配置文件 shiro.ini放在类文件根目录

[main]
authc.loginUrl=/login
authc.successUrl=/index
[users]
zhang=123,role1,role2
wang=123,role1
[urls]
/login=authc
/logout=logout
/* = authc

4.创建一个servlet并映射至登陆路径/login

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public LoginServlet() {
        super();
    }
	/**GET请求显示登录界面同时显示错误信息
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//显示登录界面
		request.getRequestDispatcher("/login.jsp").forward(request, response);
	}

	/**FormAuthenticationFilter将会拦截POST请求进行登录操作,我们不需要再做登录操作。
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("登录失败才会进入doPost方法。因为拦截器拦截了POST请求进行登录,登录成功则直接跳转至访问页面。登录失败后才进入Post方法");
		System.out.println("登录失败才再登录界面,并添加错误信息");

		//FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME值为shiroLoginFailure,保存了登录错误信息,值为异常的类全名
		String errorFullClassName = (String)request.getAttribute(FormAuthenticationFilter.DEFAULT_ERROR_KEY_ATTRIBUTE_NAME);
		String cerrorKey="error";//客户端显示的错误信息
		if(UnknownAccountException.class.getName().equals(errorFullClassName)){
			//未知账户
			request.setAttribute(cerrorKey, "用户名密码错误");
		}else if(IncorrectCredentialsException.class.getName().equals(errorFullClassName)){
			//密码错误
			request.setAttribute(cerrorKey, "用户名密码错误");
		}else{
			//其他错误如账户锁定等等
			request.setAttribute(cerrorKey, "其他错误");
		}
		//显示登录界面
		doGet(request, response);
	}

}

  

  <servlet>
      <servlet-name>LoginServlet</servlet-name>
      <servlet-class>baseshiroweb.LoginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
      <servlet-name>LoginServlet</servlet-name>
      <url-pattern>/login</url-pattern>
  </servlet-mapping>

5.创建一个登陆界面login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
登陆界面<br/>
<form action="/baseshiroweb/login" method="post">

   Username: <input type="text" name="username"/> <br/>
   Password: <input type="password" name="password"/><br/>
   <input type="checkbox" name="rememberMe" value="true"/>Remember Me?<br/>
   <input type="submit" value="提交"/>
</form>
${error}
</body>
</html>

6.创建一个登陆成功后的信息显示servlet并添加退出

public class MyServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().println("<html>");
		resp.getWriter().println("hello shiro web"+"<br/>");
		Subject subject = SecurityUtils.getSubject();
		resp.getWriter().println("principal:"+subject.getPrincipal()+"<br/>");
		resp.getWriter().println("isAuthenticated"+subject.isAuthenticated()+"<br/>");
		resp.getWriter().println("<a href=‘/baseshiroweb/logout‘>logout</a>");
		resp.getWriter().println("</html>");
	}
}
  <servlet>
      <servlet-name>myservlet</servlet-name>
      <servlet-class>baseshiroweb.MyServlet</servlet-class>
  </servlet>

    <servlet-mapping>
      <servlet-name>myservlet</servlet-name>
      <url-pattern>/index</url-pattern>
  </servlet-mapping>

 此时访问http://localhost:8080/baseshiroweb/index

执行流程:

1.将会请求/index路径 

2.匹配Shiro配置文件里的[urls]内的/*路径的authc拦截器,跳转至登陆登陆界面/login

3.在/login进行登录操作,成功则跳转至/index,失败则返回/login界面并显示错误信息

4./index成功登录后,点击超链接logout访问/logout进行退出操作。/logout路径匹配logout拦截器。

完整的web.xml为

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

  <display-name>Archetype Created Web Application</display-name>
   <!-- 初始化shiro web environment -->
    <listener>
          <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
  </listener>

<!-- 设置shiro拦截器-->
   <filter>
      <filter-name>ShiroFilter</filter-name>
      <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
  </filter>

  <filter-mapping>
      <filter-name>ShiroFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
      <servlet-name>myservlet</servlet-name>
      <servlet-class>baseshiroweb.MyServlet</servlet-class>
  </servlet>

    <servlet-mapping>
      <servlet-name>myservlet</servlet-name>
      <url-pattern>/index</url-pattern>
  </servlet-mapping>

  <servlet>
      <servlet-name>LoginServlet</servlet-name>
      <servlet-class>baseshiroweb.LoginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
      <servlet-name>LoginServlet</servlet-name>
      <url-pattern>/login</url-pattern>
  </servlet-mapping>

</web-app>
时间: 2024-11-02 18:11:56

Shiro与基本web环境整合登陆验证实例的相关文章

Shrio登陆验证实例详细解读

摘要:本文采用了Spring+SpringMVC+Mybatis+Shiro+Msql来写了一个登陆验证的实例,下面来看看过程吧!整个工程基于Mavevn来创建,运行环境为JDK1.6+WIN7+tomcat7. 这里主要说了Shiro的搭建过程,Spring+SpringMVC+Mybatis的搭建过可以看这里Spring+Mybatis+SpringMVC+Maven+MySql搭建实例 整个工程免费下载: 最终效果如下: 工程整体的目录如下: java代码如下: 配置文件如下: 页面资源如

【Servlet】Servlet简单登陆验证实例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要实现Servlet简单登陆验证实例.结构如下 1.LoginCheck.java package com.mucfc; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annota

Shiro安全框架入门篇(登录验证实例详解与源码)

一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和JavaEE项目中都可以使用.它主要用来处理身份认证,授权,企业会话管理和加密等.Shiro的具体功能点如下: (1)身份认证/登录,验证用户是不是拥有相应的身份: (2)授权,即权限验证,验证某个已认证的用户是否拥有某个权限:即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色.或者细粒度的验证某个用户对某个资源是否具有某个权限: (3)会话管理,即用户登录

HTML5 web Form表单验证实例

HTML5 web Form 的开发实例! index.html 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>HTML5表单验证</title> 6 <link rel="stylesheet" type="text/css" href="../css/style.

细说shiro之在web应用中使用shiro

官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version></dependency> <depen

MVC用户登陆验证及权限检查(Form认证)

1.配置Web.conf,使用Form认证方式 <system.web> <authentication mode="None" /> <compilation debug="true" targetFramework="4.6.1" /> <httpRuntime targetFramework="4.6.1" /> <authentication mode="

(转)shiro权限框架详解06-shiro与web项目整合(下)

http://blog.csdn.net/facekbook/article/details/54962975 shiro和web项目整合,实现类似真实项目的应用 web项目中认证 web项目中授权 shiro缓存 sessionManager使用 验证码功能实现 记住我功能实现 web项目中认证 实现方式 修改CustomRealm 的 doGetAuthenticationInfo 方法,从数据库中获取用户信息,CustomRealm 返回查询到的用户信息,包括(加密后的密码字符串和salt

(转) shiro权限框架详解06-shiro与web项目整合(上)

http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springMVC+mybatis,所以我们是基于搭建好的项目进行改造的. 将shiro整合到web应用中 登录 退出 认证信息在页面展现,也就是显示菜单 shiro的过滤器 将shiro整合到web应用中 数据库脚步 sql脚步放到项目中,项目上传到共享的资源中,文章最后给出共享url. 去除项目中不使用shi

Shiro集成web环境[Springboot]-认证与授权

Shiro集成web环境[Springboot]--认证与授权 在登录页面提交登陆数据后,发起请求也被ShiroFilter拦截,状态码为302 <form action="${pageContext.request.contextPath}/user/login" method="post"> Username:<input type="text" name="username"></br>