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>
Shiro与基本web环境整合登陆验证实例的更多相关文章
- Shrio登陆验证实例详细解读(转)
摘要:本文采用了Spring+SpringMVC+Mybatis+Shiro+Msql来写了一个登陆验证的实例,下面来看看过程吧!整个工程基于Mavevn来创建,运行环境为JDK1.6+WIN7+to ...
- Shiro安全框架入门篇(登录验证实例详解与源码)
转载自http://blog.csdn.net/u013142781 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和J ...
- Shiro学习总结(4)——Shrio登陆验证实例详细解读
最终效果如下: 工程整体的目录如下: Java代码如下: 配置文件如下: 页面资源如下: 好了,下面来简单说下过程吧! 准备工作: 先建表: [sql] view plain copy drop ta ...
- HTML5 web Form表单验证实例
HTML5 web Form 的开发实例! index.html <!DOCTYPE html> <html> <head> <meta charset=&q ...
- MVC用户登陆验证及权限检查(Form认证)
1.配置Web.conf,使用Form认证方式 <system.web> <authentication mode="None" /> ...
- 2016-02-20WebForm登陆验证,判断用户是否登陆 PageBase类
http://blog.csdn.net/fanbin168/article/details/49404233 很多时候,WebFrom页面,我们需要判断用户是否已经登陆了.假如有很多页面,难道我们要 ...
- form表单使用(博客系统的登陆验证,注册)
先从小的实例来看form的用法 登陆验证实例,来看form的常规用法 1. forms.py # 用于登陆验证验证 from django.core.validators import RegexVa ...
- 18.Shiro与Springboot整合下登陆验证UserService未注入的问题
Shiro与Springboot整合下登陆验证UserService未注入的问题 前言: 刚开始整合的情况下,UserService一执行,就会报空指针异常. 看了网上各位大神的讲解,什么不能用ser ...
- Shiro集成web环境[Springboot]-认证与授权
Shiro集成web环境[Springboot]--认证与授权 在登录页面提交登陆数据后,发起请求也被ShiroFilter拦截,状态码为302 <form action="${pag ...
随机推荐
- Asp.net MVC Form认证,IIS改成集成模式后,FormsAuthentication.SetAuthCookie无效,Request.IsAuthenticated值,始终为false,页面提示HTTP 错误 401.0 - Unauthorized,您无权查看此目录或页面
最近公司领导要求,IIS网站要由经典模式改为集成模式,以提高性能.改完之后,登录成功跳转到主页之后,页面提示“”HTTP 错误 401.0 - Unauthorized“,“您无权查看此目录或页面”, ...
- invalid context 0x0.
在展示图片或者做二维码的时候,若是宽或者高有一个为零的情况就会报错:CGBitmapContextCreateImage: invalid context 0x0. If you want to se ...
- Oracle数据仓库套件
OBIEE RPD:定义不同分析的主题角度,确定相应的事实表和维度表 报表层:选取需要的维度和度量,根据筛选器选取需要的数据 可视化:用图形展示数据,支持常见的图形:如折线图,饼图,堆叠图等. ODI ...
- python学习5---实现凸包
1.暴力法 def g(A,B,P): """ 判断点PA矢量在AB矢量的顺时针还是逆时针方向, 若在逆时针方向则返回1,同向返回0,在顺时针方向返回-1 :param ...
- useradd和groupadd(Linux创建用户\用户组\设置\分配用户权限\多用户远程登录权限)的使用
前言: man useradd man groupadd info useradd info groupadd 都可以获取相关命令的用法信息. 个人比较喜欢读英文解释文档,没有你想象的那么comp ...
- jQuery基础之二
jQuery基础之二 jQuery的中文文档十分详细,并且权威.W3C的jQuery文档更加简单实用. jQuery 1.9.0 jQuery中文文档W3C的jQuery文档 jQuery操作DO ...
- vue重温之mint-ui------------点击事件绑定
第一次接触mint-ui,在使用它的tabbar时,为了达到点击切换页面的效果,采用了点击事件的方式,然后就碰到了这么个问题: 是的,点击事件是不起作用的. 然后刚好一个朋友也在做这块,而且有一段时间 ...
- SOFARPC —— SPI 解析
一.前言 我之前研究过微博的Motan框架(当时接触的第一个RPC框架),当时懵懵懂懂,现在,上手SOFARPC框架,感觉比较轻松,事物的本质都是相通的.以前写博文,会逐行分析源码,慢慢地发现,源码其 ...
- 引擎设计跟踪 ShadowMap 细节和分析
之前在工作总汇总了shadowmap的各种问题 [工作积累] shadow map问题汇总 最近有点时间再仔细研究了shadowmap的一些算法.主要修复了LiSPSM(上面链接里后面有更新),实现了 ...
- 2D游戏与3D游戏的区别 原文:https://zhidao.baidu.com/question/588490865.html
2D和3D间有哪些不同点呢? 让我们来比较一下,共同找出它俩之间的不同点. 对玩家来说,2D技术和3D技术只是显示数据的方式而已,玩家都是通过二 维的平面显示器来观看它们.对制作者来说,二者的不同之处 ...