SSM+Shiro遇到的那些坑

本文记录了作者在尝试搭建SSM框架过程中遇到的各种问题及解决方案,包括版本冲突、配置错误等,适合初学者参考。

这几天尝试自己搭建一套框架,一方面巩固一下基础,一方面尝试下各种新版本,结果就是——悲催,遇到了各种问题,解决起来简直吐血,以下总结下各种坑。

一、版本

1、VC层——Spring SpringMVC 4.1.6.RELEASE
2、M层——Mybatis 3.3.1
3、日志——log4j2.5
4、权限控制——Shiro 1.3.2
5、数据连接池——阿里 Druid1.0.27

好吧,用到的基本都是最新版本,JDK 1.8+eclipse neno 2+tomcat 8.5.9+maven

二、坑

1、第一坑就是上来就把pom和各种配置文件都弄好了,因为是参考的成熟项目,以为只是换下版本号即可,结果悲催了。pom就不贴了,反正网上一大把,找找就好了。

配置完后,启动Tomcat,Duang!启不来...报错如下(只贴关键部分,下面一大堆就不贴了)

java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]  
    at java.util.concurrent.FutureTask.report(Unknown Source)  
    at java.util.concurrent.FutureTask.get(Unknown Source)  

Unknown Source是什么鬼?开始baidu,结果大多数人的报错上还有jar包缺失提示的,我这里是啥也没有。但问题原因基本确定,maven导入的jar包问题,一般是jar损坏读取不了,但pom上是不会显示错误的。

我的没有说哪个jar包,所以只能一点点筛选,一般来说,先把除ssm核心jar以外的jar包注释,然后运行,可以启动,然后再一个个模块试别的,最终确定是shiro-web的问题。将本地maven下面关于这个jar包的文件夹删除,然后重新触发maven更新,问题解决。

2、解决之后,服务器起来了,但又开始大段的报错,部分问题很好处理,一般是配置文件中的引入class路径错误,建议每个class路径写完之后,按ctrl鼠标悬浮在上,看是否可以跳转,如果可以跳转,说明路径没错。

3、终于把所有路径问题处理了,然后log4j2又开始罢工了,网上大部分log4j2的介绍上都是说配置文件怎么弄,web.xml怎么弄,但忽略了一点,就是log4j2在servlet2.3上运行会有点问题,但maven自动构建出来的web项目就是servlet2.3的...于是更换web.xml文件为3,0,之所以要换3.0,就是因为在3.0上log4j2已经不用再web.xml上进行配置了,否则在servlet2.5上还要配监听器和过滤器,具体配置请baidu吧,多的是。

4、log4j2弄好了,然后启动,这回倒是不报错了,Java Resource上却莫名多了个x,但其中却没有任何报错的内容,查看Problem界面,提示Project Facets版本问题,于是乎右键点开项目——Properties——Project Facts,由于将web.xml换成了3.0,这里也需要对Dynamic Web Module的版本做下更改,现在还是2.3的状态,点击之后,修改——神马?改不了?

Cannot change version of project facet Dynamic Web Module to 3.0

继续上网查询,原来这个要改配置文件org.eclipse.wst.common.project.facet.core.xml 在eclipse workspace 项目下的.setting文件夹中

  <installed facet="java" version="1.8"/>
  <installed facet="jst.web" version="3.0"/>
以上两行改动即可,改动完有时候会发现eclipse还没有更新,重启一下或者使用Maven-Update Project就好了。但如果是使用后者,你会发现,update之后,这些项又变回去了。还需在pom.xml文件中加上maven的插件。

	<build>
		<finalName>mints</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

这样之后,终于没有小红叉了,但是,又掉进了另一个坑。

5、启动Tomcat之后,服务器是启动了,但竟然没有加载项目,项目部署进去了点击各种按钮也发布不上去,根本没有反应。这下头彻底大了,只能再次baidu,但发现答案都没有什么用。重启、重装tomcat都没有解决。于是还是把问题定位在项目上,查看刚刚改动的地方。惊奇的发现,Project Facts中的Dynamic Web Module竟然自动变成了3.1,。重新改回3.0之后,Update Project,又变成3.1了。确定肯定是跟刚才加入的插件有关,但插件的版本调了几个之后都发现无效。最后只能将web.xml中servlet的版本也调成3.1,这下项目终于能够正常加载上了。

以上5个大坑填了之后,至少项目跑起来了,也对自己有个记录,毕竟处理了很久,今后再遇到至少有点解决思路了





<think>好的,我现在需要处理用户关于SSMShiro整合的问题。首先,我得理解用户的需求是什么。SSM指的是Spring、Spring MVC和MyBatis的组合,而Shiro是一个安全框架,用于处理认证、授权等安全相关功能。用户可能想了解如何将这两个技术栈整合在一起,构建一个安全的Web应用。 接下来,我需要回忆SSMShiro的基本结构。SSM框架中,Spring负责管理Bean和事务,Spring MVC处理Web层请求,MyBatis作为ORM框架与数据库交互。Shiro则需要配置安全相关的组件,比如Realm、SessionManager、Filter等。整合的关键点应该是在Spring的配置文件中引入Shiro的相关配置,并确保Shiro的过滤器能够拦截请求。 然后,我需要考虑整合的具体步骤。可能包括添加Shiro的依赖,配置Shiro的Filter,定义Realm,以及在Spring中启用注解支持等。同时,需要注意Shiro的过滤器链配置,用于指定不同URL的访问权限。此外,可能还需要处理Shiro与Spring的Bean管理,比如让Shiro使用Spring的Bean容器。 另外,用户可能会遇到常见问题,比如依赖冲突、配置错误、权限注解不生效等。我需要准备一些常见问题的解决方法,比如检查依赖版本是否兼容,确认配置文件路径是否正确,以及如何开启Shiro的注解支持。 还有,用户可能需要示例代码或配置片段。比如,如何在web.xml中配置Shiro的Filter,如何在Spring的配置文件中定义Shiro相关的Bean,以及如何编写自定义的Realm类。同时,需要说明如何通过Shiro的注解进行方法级别的权限控制。 需要验证各个步骤是否正确。比如,确保Shiro的Filter在web.xml中的配置顺序正确,避免与其他过滤器冲突。检查Spring配置文件中的Bean定义是否正确注入,尤其是ShiroFilterFactoryBean的配置是否正确映射到URL和权限规则。自定义Realm是否正确地实现了认证和授权的逻辑,比如从数据库获取用户信息及权限。 可能还需要提到Shiro的会话管理,如何与Spring的Session管理整合,或者是否使用Shiro自带的会话管理。此外,密码加密的问题,比如使用Shiro的CredentialsMatcher和HashService来加密存储密码,提升安全性。 最后,整理这些思路,按照逻辑顺序分步骤解释,确保用户能够逐步跟随操作。同时,注意使用中文,保持回答结构清晰,正确应用LaTeX格式的行内公式和独立公式,但在这个问题中可能用到的技术术语较多,但根据用户的问题,可能不需要数学公式,所以需要确认是否需要调整。不过根据用户的问题,主要是技术步骤,可能不需要数学表达式,但需要确保遵循系统级指令中的格式要求,如果有任何技术术语内的公式,如算法表达式,可能需要用LaTeX,但此处可能较少。主要需要检查是否有需要格式化的地方,如类名、方法名等,但根据系统指令,可能不需要特别处理,除非用户特别指出。</think>### SSM + Shiro 整合指南 #### 1. **技术栈简介** - **SSM 框架**:Spring(IoC、AOP、事务管理) + Spring MVC(Web 层) + MyBatis(持久层)。 - **Shiro 框架**:轻量级安全框架,提供认证(Authentication)、授权(Authorization)、会话管理等功能。 #### 2. **整合步骤** ##### **2.1 添加依赖** 在 `pom.xml` 中添加 Shiro 依赖: ```xml <!-- Shiro 核心 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.9.0</version> </dependency> <!-- Shiro 与 Spring 整合 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.9.0</version> </dependency> ``` ##### **2.2 配置 Shiro Filter** 在 `web.xml` 中定义 Shiro 过滤器: ```xml <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` ##### **2.3 配置 Spring 整合** 在 Spring 配置文件(如 `applicationContext-shiro.xml`)中定义 Shiro 核心组件: ```xml <!-- 自定义 Realm --> <bean id="customRealm" class="com.example.CustomRealm"/> <!-- 安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="customRealm"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- Shiro 过滤器工厂 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login"/> <property name="unauthorizedUrl" value="/403"/> <property name="filterChainDefinitions"> <value> /static/** = anon /login = authc /admin/** = roles[admin] /** = user </value> </property> </bean> ``` ##### **2.4 自定义 Realm** 实现 `AuthorizingRealm` 类,处理认证与授权逻辑: ```java public class CustomRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 授权逻辑:根据用户查询角色/权限 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addRole("admin"); info.addStringPermission("user:delete"); return info; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) { // 认证逻辑:验证用户名密码 UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); String password = new String(upToken.getPassword()); if ("admin".equals(username) && "123456".equals(password)) { return new SimpleAuthenticationInfo(username, password, getName()); } throw new AuthenticationException("用户名或密码错误"); } } ``` ##### **2.5 启用 Shiro 注解** 在 Spring 配置中开启 AOP 支持: ```xml <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/> <aop:config/> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> ``` #### 3. **关键功能验证** - **认证测试**:访问受限 URL(如 `/admin`),未登录时跳转到 `/login`。 - **授权测试**:普通用户访问 `/admin` 应返回 403 错误。 - **注解控制**:在 Controller 方法上使用 `@RequiresRoles("admin")` 验证权限拦截。 #### 4. **常见问题** 1. **依赖冲突** 检查 Shiro 与 Spring 版本兼容性,推荐使用 Shiro 1.9.x + Spring 5.x。 2. **过滤器顺序** 在 `web.xml` 中,Shiro 过滤器需配置在 Spring MVC 前端控制器之前。 3. **注解不生效** 确保已启用 `AuthorizationAttributeSourceAdvisor` 和 AOP 支持。 #### 5. **扩展优化** - **加密存储**:使用 `HashedCredentialsMatcher` 对密码进行散列加密。 - **会话管理**:集成 Redis 实现分布式会话存储。 - **细粒度控制**:通过自定义 Filter 或标签库实现页面元素级权限控制。 #### 6. **总结** 通过整合 SSM + Shiro,可实现: - **统一认证**:集中管理用户登录验证。 - **动态授权**:基于角色/权限控制资源访问。 - **安全增强**:防御会话固定、CSRF 等攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值