spring篇-(ssm整合shiro)

青旅半醒 2022-11-16 04:58 269阅读 0赞

ssm整合shiro

  • 初始化项目结构
  • 启动项目

初始化项目结构

项目基于maven的ssm架构,最终打包的结果为war
结构如下图
在这里插入图片描述

项目pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.lhstack</groupId>
  5. <artifactId>shiro-spring-web</artifactId>
  6. <version>0.0.1</version>
  7. <packaging>war</packaging>
  8. <properties>
  9. <maven.compiler.source>11</maven.compiler.source>
  10. <maven.compiler.target>11</maven.compiler.target>
  11. <spring.version>5.3.5</spring.version>
  12. <shiro.version>1.7.1</shiro.version>
  13. <spring-security.version>5.4.5</spring-security.version>
  14. <jackson.version>2.12.2</jackson.version>
  15. </properties>
  16. <dependencies>
  17. <!-- junit -->
  18. <dependency>
  19. <groupId>junit</groupId>
  20. <artifactId>junit</artifactId>
  21. <version>${junit.version}</version>
  22. <scope>test</scope>
  23. </dependency>
  24. <!-- spring整合 junit -->
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-test</artifactId>
  28. <version>${spring.version}</version>
  29. </dependency>
  30. <!-- log4j2 -->
  31. <dependency>
  32. <groupId>org.apache.logging.log4j</groupId>
  33. <artifactId>log4j-api</artifactId>
  34. <version>${log4j.version}</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.apache.logging.log4j</groupId>
  38. <artifactId>log4j-core</artifactId>
  39. <version>${log4j.version}</version>
  40. </dependency>
  41. <!-- json序列化工具相关依赖 -->
  42. <dependency>
  43. <groupId>com.fasterxml.jackson.core</groupId>
  44. <artifactId>jackson-databind</artifactId>
  45. <version>${jackson.version}</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>com.fasterxml.jackson.core</groupId>
  49. <artifactId>jackson-core</artifactId>
  50. <version>${jackson.version}</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>com.fasterxml.jackson.core</groupId>
  54. <artifactId>jackson-annotations</artifactId>
  55. <version>${jackson.version}</version>
  56. </dependency>
  57. <!-- 加密工具依赖 -->
  58. <dependency>
  59. <groupId>org.springframework.security</groupId>
  60. <artifactId>spring-security-crypto</artifactId>
  61. <version>${spring-security.version}</version>
  62. </dependency>
  63. <!-- shiro整合spring的相关依赖 -->
  64. <dependency>
  65. <groupId>org.apache.shiro</groupId>
  66. <artifactId>shiro-spring</artifactId>
  67. <version>${shiro.version}</version>
  68. </dependency>
  69. <!-- servlet -->
  70. <dependency>
  71. <groupId>javax.servlet</groupId>
  72. <artifactId>javax.servlet-api</artifactId>
  73. <version>4.0.1</version>
  74. <scope>provided</scope>
  75. </dependency>
  76. <!-- web -->
  77. <dependency>
  78. <groupId>org.springframework</groupId>
  79. <artifactId>spring-web</artifactId>
  80. <version>${spring.version}</version>
  81. </dependency>
  82. <!-- spring上下文初始依赖 -->
  83. <dependency>
  84. <groupId>org.springframework</groupId>
  85. <artifactId>spring-context</artifactId>
  86. <version>${spring.version}</version>
  87. </dependency>
  88. <dependency>
  89. <groupId>org.springframework</groupId>
  90. <artifactId>spring-core</artifactId>
  91. <version>${spring.version}</version>
  92. </dependency>
  93. <dependency>
  94. <groupId>org.springframework</groupId>
  95. <artifactId>spring-beans</artifactId>
  96. <version>${spring.version}</version>
  97. </dependency>
  98. <!-- webmvc -->
  99. <dependency>
  100. <groupId>org.springframework</groupId>
  101. <artifactId>spring-webmvc</artifactId>
  102. <version>${spring.version}</version>
  103. </dependency>
  104. <!-- aop相关 -->
  105. <dependency>
  106. <groupId>org.springframework</groupId>
  107. <artifactId>spring-aop</artifactId>
  108. <version>${spring.version}</version>
  109. </dependency>
  110. <dependency>
  111. <groupId>org.springframework</groupId>
  112. <artifactId>spring-aspects</artifactId>
  113. <version>${spring.version}</version>
  114. </dependency>
  115. </dependencies>
  116. <build>
  117. <plugins>
  118. <plugin>
  119. <groupId>org.apache.maven.plugins</groupId>
  120. <artifactId>maven-war-plugin</artifactId>
  121. <version>3.3.0</version>
  122. </plugin>
  123. </plugins>
  124. </build>
  125. </project>

log4j2配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="warn" name="MyApp" packages="">
  3. <Appenders>
  4. <Console name="Console" target="SYSTEM_OUT">
  5. <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
  6. </Console>
  7. <!-- info-->
  8. <RollingRandomAccessFile name="InfoAppendLogger" fileName="logs/info/info.log" filePattern="logs/info/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}-%i.log">
  9. <PatternLayout>
  10. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  11. </PatternLayout>
  12. <!-- 过滤日志级别 -->
  13. <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
  14. <Policies>
  15. <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
  16. <SizeBasedTriggeringPolicy size="50 MB"/>
  17. </Policies>
  18. <!-- 清理过期日志 -->
  19. <DefaultRolloverStrategy>
  20. <Delete basePath="logs/info/" maxDepth="2">
  21. <IfFileName glob="*/*.log" />
  22. <IfLastModified age="7d" />
  23. </Delete>
  24. </DefaultRolloverStrategy>
  25. </RollingRandomAccessFile>
  26. <Async name="AsyncInfoLoggerAppender">
  27. <AppenderRef ref="InfoAppendLogger"/>
  28. </Async>
  29. <!-- error-->
  30. <RollingRandomAccessFile name="ErrorAppendLogger" fileName="logs/error/error.log" filePattern="logs/error/$${date:yyyy-MM-dd}/error-%d{yyyy-MM-dd}-%i.log">
  31. <PatternLayout>
  32. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  33. </PatternLayout>
  34. <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
  35. <Policies>
  36. <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
  37. <SizeBasedTriggeringPolicy size="50 MB"/>
  38. </Policies>
  39. <DefaultRolloverStrategy>
  40. <Delete basePath="logs/error/" maxDepth="2">
  41. <IfFileName glob="*/*.log" />
  42. <IfLastModified age="7d" />
  43. </Delete>
  44. </DefaultRolloverStrategy>
  45. </RollingRandomAccessFile>
  46. <Async name="AsyncErrorLoggerAppender">
  47. <AppenderRef ref="ErrorAppendLogger"/>
  48. </Async>
  49. <!-- warn-->
  50. <RollingRandomAccessFile name="WarnAppendLogger" fileName="logs/warn/warn.log" filePattern="logs/warn/$${date:yyyy-MM-dd}/warn-%d{yyyy-MM-dd}-%i.log">
  51. <PatternLayout>
  52. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  53. </PatternLayout>
  54. <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
  55. <Policies>
  56. <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
  57. <SizeBasedTriggeringPolicy size="50 MB"/>
  58. </Policies>
  59. <DefaultRolloverStrategy>
  60. <Delete basePath="logs/warn/" maxDepth="2">
  61. <IfFileName glob="*/*.log" />
  62. <IfLastModified age="7d" />
  63. </Delete>
  64. </DefaultRolloverStrategy>
  65. </RollingRandomAccessFile>
  66. <Async name="AsyncWarnLoggerAppender">
  67. <AppenderRef ref="WarnAppendLogger"/>
  68. </Async>
  69. <!-- debug-->
  70. <RollingRandomAccessFile name="DebugAppendLogger" fileName="logs/debug/debug.log" filePattern="logs/debug/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}-%i.log">
  71. <PatternLayout>
  72. <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
  73. </PatternLayout>
  74. <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
  75. <Policies>
  76. <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
  77. <SizeBasedTriggeringPolicy size="50 MB"/>
  78. </Policies>
  79. <DefaultRolloverStrategy>
  80. <Delete basePath="logs/debug/" maxDepth="2">
  81. <IfFileName glob="*/*.log" />
  82. <IfLastModified age="7d" />
  83. </Delete>
  84. </DefaultRolloverStrategy>
  85. </RollingRandomAccessFile>
  86. <Async name="AsyncDebugLoggerAppender">
  87. <AppenderRef ref="DebugAppendLogger"/>
  88. </Async>
  89. </Appenders>
  90. <Loggers>
  91. <Root level="debug">
  92. <AppenderRef ref="AsyncInfoLoggerAppender"/>
  93. <AppenderRef ref="AsyncErrorLoggerAppender"/>
  94. <AppenderRef ref="AsyncWarnLoggerAppender"/>
  95. <AppenderRef ref="AsyncDebugLoggerAppender"/>
  96. <AppenderRef ref="Console" />
  97. </Root>
  98. </Loggers>
  99. </Configuration>

web.xml配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  3. <!-- 拦截所有请求,让所有请求都走DispatcherServlet -->
  4. <servlet>
  5. <servlet-name>DispatcherServlet</servlet-name>
  6. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  7. <init-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>classpath:spring-mvc.xml</param-value>
  10. </init-param>
  11. </servlet>
  12. <servlet-mapping>
  13. <servlet-name>DispatcherServlet</servlet-name>
  14. <url-pattern>/</url-pattern>
  15. </servlet-mapping>
  16. <!-- 字符编码处理 -->
  17. <filter>
  18. <filter-name>CharacterFilter</filter-name>
  19. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  20. <init-param>
  21. <param-name>encoding</param-name>
  22. <param-value>UTF-8</param-value>
  23. </init-param>
  24. <init-param>
  25. <param-name>forceRequestEncoding</param-name>
  26. <param-value>true</param-value>
  27. </init-param>
  28. <init-param>
  29. <param-name>forceResponseEncoding</param-name>
  30. <param-value>true</param-value>
  31. </init-param>
  32. </filter>
  33. <filter-mapping>
  34. <filter-name>CharacterFilter</filter-name>
  35. <url-pattern>/*</url-pattern>
  36. </filter-mapping>
  37. <filter>
  38. <!--和bean里面的shiroFilterFactoryBean名称必须相同,不然不会生效,代理与filter同名的bean,让被代理的filter拥有springbean的功能-->
  39. <filter-name>shiroFilterFactoryBean</filter-name>
  40. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  41. <init-param>
  42. <param-name>targetFilterLifecycle</param-name>
  43. <param-value>true</param-value>
  44. </init-param>
  45. </filter>
  46. <filter-mapping>
  47. <filter-name>shiroFilterFactoryBean</filter-name>
  48. <url-pattern>/*</url-pattern>
  49. <dispatcher>REQUEST</dispatcher>
  50. <dispatcher>ERROR</dispatcher>
  51. </filter-mapping>
  52. <!-- 启动监听器,加载webmvc以外的配置文件,用于配置容器隔离 -->
  53. <listener>
  54. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  55. </listener>
  56. <context-param>
  57. <param-name>contextConfigLocation</param-name>
  58. <param-value>classpath:application-*.xml</param-value>
  59. </context-param>
  60. </web-app>

spring-mvc.xml配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
  3. <!-- 开启mvc注解驱动,同WebMvcConfigurer -->
  4. <mvc:annotation-driven>
  5. <mvc:message-converters>
  6. <!-- 配置json序列化转换器 -->
  7. <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  8. <property name="defaultCharset" value="UTF-8" />
  9. </bean>
  10. </mvc:message-converters>
  11. </mvc:annotation-driven>
  12. <!-- 视图解析器 -->
  13. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  14. <property name="prefix" value="/WEB-INF/" />
  15. <property name="suffix" value=".jsp" />
  16. </bean>
  17. <!-- controller包扫描工具,用于扫描controller接口,spring-mvc需要配置此功能 -->
  18. <context:component-scan base-package="com.lhstack.spring.shiro.controller">
  19. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  20. </context:component-scan>
  21. </beans>

shiro相关配置
application-shiro.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  3. <!-- shiro核心过滤器,所有的功能都来自于这个类 -->
  4. <bean name="shiroFilterFactoryBean" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  5. <property name="securityManager" ref="webSecurityManager" />
  6. <!-- 如果在filterChainDefinitionMap配置了如 key=login value=login,那登录成功之后会回调这个地址 -->
  7. <property name="successUrl" value="/" />
  8. <!-- 未登录重定向的地址 -->
  9. <property name="loginUrl" value="/login.jsp" />
  10. <!-- 登录成功,但是访问地址未授权,重定向地址 -->
  11. <property name="unauthorizedUrl" value="/405.jsp" />
  12. <!-- 配置路由规则,key为路由,value为规则 -->
  13. <!-- anon 不做任何处理,logout 退出登录 login 登录 authc 需要授权 其他过滤器功能可以在org.apache.shiro.web.filter.mgt.DefaultFilter类中查看 -->
  14. <property name="filterChainDefinitionMap">
  15. <map>
  16. <entry key="/login.jsp" value="anon" />
  17. <entry key="/login" value="anon" />
  18. <entry key="/session" value="anon" />
  19. <entry key="/**" value="authc" />
  20. </map>
  21. </property>
  22. </bean>
  23. <!-- 密码匹配器,自定义 -->
  24. <bean name="bcryPasswordMatcher" class="com.lhstack.spring.shiro.matcher.BcryPasswordMatcher" >
  25. <property name="passwordEncoder" ref="bCryptPasswordEncoder" />
  26. </bean>
  27. <!-- realm,需要自己实现 -->
  28. <bean name="testRealm" class="com.lhstack.spring.shiro.realm.TestRealm">
  29. <property name="passwordEncoder" ref="bCryptPasswordEncoder" />
  30. <!-- 注入密码匹配器 -->
  31. <property name="credentialsMatcher" ref="bcryPasswordMatcher" />
  32. </bean>
  33. <!-- webSecurityManager,shiroFilterFactoryBean需要此类,用于管理授权认证的操作 -->
  34. <bean name="webSecurityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" >
  35. <property name="realm" ref="testRealm" />
  36. <property name="sessionManager" ref="webSessionManager" />
  37. </bean>
  38. <!-- 自定义session管理器,用来持久session,可扩展实现分布式session -->
  39. <bean name="localSessionDao" class="com.lhstack.spring.shiro.session.LocalSessionDao" />
  40. <!-- 初始化realm,会回调realm的onInit方法-->
  41. <bean class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
  42. <!-- session管理器,管理session -->
  43. <bean name="webSessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
  44. <!-- 取消sessionid重写功能,防止页面报错 -->
  45. <property name="sessionIdUrlRewritingEnabled" value="false"/>
  46. <property name="sessionDAO" ref="localSessionDao" />
  47. </bean>
  48. <!-- 密码编码匹配工具 -->
  49. <bean name="bCryptPasswordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
  50. <!-- 开启aop支持 注解鉴权需要aop功能支持 -->
  51. <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
  52. <!-- 开启shiro注解权限的功能 -->
  53. <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor" />
  54. </beans>

TestRealm.java

  1. package com.lhstack.spring.shiro.realm;
  2. import org.apache.shiro.authc.AuthenticationException;
  3. import org.apache.shiro.authc.AuthenticationInfo;
  4. import org.apache.shiro.authc.AuthenticationToken;
  5. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  6. import org.apache.shiro.authz.AuthorizationInfo;
  7. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  8. import org.apache.shiro.realm.AuthorizingRealm;
  9. import org.apache.shiro.subject.PrincipalCollection;
  10. import org.springframework.security.crypto.password.PasswordEncoder;
  11. import java.util.Collections;
  12. public class TestRealm extends AuthorizingRealm {
  13. //模拟盐值的功能
  14. public static final String SALT = "asxkdhz1568462416575";
  15. //密码工具
  16. private PasswordEncoder passwordEncoder;
  17. public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
  18. this.passwordEncoder = passwordEncoder;
  19. }
  20. @Override
  21. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
  22. return new SimpleAuthorizationInfo(Collections.singleton("ADMIN"));
  23. }
  24. @Override
  25. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
  26. String username = (String) authenticationToken.getPrincipal();
  27. char[] passwordArray = (char[]) authenticationToken.getCredentials();
  28. String password = new String(passwordArray);
  29. //用户输入的密码,然后进行盐值处理加编码
  30. String encoder = passwordEncoder.encode(password + SALT);
  31. //返回用户的信息,然后将处理过后的用户输入的密码设置进去
  32. return new
  33. SimpleAuthenticationInfo(username,encoder,this.getName());
  34. }
  35. }

BcryPasswordMatcher.java

  1. package com.lhstack.spring.shiro.matcher;
  2. import org.apache.shiro.authc.AuthenticationInfo;
  3. import org.apache.shiro.authc.AuthenticationToken;
  4. import org.apache.shiro.authc.credential.CredentialsMatcher;
  5. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  6. import org.springframework.security.crypto.password.PasswordEncoder;
  7. public class BcryPasswordMatcher implements CredentialsMatcher {
  8. private PasswordEncoder passwordEncoder;
  9. public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
  10. this.passwordEncoder = passwordEncoder;
  11. }
  12. /** * 这是simple Matcher的源码,是equals的,比较传入的密码和realm返回的对象的密码,一般进行编码之后,就不一样了,所以需要自定义实现matcher * public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) { * Object tokenCredentials = this.getCredentials(token); * Object accountCredentials = this.getCredentials(info); * return this.equals(tokenCredentials, accountCredentials); * } * 正常操作,密码比较应该用这个类来实现,如果在realm里面能完成匹配,则这里默认返回true就行了 * @param authenticationToken * @param authenticationInfo * @return */
  13. @Override
  14. public boolean doCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) {
  15. //获取刚刚realm返回的处理过后的用户输入的密码
  16. String password = (String) authenticationInfo.getCredentials();
  17. //这里应该是数据库的密码,由authenticationInfo.authenticationInfo.getPrincipals().getPrimaryPrincipal()获取,这个对象的信息由Realm返回的SimpleAuthenticationInfo里面的第一个参数获得,如new SimpleAuthenticationInfo(userInfo,password,Realm.this.getName());获取到的就是userInfo,里面对应应存在用户在数据库的密码和盐值,然后matches第一个参数就是没有编码过后的用户密码和盐值处理过后的值
  18. return passwordEncoder.matches("123456asxkdhz1568462416575",password);
  19. }
  20. }

LocalSessionDao.java
验证session存储功能

  1. package com.lhstack.spring.shiro.session;
  2. import org.apache.shiro.session.Session;
  3. import org.apache.shiro.session.UnknownSessionException;
  4. import org.apache.shiro.session.mgt.SimpleSession;
  5. import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;
  6. import java.io.Serializable;
  7. import java.util.Collection;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /** * @author lhstack */
  11. public class LocalSessionDao extends AbstractSessionDAO {
  12. private final Map<Serializable,Session> map = new HashMap<>();
  13. @Override
  14. protected Serializable doCreate(Session session) {
  15. Serializable serializable = this.generateSessionId(session);
  16. if(session instanceof SimpleSession){
  17. ((SimpleSession) session).setId(serializable);
  18. }
  19. map.put(serializable,session);
  20. return serializable;
  21. }
  22. @Override
  23. protected Session doReadSession(Serializable serializable) {
  24. return map.get(serializable);
  25. }
  26. @Override
  27. public void update(Session session) throws UnknownSessionException {
  28. map.put(session.getId(),session);
  29. }
  30. @Override
  31. public void delete(Session session) {
  32. map.remove(session.getId());
  33. }
  34. @Override
  35. public Collection<Session> getActiveSessions() {
  36. return map.values();
  37. }
  38. }

TestController.java

  1. package com.lhstack.spring.shiro.controller;
  2. import org.apache.shiro.SecurityUtils;
  3. import org.apache.shiro.authc.UsernamePasswordToken;
  4. import org.apache.shiro.session.mgt.eis.SessionDAO;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.http.MediaType;
  7. import org.springframework.stereotype.Controller;
  8. import org.springframework.web.bind.annotation.*;
  9. import java.io.IOException;
  10. import java.util.Map;
  11. /** * @author lhstack */
  12. @RequestMapping
  13. @Controller
  14. public class TestController {
  15. @Autowired
  16. private SessionDAO sessionDAO;
  17. @GetMapping(value = "session")
  18. @ResponseBody
  19. public Object hello(){
  20. return sessionDAO.getActiveSessions();
  21. }
  22. @GetMapping("index")
  23. public String index(){
  24. return "index";
  25. }
  26. @PostMapping("login")
  27. public String login(@RequestParam(name = "username") String username,
  28. @RequestParam(name = "password") String password) throws IOException {
  29. SecurityUtils.getSubject().login(new UsernamePasswordToken(username,password));
  30. return "redirect:index";
  31. }
  32. }

启动项目

我这里使用的是本地tomcat启动
在这里插入图片描述
访问页面,如localhost:8080/xxx,会自动跳转到登录页面
在这里插入图片描述
输入密码admin 密码1234567,会弹出异常页面,这里因为没有配置异常处理器,所以会使用springmvc默认的异常处理器,会打印出异常信息
意思就是密码匹配异常
在这里插入图片描述
输入正确的用户名和密码
就会跳转登录成功的页面,因为这里没有使用shiro的login,由通过Subject.login()实现,所以会按照controller里面的逻辑实现跳转
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,269人围观)

还没有评论,来说两句吧...

相关阅读

    相关 shiro整合ssm

    第一次学习shiro,记录下,欢迎指出存在的问题。至于里面的sql查询,只是单纯起到效果,有空再去优化数据结构与查询语句。 1.首先导入jar包 <!-- Sp

    相关 SSM_Shiro 整合

    [SSM初始框架(非MAVEN)][SSM_MAVEN] 下载下来的使用的数据库是sql server. 如需更改请修改目录下config.proper

    相关 ssm项目整合shiro

    之前有一篇文章是简单的介绍shiro的,但是现在需要整合到ssm的项目中,下面是步骤: 1、数据库中创建五张表,分别是用户表t\_user、角色表t\_role、权限表t\