记住我
parent
667fa1f73b
commit
1a4350fa1a
|
@ -0,0 +1,36 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" output="target/classes" path="src/main/java">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="optional" value="true"/>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="optional" value="true"/>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
|
</classpath>
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>SpringBootShiroRememberMe</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,7 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
encoding//src/main/java=UTF-8
|
||||||
|
encoding//src/main/resources=UTF-8
|
||||||
|
encoding//src/main/resources/application.properties=UTF-8
|
||||||
|
encoding//src/test/java=UTF-8
|
||||||
|
encoding//src/test/resources=UTF-8
|
||||||
|
encoding/<project>=UTF-8
|
|
@ -0,0 +1,5 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
|
@ -0,0 +1,4 @@
|
||||||
|
activeProfiles=
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
resolveWorkspaceProjects=true
|
||||||
|
version=1
|
|
@ -0,0 +1,59 @@
|
||||||
|
<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">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>zz</groupId>
|
||||||
|
<artifactId>SpringBoot2</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>SpringBootShiroRememberMe</artifactId>
|
||||||
|
<!-- Add typical dependencies for a web application -->
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--目的:《可选》引入springboot 热启动,每次修改以后,会自动把改动加载,不需要重启服务了-->
|
||||||
|
<dependency> <groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>8.0.15</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- shiro-spring -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-spring</artifactId>
|
||||||
|
<version>1.4.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 添加JPA的支持 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>alimaven</id>
|
||||||
|
<name>aliyun maven</name>
|
||||||
|
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.zz;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
/**
|
||||||
|
* 右键--》run as application 运行正启动类的main方法,就可以启动这个springboot项目。
|
||||||
|
SpringBoot 自带了 tomcat, 运行这个main方法 的时候,会同时启动tomcat
|
||||||
|
* @author jiyu
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableScheduling
|
||||||
|
public class App {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
SpringApplication.run(App.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
package com.zz.config;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
import org.apache.shiro.codec.Base64;
|
||||||
|
import org.apache.shiro.mgt.SecurityManager;
|
||||||
|
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
||||||
|
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
||||||
|
import org.apache.shiro.web.mgt.CookieRememberMeManager;
|
||||||
|
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
|
||||||
|
import org.apache.shiro.web.servlet.SimpleCookie;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class ShiroConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
|
||||||
|
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
||||||
|
shiroFilterFactoryBean.setSecurityManager(securityManager);
|
||||||
|
shiroFilterFactoryBean.setLoginUrl("/login");
|
||||||
|
shiroFilterFactoryBean.setSuccessUrl("/index");
|
||||||
|
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
|
||||||
|
|
||||||
|
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
filterChainDefinitionMap.put("/css/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/js/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/fonts/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/img/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/druid/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/logout", "logout");
|
||||||
|
filterChainDefinitionMap.put("/", "anon");
|
||||||
|
filterChainDefinitionMap.put("/**", "user");
|
||||||
|
|
||||||
|
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
||||||
|
|
||||||
|
return shiroFilterFactoryBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SecurityManager securityManager(){
|
||||||
|
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
|
||||||
|
securityManager.setRealm(shiroRealm());
|
||||||
|
securityManager.setRememberMeManager(rememberMeManager());
|
||||||
|
return securityManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean(name = "lifecycleBeanPostProcessor")
|
||||||
|
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
|
||||||
|
return new LifecycleBeanPostProcessor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ShiroRealm shiroRealm(){
|
||||||
|
ShiroRealm shiroRealm = new ShiroRealm();
|
||||||
|
return shiroRealm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cookie对象
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public SimpleCookie rememberMeCookie() {
|
||||||
|
// 设置cookie名称,对应login.html页面的<input type="checkbox" name="rememberMe"/>
|
||||||
|
SimpleCookie cookie = new SimpleCookie("rememberMe");
|
||||||
|
// 设置cookie的过期时间,单位为秒,这里为一天
|
||||||
|
cookie.setMaxAge(86400);
|
||||||
|
return cookie;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cookie管理对象
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public CookieRememberMeManager rememberMeManager() {
|
||||||
|
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
|
||||||
|
cookieRememberMeManager.setCookie(rememberMeCookie());
|
||||||
|
// rememberMe cookie加密的密钥
|
||||||
|
cookieRememberMeManager.setCipherKey(Base64.decode("3AvVhmFLUs0KTA3Kprsdag=="));
|
||||||
|
return cookieRememberMeManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
package com.zz.config;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import org.apache.shiro.authc.AuthenticationException;
|
||||||
|
import org.apache.shiro.authc.AuthenticationInfo;
|
||||||
|
import org.apache.shiro.authc.AuthenticationToken;
|
||||||
|
import org.apache.shiro.authc.IncorrectCredentialsException;
|
||||||
|
import org.apache.shiro.authc.LockedAccountException;
|
||||||
|
import org.apache.shiro.authc.SimpleAuthenticationInfo;
|
||||||
|
import org.apache.shiro.authc.UnknownAccountException;
|
||||||
|
import org.apache.shiro.authz.AuthorizationInfo;
|
||||||
|
import org.apache.shiro.realm.AuthorizingRealm;
|
||||||
|
import org.apache.shiro.subject.PrincipalCollection;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
|
import com.zz.entity.User;
|
||||||
|
import com.zz.repository.UserRepository;
|
||||||
|
|
||||||
|
//import com.springboot.dao.UserMapper;
|
||||||
|
//import com.springboot.pojo.User;
|
||||||
|
|
||||||
|
public class ShiroRealm extends AuthorizingRealm {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private UserRepository userRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户角色和权限
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 登录认证
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
|
||||||
|
String userName = (String) token.getPrincipal();
|
||||||
|
String password = new String((char[]) token.getCredentials());
|
||||||
|
|
||||||
|
System.out.println("用户" + userName + "认证-----ShiroRealm.doGetAuthenticationInfo");
|
||||||
|
// User user = userMapper.findByUserName(userName);
|
||||||
|
User user = userRepository.findByName(userName);
|
||||||
|
// User user=new User();
|
||||||
|
if (user == null) {
|
||||||
|
throw new UnknownAccountException("用户名错误!");
|
||||||
|
}
|
||||||
|
if (!password.equals(user.getPwd())) {
|
||||||
|
throw new IncorrectCredentialsException("密码错误!");
|
||||||
|
}
|
||||||
|
if (user.getStatus().equals("0")) {
|
||||||
|
throw new LockedAccountException("账号已被锁定,请联系管理员!");
|
||||||
|
}
|
||||||
|
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.zz.controller;
|
||||||
|
|
||||||
|
import org.apache.shiro.SecurityUtils;
|
||||||
|
import org.apache.shiro.authc.AuthenticationException;
|
||||||
|
import org.apache.shiro.authc.IncorrectCredentialsException;
|
||||||
|
import org.apache.shiro.authc.LockedAccountException;
|
||||||
|
import org.apache.shiro.authc.UnknownAccountException;
|
||||||
|
import org.apache.shiro.authc.UsernamePasswordToken;
|
||||||
|
import org.apache.shiro.subject.Subject;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
import com.zz.entity.User;
|
||||||
|
import com.zz.pojo.ResponseBo;
|
||||||
|
import com.zz.util.MD5Utils;
|
||||||
|
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
public class LoginController {
|
||||||
|
|
||||||
|
@GetMapping("/login")
|
||||||
|
public String login() {
|
||||||
|
return "login1.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/login")
|
||||||
|
@ResponseBody
|
||||||
|
public ResponseBo login(String username, String password, Boolean rememberMe) {
|
||||||
|
password = MD5Utils.encrypt(username, password);
|
||||||
|
UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe);
|
||||||
|
Subject subject = SecurityUtils.getSubject();
|
||||||
|
try {
|
||||||
|
subject.login(token);
|
||||||
|
return ResponseBo.ok();
|
||||||
|
} catch (UnknownAccountException e) {
|
||||||
|
return ResponseBo.error(e.getMessage());
|
||||||
|
} catch (IncorrectCredentialsException e) {
|
||||||
|
return ResponseBo.error(e.getMessage());
|
||||||
|
} catch (LockedAccountException e) {
|
||||||
|
return ResponseBo.error(e.getMessage());
|
||||||
|
} catch (AuthenticationException e) {
|
||||||
|
return ResponseBo.error("认证失败!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/")
|
||||||
|
public String redirectIndex() {
|
||||||
|
return "redirect:/index";
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/index")
|
||||||
|
public String index(Model model) {
|
||||||
|
User user = (User) SecurityUtils.getSubject().getPrincipal();
|
||||||
|
model.addAttribute("user", user);
|
||||||
|
return "index1.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/getlogin")
|
||||||
|
@ResponseBody
|
||||||
|
public User getLoginUser(){
|
||||||
|
return (User) SecurityUtils.getSubject().getPrincipal();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package com.zz.entity;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class User implements Serializable{
|
||||||
|
@Id
|
||||||
|
private String id;
|
||||||
|
private String name;
|
||||||
|
private String pwd;
|
||||||
|
private String sex;
|
||||||
|
private int age;
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
public String getPwd() {
|
||||||
|
return pwd;
|
||||||
|
}
|
||||||
|
public void setPwd(String pwd) {
|
||||||
|
this.pwd = pwd;
|
||||||
|
}
|
||||||
|
public String getSex() {
|
||||||
|
return sex;
|
||||||
|
}
|
||||||
|
public void setSex(String sex) {
|
||||||
|
this.sex = sex;
|
||||||
|
}
|
||||||
|
public int getAge() {
|
||||||
|
return age;
|
||||||
|
}
|
||||||
|
public void setAge(int age) {
|
||||||
|
this.age = age;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package com.zz.pojo;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ResponseBo extends HashMap<String, Object>{
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public ResponseBo() {
|
||||||
|
put("code", 0);
|
||||||
|
put("msg", "操作成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseBo error() {
|
||||||
|
return error(1, "操作失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseBo error(String msg) {
|
||||||
|
return error(500, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseBo error(int code, String msg) {
|
||||||
|
ResponseBo ResponseBo = new ResponseBo();
|
||||||
|
ResponseBo.put("code", code);
|
||||||
|
ResponseBo.put("msg", msg);
|
||||||
|
return ResponseBo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseBo ok(String msg) {
|
||||||
|
ResponseBo ResponseBo = new ResponseBo();
|
||||||
|
ResponseBo.put("msg", msg);
|
||||||
|
return ResponseBo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseBo ok(Map<String, Object> map) {
|
||||||
|
ResponseBo ResponseBo = new ResponseBo();
|
||||||
|
ResponseBo.putAll(map);
|
||||||
|
return ResponseBo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResponseBo ok() {
|
||||||
|
return new ResponseBo();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ResponseBo put(String key, Object value) {
|
||||||
|
super.put(key, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.zz.repository;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.repository.CrudRepository;
|
||||||
|
|
||||||
|
import com.zz.entity.User;
|
||||||
|
|
||||||
|
public interface UserRepository extends JpaRepository<User,String>{
|
||||||
|
|
||||||
|
public User findByNameAndPwd(String name,String pwd);
|
||||||
|
public User findByName(String name);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package com.zz.service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import org.springframework.data.domain.Page;
|
||||||
|
import org.springframework.data.domain.PageRequest;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.zz.entity.User;
|
||||||
|
import com.zz.repository.UserRepository;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class UserService {
|
||||||
|
@Resource
|
||||||
|
UserRepository userRepository;
|
||||||
|
|
||||||
|
|
||||||
|
public User findByNameAndPwd(String name,String pwd){
|
||||||
|
return userRepository.findByNameAndPwd(name, pwd);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public Page<User> findAll(String page, String limit){
|
||||||
|
Pageable pageable = PageRequest.of(Integer.parseInt(page), Integer.parseInt(limit));
|
||||||
|
Page<User> pageinfo=userRepository.findAll(pageable);
|
||||||
|
return pageinfo;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.zz.util;
|
||||||
|
|
||||||
|
import org.apache.shiro.crypto.hash.SimpleHash;
|
||||||
|
import org.apache.shiro.util.ByteSource;
|
||||||
|
|
||||||
|
public class MD5Utils {
|
||||||
|
private static final String SALT = "mrbird";
|
||||||
|
|
||||||
|
private static final String ALGORITH_NAME = "md5";
|
||||||
|
|
||||||
|
private static final int HASH_ITERATIONS = 2;
|
||||||
|
|
||||||
|
public static String encrypt(String pswd) {
|
||||||
|
String newPassword = new SimpleHash(ALGORITH_NAME, pswd, ByteSource.Util.bytes(SALT), HASH_ITERATIONS).toHex();
|
||||||
|
return newPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String encrypt(String username, String pswd) {
|
||||||
|
String newPassword = new SimpleHash(ALGORITH_NAME, pswd, ByteSource.Util.bytes(username + SALT),
|
||||||
|
HASH_ITERATIONS).toHex();
|
||||||
|
return newPassword;
|
||||||
|
}
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
System.out.println(MD5Utils.encrypt("test", "123456"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
server.port=9087
|
||||||
|
server.servlet.context-path=/r
|
||||||
|
|
||||||
|
# 数据库的信息
|
||||||
|
spring.datasource.url = jdbc:mysql://localhost:3306/java10?useSSL=false&serverTimezone=Asia/Shanghai
|
||||||
|
spring.datasource.username = root
|
||||||
|
spring.datasource.password = Java20190713*yy
|
||||||
|
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
|
||||||
|
spring.jpa.database = MYSQL
|
||||||
|
# spring.jpa.show-sql = true 表示会在控制台打印执行的sql语句
|
||||||
|
spring.jpa.show-sql = true
|
||||||
|
spring.jpa.hibernate.ddl-auto = update
|
|
@ -0,0 +1,54 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Bootstrap 实例</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
|
||||||
|
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
|
||||||
|
<script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
|
||||||
|
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<h2>基础表格</h2>
|
||||||
|
<p id="info"></p>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Firstname</th>
|
||||||
|
<th>Lastname</th>
|
||||||
|
<th>Email</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>John</td>
|
||||||
|
<td>Doe</td>
|
||||||
|
<td>john@example.com</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Mary</td>
|
||||||
|
<td>Moe</td>
|
||||||
|
<td>mary@example.com</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>July</td>
|
||||||
|
<td>Dooley</td>
|
||||||
|
<td>july@example.com</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$.post("/r/getlogin",
|
||||||
|
function(data){
|
||||||
|
console.log(data); // 2pm
|
||||||
|
var loginname=data.name;
|
||||||
|
$("#info").text(loginname);
|
||||||
|
}, "json");
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Bootstrap 实例</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
|
||||||
|
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
|
||||||
|
<script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
|
||||||
|
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<h2>堆叠表单</h2>
|
||||||
|
<form>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="email">Email:</label>
|
||||||
|
<input type="email" class="form-control" id="email" placeholder="Enter email">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="pwd">Password:</label>
|
||||||
|
<input type="password" class="form-control" id="pwd" placeholder="Enter password">
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<label class="form-check-label">
|
||||||
|
<input class="form-check-input" name='rememberMe' type="checkbox"> Remember me
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<button type="button" id="subtn" class="btn btn-primary">Submit</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$("#subtn").click(function(){
|
||||||
|
var rememberMe =$("input[name='rememberMe']").is(':checked');
|
||||||
|
$.post("/r/login", { "username": $("#email").val(),"password": $("#pwd").val(),"rememberMe": rememberMe },
|
||||||
|
function(data){
|
||||||
|
console.log(data); //
|
||||||
|
window.location.href="index1.html";
|
||||||
|
}, "json");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,7 @@
|
||||||
|
#Generated by Maven Integration for Eclipse
|
||||||
|
#Fri Aug 23 21:28:18 CST 2019
|
||||||
|
version=0.0.1-SNAPSHOT
|
||||||
|
groupId=zz
|
||||||
|
m2e.projectName=SpringBootShiroRememberMe
|
||||||
|
m2e.projectLocation=C\:\\bsea\\wp\\2019\\07\\04\\SpringBoot2\\SpringBootShiroRememberMe
|
||||||
|
artifactId=SpringBootShiroRememberMe
|
|
@ -0,0 +1,59 @@
|
||||||
|
<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">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>zz</groupId>
|
||||||
|
<artifactId>SpringBoot2</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>SpringBootShiroRememberMe</artifactId>
|
||||||
|
<!-- Add typical dependencies for a web application -->
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--目的:《可选》引入springboot 热启动,每次修改以后,会自动把改动加载,不需要重启服务了-->
|
||||||
|
<dependency> <groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>8.0.15</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- shiro-spring -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-spring</artifactId>
|
||||||
|
<version>1.4.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 添加JPA的支持 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>alimaven</id>
|
||||||
|
<name>aliyun maven</name>
|
||||||
|
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
|
@ -0,0 +1,12 @@
|
||||||
|
server.port=9087
|
||||||
|
server.servlet.context-path=/r
|
||||||
|
|
||||||
|
# 数据库的信息
|
||||||
|
spring.datasource.url = jdbc:mysql://localhost:3306/java10?useSSL=false&serverTimezone=Asia/Shanghai
|
||||||
|
spring.datasource.username = root
|
||||||
|
spring.datasource.password = Java20190713*yy
|
||||||
|
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
|
||||||
|
spring.jpa.database = MYSQL
|
||||||
|
# spring.jpa.show-sql = true 表示会在控制台打印执行的sql语句
|
||||||
|
spring.jpa.show-sql = true
|
||||||
|
spring.jpa.hibernate.ddl-auto = update
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,54 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Bootstrap 实例</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
|
||||||
|
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
|
||||||
|
<script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
|
||||||
|
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<h2>基础表格</h2>
|
||||||
|
<p id="info"></p>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Firstname</th>
|
||||||
|
<th>Lastname</th>
|
||||||
|
<th>Email</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>John</td>
|
||||||
|
<td>Doe</td>
|
||||||
|
<td>john@example.com</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Mary</td>
|
||||||
|
<td>Moe</td>
|
||||||
|
<td>mary@example.com</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>July</td>
|
||||||
|
<td>Dooley</td>
|
||||||
|
<td>july@example.com</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$.post("/r/getlogin",
|
||||||
|
function(data){
|
||||||
|
console.log(data); // 2pm
|
||||||
|
var loginname=data.name;
|
||||||
|
$("#info").text(loginname);
|
||||||
|
}, "json");
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Bootstrap 实例</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
|
||||||
|
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
|
||||||
|
<script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
|
||||||
|
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<h2>堆叠表单</h2>
|
||||||
|
<form>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="email">Email:</label>
|
||||||
|
<input type="email" class="form-control" id="email" placeholder="Enter email">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="pwd">Password:</label>
|
||||||
|
<input type="password" class="form-control" id="pwd" placeholder="Enter password">
|
||||||
|
</div>
|
||||||
|
<div class="form-check">
|
||||||
|
<label class="form-check-label">
|
||||||
|
<input class="form-check-input" name='rememberMe' type="checkbox"> Remember me
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<button type="button" id="subtn" class="btn btn-primary">Submit</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$("#subtn").click(function(){
|
||||||
|
var rememberMe =$("input[name='rememberMe']").is(':checked');
|
||||||
|
$.post("/r/login", { "username": $("#email").val(),"password": $("#pwd").val(),"rememberMe": rememberMe },
|
||||||
|
function(data){
|
||||||
|
console.log(data); //
|
||||||
|
window.location.href="index1.html";
|
||||||
|
}, "json");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
1
pom.xml
1
pom.xml
|
@ -19,6 +19,7 @@
|
||||||
<module>SpringBootFile</module>
|
<module>SpringBootFile</module>
|
||||||
<module>SpringBootHomework</module>
|
<module>SpringBootHomework</module>
|
||||||
<module>SpringBootSwagger2</module>
|
<module>SpringBootSwagger2</module>
|
||||||
|
<module>SpringBootShiroRememberMe</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
|
|
Loading…
Reference in New Issue