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 ...
随机推荐
- 利用 SPICE 分析理解心电图前端中的右腿驱动
[导读] 心电图(ECG)学是一门将心脏离子去极(ionic depolarization) 后转换为分析用可测量电信号的科学.模拟电子接口到电极/患者设计中最为常见的难题之一便是优化右腿驱动 ( ...
- leetcode 687.Longest Univalue Path
寻找最长的路径,那么会在左边或者右边或者是从左到跟然后再到右方的路径的. /** * Definition for a binary tree node. * struct TreeNode { * ...
- firefox support.mozilla.org 的管理员没有正确配置好此网站。为避免您的信息失窃,Firefox 并未与此网站建立连接。
1.在地址栏输入:"about:config"-我了解此风险: 2.右键-新建-布尔: 3.在框内输入:security.enterprise_roots.enabled-确定-搜 ...
- 准备学习wrf
namelist.wps 中的 geog_data_path=后面的文件夹的文件即土地覆被资料:(看下图) 推荐中科院地理所承担的地球系统科学数据共享平台上共享的100m分辨率资料,官网 http: ...
- 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...
- Python 虚拟环境[virtualenv/virtualenvwrapper]设置
virtualenv virtualenv 是一个可以在同一计算机中隔离多个python版本的工具.有时,两个不同的项目可能需要不同版本的python,如 python2.6.6 / python ...
- VM克隆centos7虚拟机并配置网络
笔者这里有个配置好网络的centos7系统,下面将根据这个centos7克隆出一个centos7系统,并配置好网络 1.右键虚拟机克隆 2.选择创建完整克隆 3.克隆机的命名,点击完成 4.可看到这里 ...
- IO文件流
定义:流是一种抽象的概念,通过流的方式组成无结构字符和字符序列,从流中取数据的操作进行输入输出.[io流的作用就是用流的方式进行输入输出] 常用语法: 1. 首先引用using.system.io ...
- Ubuntu 16下单机安装配置zookeeper和kafka
网上其他的没有一个能直接照做完成的,我这个也是看了些帖子,整出来的怕以后忘记 建议连接工具:Bitvise SSH Client 一.安装配置zookeeper 下载zookeeper 3.4.13: ...
- 16.1 解决SecureCRT的Home+End+Del不好用使用方法
有些时候 securecrt 的快捷键 与我们使用习惯不一致时,可以自己动手修改下映射文件. SecureCRT菜单 :工具→键映射编辑器,在弹出的键盘中点击“home”,会弹出一个窗口,在“发送字符 ...