├── README.md ├── grid.iml ├── pom.xml └── src └── main ├── java ├── controller │ └── UserController.java ├── dao │ └── UserMapper.java ├── exception │ ├── MyException.java │ └── MyHandlerExceptionResolver.java ├── model │ ├── ResponseData.java │ └── User.java ├── service │ ├── UserService.java │ └── impl │ │ └── UserServiceImpl.java ├── shiro │ ├── MyStatelessRealm.java │ └── MyStatelessShiroFilter.java └── util │ └── JwtUtil.java ├── resources ├── UserMapper.xml ├── log4j.properties ├── spring-mybatis.xml └── springmvc-servlet.xml ├── test ├── JWTTest.java └── UserCRUDTest.java └── webapp ├── WEB-INF └── web.xml └── index.html /README.md: -------------------------------------------------------------------------------- 1 | # SSM-Shiro-JWT 2 | SSM+Shiro+JWT进行无状态认证 3 | 4 | --禁用session 5 | 6 | --重写Realm的认证和授权 7 | 8 | --重写Filter,使用请求头获取JWT 9 | 10 | --JWT生成及验证解析工具 11 | 12 | -------------------------------------------------------------------------------- /grid.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 4.0.0 6 | 7 | com.yzsbank 8 | grid 9 | 1.0-SNAPSHOT 10 | war 11 | 12 | grid Maven Webapp 13 | 14 | http://www.example.com 15 | 16 | 17 | UTF-8 18 | 1.7 19 | 1.7 20 | 21 | 4.1.7.RELEASE 22 | 23 | 1.4.0 24 | 25 | 26 | 27 | 28 | 29 | org.springframework.security 30 | spring-security-web 31 | 5.0.7.RELEASE 32 | 33 | 34 | org.springframework.security 35 | spring-security-config 36 | 5.0.7.RELEASE 37 | 38 | 39 | 40 | io.jsonwebtoken 41 | jjwt 42 | 0.9.0 43 | 44 | 45 | com.auth0 46 | java-jwt 47 | 2.2.0 48 | 49 | 50 | 51 | com.baidu.aip 52 | java-sdk 53 | 4.5.0 54 | 55 | 56 | 57 | org.mybatis.generator 58 | mybatis-generator-core 59 | 1.3.5 60 | 61 | 62 | 63 | javax.servlet 64 | javax.servlet-api 65 | 3.1.0 66 | 67 | 68 | 69 | org.apache.shiro 70 | shiro-core 71 | ${shiro.version} 72 | 73 | 74 | org.apache.shiro 75 | shiro-ehcache 76 | ${shiro.version} 77 | 78 | 79 | org.apache.shiro 80 | shiro-web 81 | ${shiro.version} 82 | 83 | 84 | org.apache.shiro 85 | shiro-spring 86 | ${shiro.version} 87 | 88 | 89 | 90 | org.slf4j 91 | slf4j-log4j12 92 | 1.7.2 93 | 94 | 95 | 96 | com.alibaba 97 | fastjson 98 | 1.1.41 99 | 100 | 101 | org.json 102 | json 103 | 20180130 104 | 105 | 106 | 107 | 108 | org.springframework 109 | spring-core 110 | ${spring.version} 111 | 112 | 113 | 114 | org.springframework 115 | spring-jdbc 116 | ${spring.version} 117 | 118 | 119 | org.springframework 120 | spring-beans 121 | ${spring.version} 122 | 123 | 124 | org.springframework 125 | spring-context 126 | ${spring.version} 127 | 128 | 129 | org.springframework 130 | spring-context-support 131 | ${spring.version} 132 | 133 | 134 | org.springframework 135 | spring-web 136 | ${spring.version} 137 | 138 | 139 | org.springframework 140 | spring-webmvc 141 | ${spring.version} 142 | 143 | 144 | org.springframework 145 | spring-test 146 | ${spring.version} 147 | 148 | 149 | org.springframework 150 | spring-tx 151 | ${spring.version} 152 | 153 | 154 | org.springframework 155 | spring-aop 156 | ${spring.version} 157 | 158 | 159 | org.springframework 160 | spring-aspects 161 | ${spring.version} 162 | 163 | 164 | 165 | 166 | mysql 167 | mysql-connector-java 168 | 8.0.11 169 | 170 | 171 | 172 | org.mybatis 173 | mybatis 174 | 3.4.6 175 | 176 | 177 | 178 | 179 | org.mybatis 180 | mybatis-spring 181 | 1.3.0 182 | 183 | 184 | 185 | 186 | com.alibaba 187 | druid 188 | 1.1.1 189 | 190 | 191 | 192 | org.projectlombok 193 | lombok 194 | 1.18.2 195 | provided 196 | 197 | 198 | junit 199 | junit 200 | 4.11 201 | test 202 | 203 | 204 | 205 | 206 | grid 207 | 208 | 209 | 210 | maven-clean-plugin 211 | 3.0.0 212 | 213 | 214 | 215 | maven-resources-plugin 216 | 3.0.2 217 | 218 | 219 | maven-compiler-plugin 220 | 3.7.0 221 | 222 | 223 | maven-surefire-plugin 224 | 2.20.1 225 | 226 | 227 | maven-war-plugin 228 | 3.2.0 229 | 230 | 231 | maven-install-plugin 232 | 2.5.2 233 | 234 | 235 | maven-deploy-plugin 236 | 2.8.2 237 | 238 | 239 | 240 | 241 | 242 | -------------------------------------------------------------------------------- /src/main/java/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package controller; 2 | 3 | import dao.UserMapper; 4 | import model.ResponseData; 5 | import model.User; 6 | import org.apache.shiro.SecurityUtils; 7 | import org.apache.shiro.authc.UsernamePasswordToken; 8 | import org.apache.shiro.authz.annotation.Logical; 9 | import org.apache.shiro.authz.annotation.RequiresRoles; 10 | import org.apache.shiro.subject.Subject; 11 | import org.slf4j.Logger; 12 | import org.slf4j.LoggerFactory; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RequestMethod; 15 | import org.springframework.web.bind.annotation.RestController; 16 | import util.JwtUtil; 17 | import javax.annotation.Resource; 18 | import javax.servlet.http.HttpServletRequest; 19 | import java.util.LinkedHashMap; 20 | import java.util.Map; 21 | 22 | @RestController 23 | @RequestMapping 24 | public class UserController { 25 | @Resource 26 | UserMapper userMapper; 27 | private Logger logger = LoggerFactory.getLogger(UserController.class); 28 | 29 | @RequestMapping(value = "/login",method = RequestMethod.GET) 30 | public ResponseData toLogin() { 31 | return new ResponseData().code(200).message("login page"); 32 | } 33 | 34 | @RequestMapping(value = "/login",method = RequestMethod.POST) 35 | public ResponseData login(String name, String password, HttpServletRequest request) { 36 | User user = userMapper.getUserByName(name); 37 | if (user == null ) { 38 | return new ResponseData().code(400).message("user not exists"); 39 | } 40 | if (!user.getPassword().equals(password)) { 41 | return new ResponseData().code(400).message("username or password is false"); 42 | } 43 | Map map = new LinkedHashMap<>(); 44 | map.put("username", user.getName()); 45 | map.put("role",user.getRole()); 46 | String jwt = JwtUtil.createToken(map); 47 | Subject subject = SecurityUtils.getSubject(); 48 | UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(jwt, jwt); 49 | try { 50 | subject.login(usernamePasswordToken); 51 | logger.info("登录成功"); 52 | return new ResponseData().success().data(jwt); 53 | }catch (Exception e) { 54 | return new ResponseData().fail(); 55 | } 56 | } 57 | 58 | @RequestMapping(value = "/user", method = RequestMethod.GET) 59 | public ResponseData toUser(HttpServletRequest request){ 60 | return new ResponseData().code(200).message("welcome to user"); 61 | } 62 | @RequestMapping(value = "/admin", method = RequestMethod.GET) 63 | public ResponseData tUser(HttpServletRequest request){ 64 | return new ResponseData().code(200).message(request.getHeader("token")); 65 | } 66 | 67 | @RequestMapping(value = "/pre", method = RequestMethod.GET) 68 | @RequiresRoles("admin") 69 | public ResponseData toP(){ 70 | return new ResponseData().code(200).message("welcome to president"); 71 | } 72 | 73 | @RequestMapping(value = "/unauthorized", method = RequestMethod.GET) 74 | public ResponseData unAu(){ 75 | return new ResponseData().unauthorized(); 76 | } 77 | 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/dao/UserMapper.java: -------------------------------------------------------------------------------- 1 | package dao; 2 | 3 | import model.User; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface UserMapper { 8 | int saveUser(User user); 9 | int deleteUserById(Integer id); 10 | int updateUser(User user); 11 | User getUserById(Integer id); 12 | User getUserByName(String name); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/exception/MyException.java: -------------------------------------------------------------------------------- 1 | package exception; 2 | 3 | /** 4 | * 自定义异常 5 | */ 6 | public class MyException extends RuntimeException{ 7 | //异常信息 8 | private String message; 9 | //构造器 10 | public MyException(String message){ 11 | super(message); 12 | this.message=message; 13 | } 14 | @Override 15 | public String getMessage() { 16 | return message; 17 | } 18 | public void setMessage(String message) { 19 | this.message = message; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/exception/MyHandlerExceptionResolver.java: -------------------------------------------------------------------------------- 1 | package exception; 2 | 3 | import org.springframework.web.servlet.HandlerExceptionResolver; 4 | import org.springframework.web.servlet.ModelAndView; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | public class MyHandlerExceptionResolver implements HandlerExceptionResolver { 10 | @Override 11 | public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { 12 | MyException myException = null; 13 | if (e instanceof MyException) { 14 | myException = (MyException) e; 15 | } else {//如果该异常类型不是系统自定义的异常,构造一个自定义的异常类型(信息为“未知错误”) 16 | myException = new MyException("未知错误"); 17 | } 18 | return null; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/model/ResponseData.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import java.util.LinkedHashMap; 4 | 5 | /** 6 | * 用来返回controller层请求的结果 7 | * 默认为三个返回项:code,message,data 8 | * 如果有其他更多返回项,使用result方法拼接 9 | */ 10 | public class ResponseData extends LinkedHashMap { 11 | 12 | public ResponseData result(String key, Object value) { 13 | this.put(key, value); 14 | return this; 15 | } 16 | 17 | public ResponseData success(){ 18 | this.put("code",200); 19 | this.put("message", "success"); 20 | return this; 21 | } 22 | 23 | public ResponseData fail(){ 24 | this.put("code",400); 25 | this.put("message", "fail"); 26 | return this; 27 | } 28 | 29 | public ResponseData unauthorized(){ 30 | this.put("code",401); 31 | this.put("message", "the current user is unauthorized"); 32 | return this; 33 | } 34 | 35 | public ResponseData code(int code) { 36 | return result("code",code); 37 | } 38 | 39 | public ResponseData message(String message) { 40 | return result("message", message); 41 | } 42 | 43 | public ResponseData data(Object data) { 44 | return result("data", data); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/model/User.java: -------------------------------------------------------------------------------- 1 | package model; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import lombok.ToString; 6 | 7 | import java.io.Serializable; 8 | 9 | @Setter 10 | @Getter 11 | @ToString 12 | public class User implements Serializable { 13 | private static final long serialVersionUID = 6195354622397742664L; 14 | private Integer id; 15 | private String name; 16 | private String password; 17 | //user,admin,president 18 | private String role; 19 | private String permissions; 20 | private String phone; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/service/UserService.java: -------------------------------------------------------------------------------- 1 | package service; 2 | 3 | import model.User; 4 | 5 | public interface UserService { 6 | boolean saveUser(User user) throws Exception; 7 | boolean deleteUserById(Integer id) throws Exception; 8 | boolean updateUser(User user) throws Exception; 9 | User getUserById(Integer id) throws Exception; 10 | User getUserByName(String name) throws Exception; 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/service/impl/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package service.impl; 2 | 3 | import dao.UserMapper; 4 | import model.User; 5 | import org.springframework.stereotype.Service; 6 | import service.UserService; 7 | 8 | import javax.annotation.Resource; 9 | 10 | @Service 11 | public class UserServiceImpl implements UserService { 12 | @Resource 13 | UserMapper userMapper; 14 | 15 | @Override 16 | public boolean saveUser(User user) throws Exception { 17 | return userMapper.saveUser(user) == 1; 18 | } 19 | 20 | @Override 21 | public boolean deleteUserById(Integer id) throws Exception { 22 | return userMapper.deleteUserById(id) == 1; 23 | } 24 | 25 | @Override 26 | public boolean updateUser(User user) throws Exception { 27 | return userMapper.updateUser(user) == 1; 28 | } 29 | 30 | @Override 31 | public User getUserById(Integer id) throws Exception { 32 | return userMapper.getUserById(id); 33 | } 34 | 35 | @Override 36 | public User getUserByName(String name) throws Exception { 37 | return userMapper.getUserByName(name); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/shiro/MyStatelessRealm.java: -------------------------------------------------------------------------------- 1 | package shiro; 2 | 3 | import org.apache.shiro.authc.*; 4 | import org.apache.shiro.authz.AuthorizationInfo; 5 | import org.apache.shiro.authz.SimpleAuthorizationInfo; 6 | import org.apache.shiro.realm.AuthorizingRealm; 7 | import org.apache.shiro.subject.PrincipalCollection; 8 | import org.slf4j.Logger; 9 | import org.slf4j.LoggerFactory; 10 | import util.JwtUtil; 11 | 12 | public class MyStatelessRealm extends AuthorizingRealm { 13 | 14 | Logger logger = LoggerFactory.getLogger(MyStatelessRealm.class); 15 | 16 | public boolean supports(AuthenticationToken token) { 17 | return token instanceof UsernamePasswordToken; 18 | } 19 | /** 20 | * Realm授权 21 | * @param principals 22 | * @return 23 | */ 24 | @Override 25 | protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { 26 | logger.info("授权开始"); 27 | String jwt = (String) principals.getPrimaryPrincipal(); 28 | if (JwtUtil.verifyToken(jwt)) { 29 | String role = (String) JwtUtil.parseToken(jwt).get("role"); 30 | SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); 31 | simpleAuthorizationInfo.addRole(role); 32 | logger.info("授权成功"); 33 | return simpleAuthorizationInfo; 34 | } 35 | logger.info("授权失败"); 36 | return null; 37 | } 38 | 39 | /** 40 | * Realm登录认证 41 | * @param token 42 | * @return 43 | * @throws AuthenticationException 44 | */ 45 | @Override 46 | protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { 47 | UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token; 48 | String jwt = (String) usernamePasswordToken.getPrincipal(); 49 | if (JwtUtil.verifyToken(jwt)) { 50 | return new SimpleAuthenticationInfo(jwt, jwt ,getName()); 51 | } 52 | return null; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/shiro/MyStatelessShiroFilter.java: -------------------------------------------------------------------------------- 1 | package shiro; 2 | 3 | import org.apache.shiro.authc.UsernamePasswordToken; 4 | import org.apache.shiro.web.filter.AccessControlFilter; 5 | import org.apache.shiro.web.util.WebUtils; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | import util.JwtUtil; 9 | import javax.servlet.ServletRequest; 10 | import javax.servlet.ServletResponse; 11 | import javax.servlet.http.HttpServletRequest; 12 | import java.io.IOException; 13 | 14 | public class MyStatelessShiroFilter extends AccessControlFilter { 15 | private Logger logger = LoggerFactory.getLogger(MyStatelessShiroFilter.class); 16 | /** 17 | *返回false 18 | * @param servletRequest 19 | * @param servletResponse 20 | * @param o 21 | * @return 返回结果是false的时候才会执行下面的onAccessDenied方法 22 | * @throws Exception 23 | */ 24 | @Override 25 | protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { 26 | logger.info("is access allowed"); 27 | return false; 28 | } 29 | 30 | /** 31 | * 从请求头获取token并验证,验证通过后交给realm进行登录 32 | * @param servletRequest 33 | * @param servletResponse 34 | * @return 返回结果为true时,表明登录认证通过,执行controller层 35 | * @throws Exception 36 | */ 37 | @Override 38 | protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { 39 | logger.info("on access denied"); 40 | HttpServletRequest request = (HttpServletRequest) servletRequest; 41 | String jwt = request.getHeader("Authorization"); 42 | if (JwtUtil.verifyToken(jwt)) { 43 | UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(jwt, jwt); 44 | try { 45 | //委托realm进行登录认证 46 | getSubject(servletRequest, servletResponse).login(usernamePasswordToken); 47 | return true; 48 | }catch (Exception e) { 49 | return false; 50 | } 51 | } 52 | redirectToLogin(servletRequest,servletResponse); 53 | return false; 54 | } 55 | 56 | /** 57 | * 重定向到登录页 58 | * @param request 59 | * @param response 60 | * @throws IOException 61 | */ 62 | @Override 63 | protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException { 64 | logger.info("redirectToLogin"); 65 | WebUtils.issueRedirect(request, response, "/login"); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/util/JwtUtil.java: -------------------------------------------------------------------------------- 1 | package util; 2 | 3 | import io.jsonwebtoken.Claims; 4 | import io.jsonwebtoken.JwtBuilder; 5 | import io.jsonwebtoken.Jwts; 6 | import io.jsonwebtoken.SignatureAlgorithm; 7 | import javax.crypto.spec.SecretKeySpec; 8 | import javax.xml.bind.DatatypeConverter; 9 | import java.security.Key; 10 | import java.util.Date; 11 | import java.util.Map; 12 | 13 | /** 14 | * 用来生成token令牌和解码验证token令牌 15 | * JWT由三部分组成,头部header、载荷payload与签名signature 16 | */ 17 | public class JwtUtil { 18 | private static final String SIGNING_KEY ="www.yzsbank.com" ; //自定义加密密钥SIGNING_KEY 19 | private static byte[] signingSecretBytes = DatatypeConverter.parseBase64Binary(SIGNING_KEY); //转换成Base64编码 20 | private static final long EXP = 60*60*1000; //有效期为60分钟 21 | 22 | /** 23 | * 生成token,默认60分钟 24 | * @param payload 载荷 25 | * @return token 26 | */ 27 | public static String createToken(Map payload) { //默认有效期为60分钟 28 | return createToken(payload,EXP); 29 | } 30 | 31 | /** 32 | * 生成token 33 | * @param payload 载荷 34 | * @param exp 有效时长 35 | * @return token 36 | */ 37 | public static String createToken(Map payload, long exp){ 38 | //签名算法使用SHA256算法加密 39 | SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; 40 | //加密JWT 41 | Key signingKey = new SecretKeySpec(signingSecretBytes,signatureAlgorithm.getJcaName()); 42 | //设置JWT声明格式,生成JWT 43 | JwtBuilder jwtBuilder = Jwts.builder() 44 | .setHeaderParam("typ","jwt") 45 | .setHeaderParam("alg","HS256") 46 | .setClaims(payload) 47 | .setExpiration(new Date(System.currentTimeMillis()+exp)) //token有效期 48 | .signWith(signatureAlgorithm,signingKey); //签名算法及签名密钥,将header与payload加密拼接后形成JWT 49 | return jwtBuilder.compact(); //返回JWT 50 | } 51 | 52 | /** 53 | * 解析token信息 54 | * @param token JWT信息 55 | * @return payload 56 | */ 57 | public static Claims parseToken(String token){ 58 | try { 59 | return Jwts.parser() 60 | .setSigningKey(signingSecretBytes) 61 | .parseClaimsJws(token).getBody(); 62 | }catch (Exception e) { 63 | return null; 64 | } 65 | } 66 | 67 | /** 68 | * 解析token信息 69 | * @param token JWT信息 70 | * @return payload 71 | */ 72 | public static boolean verifyToken(String token){ 73 | try { 74 | Jwts.parser() 75 | .setSigningKey(signingSecretBytes) 76 | .parseClaimsJws(token).getBody(); 77 | return true; 78 | }catch (Exception e) { 79 | return false; 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/main/resources/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | select LAST_INSERT_ID(); 10 | 11 | insert into user (name, password) 12 | values(#{name},#{password}) 13 | 14 | 15 | 16 | 17 | delete from user where id = #{id} 18 | 19 | 20 | 21 | 22 | update user 23 | set name = #{name},password = #{password} 24 | where id = #{id} 25 | 26 | 27 | 28 | 31 | 32 | 33 | 36 | 37 | -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tobe27/SSM-Shiro-JWT/83d08c17a948bf5e0c7308efa898f08be5dff35e/src/main/resources/log4j.properties -------------------------------------------------------------------------------- /src/main/resources/spring-mybatis.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | classpath*:UserMapper.xml 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | /=anon 110 | /login=anon 111 | /unauthorized=anon 112 | /user/**=statelessAuth,roles[user] 113 | /admin/**=statelessAuth,roles[admin] 114 | /**=statelessAuth 115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /src/main/resources/springmvc-servlet.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/main/test/JWTTest.java: -------------------------------------------------------------------------------- 1 | import com.alibaba.fastjson.JSON; 2 | import model.ResponseData; 3 | import model.User; 4 | import org.junit.Test; 5 | import util.JwtUtil; 6 | 7 | import java.util.ArrayList; 8 | import java.util.HashMap; 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | public class JWTTest { 13 | @Test 14 | public void jwt(){ 15 | Map map = new HashMap<>(); 16 | map.put("name", "name"); 17 | String token = JwtUtil.createToken(map,1000); 18 | System.out.println(token); 19 | System.out.println("************************"); 20 | System.out.println("************************"); 21 | System.out.println(JSON.toJSONString(JwtUtil.parseToken(token))); 22 | } 23 | 24 | @Test 25 | public void jwtTest(){ 26 | String token = ""; 27 | System.out.println(JSON.toJSONString(JwtUtil.parseToken(token))); 28 | System.out.println(JwtUtil.verifyToken(token)); 29 | } 30 | @Test 31 | public void match(){ 32 | String url = "/user"; 33 | String role = "userx"; 34 | System.out.println(url); 35 | System.out.println(url.indexOf(role)); 36 | } 37 | 38 | @Test 39 | public void resultmMapTest() { 40 | User user = new User(); 41 | user.setName("www"); 42 | user.setPassword("yzs"); 43 | user.setRole("com"); 44 | User user1 = new User(); 45 | user1.setName("www"); 46 | user1.setPassword("yzs"); 47 | user1.setRole("com"); 48 | List list = new ArrayList(); 49 | list.add(user); 50 | list.add(user1); 51 | ResponseData responseData = new ResponseData(); 52 | System.out.println(JSON.toJSONString(responseData.code(200).message("success").data(list),true)); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/main/test/UserCRUDTest.java: -------------------------------------------------------------------------------- 1 | 2 | import dao.UserMapper; 3 | import model.User; 4 | import org.apache.log4j.Logger; 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.test.context.ContextConfiguration; 9 | import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 10 | 11 | @RunWith(SpringJUnit4ClassRunner.class) 12 | @ContextConfiguration("/spring-mybatis.xml") 13 | public class UserCRUDTest { 14 | @Autowired 15 | UserMapper userDao; 16 | 17 | private Logger log = Logger.getLogger(UserCRUDTest.class); 18 | 19 | 20 | @Test 21 | public void save(){ 22 | User user = new User(); 23 | user.setName("yanxi"); 24 | user.setPassword("gonglue"); 25 | System.out.println(userDao.saveUser(user)==1); 26 | System.out.println(System.currentTimeMillis()); 27 | log.info("6666"); 28 | } 29 | 30 | @Test 31 | public void delete(){ 32 | System.out.println(userDao.deleteUserById(1)==1); 33 | } 34 | 35 | @Test 36 | public void update(){ 37 | User user = new User(); 38 | user.setId(2); 39 | user.setName("杜甫"); 40 | user.setPassword("123456"); 41 | userDao.updateUser(user); 42 | } 43 | 44 | @Test 45 | public void get(){ 46 | System.out.println(userDao.getUserById(1)); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | Archetype Created Web Application 10 | 11 | 12 | index.html 13 | 14 | 15 | 16 | 17 | contextConfigLocation 18 | classpath:spring-mybatis.xml 19 | 20 | 21 | 22 | 23 | springmvc 24 | org.springframework.web.servlet.DispatcherServlet 25 | 26 | 27 | contextConfigLocation 28 | classpath*:springmvc-servlet.xml 29 | 30 | 31 | 1 32 | 33 | 34 | 35 | 36 | springmvc 37 | 38 | / 39 | 40 | 41 | 42 | 43 | encodingFilter 44 | org.springframework.web.filter.CharacterEncodingFilter 45 | 46 | encoding 47 | UTF-8 48 | 49 | 50 | 51 | encodingFilter 52 | /* 53 | 54 | 55 | 56 | shiroFilter 57 | org.springframework.web.filter.DelegatingFilterProxy 58 | 59 | targetFilterLifecycle 60 | true 61 | 62 | 63 | 64 | shiroFilter 65 | /* 66 | 67 | 68 | 69 | 70 | 71 | org.springframework.web.context.ContextLoaderListener 72 | 73 | 74 | 75 | 76 | org.springframework.web.util.IntrospectorCleanupListener 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/main/webapp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Hello World!

4 | 5 | 6 | --------------------------------------------------------------------------------