简单的整合shiro和springmvc的例子

想要整合Shiro和springmvc,在网上找了很多例子,感觉都有一点复杂。所以就自己写了一个最简单整合项目,记录在这里以备后面查看。

这个例子包含如下三个部分:

1.简单的页面

2.shiro配置

3.springmvc配置

shiro可以直接和spring整合,但是这样需要单独配置spring用于整合shiro,在配置springmvc。配置文件看起来乱七八糟的。所以这里就shiro不采用spring来管理。因此这里的整合类似 shiro + servlet + springmvc。这样配置相对简单好理解。但也是最简单的配置,只能用于学习,用在实际项目中,还得改写。

下面是项目结构图(realm那个文件夹可有可没有,只是如果删除了,就需要将shiro.ini文件中 myrealm = shirospringweb.realm xxxx 那行删除掉)

下面是具体步骤

(1).添加依赖

既然是简单,那引用也是最少的,具体如下

dependencies {
// Use JUnit Jupiter for testing.
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.1' // This dependency is used by the application.
implementation 'com.google.guava:guava:30.1-jre' // ++ Adding Spring dependencies
implementation 'org.springframework:spring-context:5.3.9'
implementation 'org.springframework:spring-webmvc:5.3.9' // ++ Using Servlet for SpringMvc
implementation 'javax.servlet:javax.servlet-api:4.0.1' // ++ Using shiro-web
implementation 'org.apache.shiro:shiro-web:1.7.1'
}

其中前面两个是建立项目自带的,所以只需要引用后面的四个包就可以咯

(2).Servlet中配置Shiro

在servlet整合shiro,只需要在web.xml中引用shiro的上下文监听器(读取shiro配置文件),并配置shiro过滤器即可,具体如下:

<!-- Shiro直接拦截,不经过spring -->
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<!-- 对应filter-->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<!-- filter Mapping-->
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

在web.xml中配置好shiro后,需要在WEB-INF文件夹下书写shiro.ini的配置文件,具体如下

[main]
authc.loginUrl = /login
authc.usernameParam = username
authc.passwordParam = password
authc.successUrl = /
authc.failureKeyAttribute = shiroLoginFailure
logout.redirectUrl = /
myrealm = shirospringweb.realm.MyRealm [users]
liang = 123, role1
wang = 123, role2 [urls]
/ = anon
/test = anon
/test2 = authc
/login = authc
/logout = logout
/** = anon

这样shiro就可以配合servlet工作了

(3).配置springMVC

最简单springmvc的配置,只需要配置一个DispatcherServlet,并在其配置文件(resources/springmvc-base.xml)中打开包扫描,就好了,具体如下:

<!-- 配置SpringMVC -->
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-base.xml</param-value>
</init-param>
</servlet>
<!-- 对应servlet mapping -->
<servlet-mapping>
<servlet-name>springServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

resources/springmvc-base.xml的配置文件如下(主要是打开包扫描和注解驱动):

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="shirospringweb.controller"/> <mvc:annotation-driven /> <!-- 用来处理当 DispatcherServlet 拦截全部请求的时候,它在RequestHandler处捡出静态资源的请求 -->
<mvc:default-servlet-handler /> </beans>

然后书写上面shiro配置文件中的对应controller和前端页面就可以了。具体如下:

3.1 TestController 及其页面

TestController的代码,如下所示

package shirospringweb.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class TestController{
@RequestMapping("/test")
public String testPage(){
return "WEB-INF/pages/test.html";
}
}

对应前端页面,如下所示(别看他挺多的样子其实啥也没有,这里主要是将了一个在springmvc页面中也是中文的配置,可以当做没看见)

<html>
<head>
<title>TestPage</title>
</head>
<body>
TestPage,
<br/>
This Page only display English character.
<br />
To display chineses character, you should add an encoding filter in web.xml, like this
<br />
<br />
<br />
&lt;filter&gt;<br />
&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;<br />
&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;forceEncoding&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;/filter&gt;<br /> &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br /> </body>
</html>

3.2 Test2Controller 及其页面

Test2Controller的代码

package shirospringweb.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class Test2Controller { @RequestMapping("/test2")
public String getTest2Page(){
return "WEB-INF/pages/test2.html";
}
}

其对应的界面如下:

<html>
<head>
Test 2 Page
</head>
<body>
This is the test 2 page <br/>
(Can not display chinese Character, more information <a href="/app/test">click here</a>)
</body>
</html>

3.3 LoginController 及其对应的界面

LoginController的代码

package shirospringweb.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; @Controller
public class LoginController { @RequestMapping("/login")
public String getLogin(){
return "WEB-INF/pages/login.html";
}
}

其对应的登录界面

<html>
<head>Login Page</head>
<body>
This is Login Page With No Chinese Character
<br>
<form action="/app/login" method="POST">
username : <input name="username" /><br/>
password : <input name="password" /><br/>
<input type="submit" value="LOGIN"/>
</form>
</body>
</html>

好了,代码到这儿完事儿了,下面是运行的效果图

(4).运行效果

4.1 首先访问/app/test页面可以访问到(shiro未拦截)

页面如下

4.2 其实访问/app/test2需要登录,登录后需要后跳转(可能需要访问两次,有一次请求URL会带参数,这个shiro会报错,这是shiro的问题,可以百度解决)具体如下:

登录后跳转

访问/logout会退出到主页面,这个就不截图了

结束了

简单的整合 shiro + SpringMVC 例子的更多相关文章

  1. SpringMVC整合Shiro——(3)

    SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...

  2. SpringMVC整合Shiro权限框架

    尊重原创:http://blog.csdn.net/donggua3694857/article/details/52157313 最近在学习Shiro,首先非常感谢开涛大神的<跟我学Shiro ...

  3. SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能

    SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...

  4. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  5. Spring Boot 最简单整合Shiro+JWT方式

    简介 目前RESTful大多都采用JWT来做授权校验,在Spring Boot 中可以采用Shiro和JWT来做简单的权限以及认证验证,在和Spring Boot集成的过程中碰到了不少坑.便结合自身以 ...

  6. SpringBoot整合Shiro权限框架实战

    什么是ACL和RBAC ACL Access Control list:访问控制列表 优点:简单易用,开发便捷 缺点:用户和权限直接挂钩,导致在授予时的复杂性,比较分散,不便于管理 例子:常见的文件系 ...

  7. Spring整合Shiro做权限控制模块详细案例分析

    1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.sh ...

  8. 补习系列(6)- springboot 整合 shiro 一指禅

    目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...

  9. SSM整合shiro

    采用maven构建项目 1pom.xml中加入shiro依赖 <!-- shiro --> <dependency> <groupId>org.apache.shi ...

随机推荐

  1. Jenkins CI&CD 自动化发布项目实战(上篇)

    Jenkins CI&CD 自动化发布项目实战(上篇) 作者 刘畅 时间 2020-11-28 实验环境 centos7.5 主机名 ip 服务配置 软件 gitlab 172.16.1.71 ...

  2. 35、mysql数据库(ddl)

    35.1.数据库之库操作: 1.创建数据库(在磁盘上创建一个对应的文件夹): create database [if not exists] db_name [character set xxx]; ...

  3. Pptx的多路径形状转为WPF的Path

    本文是将演示如何解析pptx文件的多路径的形状转换到WPF,绘制多个Shape的Path Shape Path 这是Pptx的[标注:弯曲曲线(无边框)]形状的OpenXml定义部分: <cal ...

  4. WinUI桌面版替换UWP项目实际使用

    最近做了一个3D打印的RC遥控车.然后就想着用xbox手柄控制小车的前进和转向吧,于是就用surface平板接收收手柄的数据,然后通过串口的2.4G模块传输数据,看上挺简单的,其实本身也挺简单的. 我 ...

  5. Kafka:Springboot整合Kafka消息队列

    本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 项目结构 pom依赖包 <?xml version="1 ...

  6. pip与apt-get的使用

    pip的使用 pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. pip --version    #python2.x 版本命令,显示版本和路径 p ...

  7. leetcode147对链表进行插入排序

    题目: 对链表进行插入排序. 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当 ...

  8. SEO入门一篇就够-SEO教程

    大家口中的SEO(Search Engine Optimization),中文翻译为"搜索引擎优化",从本质上来说,其实就是如何迎合搜索引擎的规则,使得网站在搜索结果中能有更好的排 ...

  9. CF277E Binary Tree on Plane

    CF277E Binary Tree on Plane 题目大意 给定平面上的 \(n\) 个点,定义两个点之间的距离为两点欧几里得距离,求最小二叉生成树. 题解 妙啊. 难点在于二叉的限制. 注意到 ...

  10. python使用笔记23--面向对象编程

    1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌 面向对象编程 卖车处: 1.4s 2.保险 3.交税 ...