本来是打算在上一篇SpringMVC+Hibernate上写的,结果发现上面那篇 一起整合的,结果发现上一篇内容实在是太长了,就另起一篇,这篇主要是采用 Maven搭建Spring+SpringMVC+Hibernate+Security整合,而Spring+SpringMVC+Hibernate 已经在上一篇介绍了,在这篇将不再重复写了,主要说明一下SpringSecurity3.2权限控制整合搭建,以及配置,使用注意事项等。

SpringSecurity的Api文档地址:查看

1、Maven映入SpringSecurity依赖包

在pom.xml中引入我们需要引入spring-security-core,spring-security-config,spring-security-taglibs三个包,如下

  1. <!-- spring-security -->
  2. <dependency>
  3. <groupId>org.springframework.security</groupId>
  4. <artifactId>spring-security-core</artifactId>
  5. <version>${security.version}</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.security</groupId>
  9. <artifactId>spring-security-config</artifactId>
  10. <version>${security.version}</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.security</groupId>
  14. <artifactId>spring-security-taglibs</artifactId>
  15. <version>${security.version}</version>
  16. </dependency>

2、配置security的配置文件

我们新建一个配置文件(起名随意),我这儿就叫spring-security.xml,我现在定义了几个权限,权限信息表内容如下:

其中:管理用户和全部用户的权限将通过jsp中security标签配置,其他的通过spring-security.xml文件配置。

先贴出spring-security.xml的文件,详细配置含义我将做一个简单的说明:

  1. <span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:security="http://www.springframework.org/schema/security"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
  7. http://www.springframework.org/schema/security
  8. http://www.springframework.org/schema/security/spring-security-3.2.xsd"
  9. default-lazy-init="true">
  10. <description>spring-security配置</description>
  11. <!-- 静态资源 -->
  12. <security:http pattern="/css/**" security="none" />
  13. <security:http pattern="/js/**" security="none" />
  14. <security:http pattern="/images/**" security="none" />
  15. <security:http>
  16. <security:intercept-url pattern="/user/save*"
  17. access="ROLE_添加用户" requires-channel="any" />
  18. <security:intercept-url pattern="/user/delete*"
  19. access="ROLE_删除用户" requires-channel="any" />
  20. <security:intercept-url pattern="/user/user*"
  21. access="ROLE_浏览用户" requires-channel="any" />
  22. <security:intercept-url pattern="/user/update*"
  23. access="ROLE_修改用户" requires-channel="any" />
  24. <security:session-management>
  25. <security:concurrency-control
  26. expired-url="/login/login.htmls?repeat=true" max-sessions="1"
  27. error-if-maximum-exceeded="true" />
  28. </security:session-management>
  29. <security:form-login login-page="/login/login.htmls"
  30. authentication-failure-url="/login/login.htmls?error=true"
  31. default-target-url="/user/main.htmls" always-use-default-target='true'
  32. username-parameter="nickName" password-parameter="nickPassword" />
  33. <security:logout invalidate-session="true"
  34. logout-success-url="/login/login.htmls?logout=true" />
  35. </security:http>
  36. <!-- 认证配置 自定义认证实现UserDetailsService接口 -->
  37. <security:authentication-manager>
  38. <security:authentication-provider
  39. user-service-ref="userDetailsService">
  40. <!-- 配置密码加密方式 -->
  41. <security:password-encoder hash="md5" />
  42. </security:authentication-provider>
  43. </security:authentication-manager>
  44. <bean id="userDetailsService" class="org.andy.work.service.impl.UserDetailsServiceImpl" />
  45. </beans></span>

其中:我们配置了静态文件管理,session对话管理,登录管理,注销配置,权限配置,自定义数据表权限认证配置。

2.1、静态文件管理

我们对于css,image,js这些不用权限拦截。

2.2、session对话管理

session管理max-sessions="1"配置了最多有一个用户登录,(在wab.xml还要添加如下:)

  1. <span style="font-size:14px;"><!-- spring-security 管理session配置 -->
  2. <listener>
  3. <listener-class>
  4. org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
  5. </listener></span>

error-if-maximum-exceeded="true"  值为true时,若果有一个用户登录,第二个用户无法登陆,

值为false时,若果有一个用户已经登录,下一个用户登录将踢掉上一个用户。

自然在session-manager中我们可以配置session失效时,跳转的url如,invalid-session-
url="/invalidSession.jsp",如果session失效时,刷新将跳转到invalidSession.jsp页面。

2.3、登录管理

通过security:form-login配置登录,login-page为登录跳转的url,authentication-failure-url为登录失败时的url(次url可以不存在),

username-parameter和password-parameter为登录表单是用户名和密码,如果不写默认为j_password和j_username

login-processing-url:为登录时表单action跳转的url,如果不填写默认为 j_spring_security_check。

2.4、注销管理

通过security:logout标签配置注销,invalidate-session:注销时session是否失效。logout-success-url:注销成功后跳转的地址。

logout-url:为注销的url,如果不填写,则默认为j_spring_security_logout

2.5、权限配置

security:intercept-url为要拦截权限认证的的url,pattern为拦截的正则匹配url,access:所需的权限,可以是一
个权限组,用逗号隔开,requires-channel:拦截http还是https的,如果两个都拦截用any。

2.6、配置自定义的权限认证机制

通过我们数据库的权限表信息,我们自定义权限认证机制,需要我们实现UserDetailsService接口,配置用户密码的加密方式。

security:password-encoder:配置密码加密规则。

3、web.xml容器配置

  1. <span style="font-size:14px;">         <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>
  4. classpath:spring.xml
  5. classpath:spring-hibernate.xml
  6. classpath:spring-security.xml
  7. </param-value>
  8. </context-param>
  9. <!-- Spring-Security filter 最好配置在控制层filter的前面 -->
  10. <filter>
  11. <filter-name>springSecurityFilterChain</filter-name>
  12. <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>springSecurityFilterChain</filter-name>
  16. <url-pattern>/*</url-pattern>
  17. </filter-mapping>
  18. <!-- spring-security 管理session配置 -->
  19. <listener>
  20. <listener-class>
  21. org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
  22. </listener></span>

配置了加载的spring-security文件,security拦截的filter,以及security的session监听。

4、自定义认证,实现UserDetailsService接口

UserDetailsServiceImpl如下:

  1. <span style="font-size:14px;">package org.andy.work.service.impl;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import org.andy.work.dao.UserDao;
  5. import org.andy.work.entity.AcctAuthority;
  6. import org.andy.work.entity.AcctRole;
  7. import org.andy.work.entity.AcctUser;
  8. import org.apache.log4j.Logger;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.security.core.GrantedAuthority;
  11. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  12. import org.springframework.security.core.userdetails.User;
  13. import org.springframework.security.core.userdetails.UserDetails;
  14. import org.springframework.security.core.userdetails.UserDetailsService;
  15. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  16. /**
  17. * 创建时间:2015-2-9 下午5:24:44
  18. *
  19. * @author andy
  20. * @version 2.2
  21. *          <p>
  22. *          描述: 实现SpringSecurity的UserDetails接口 自定义认证
  23. */
  24. public class UserDetailsServiceImpl implements UserDetailsService {
  25. private static final Logger LOGGER = Logger
  26. .getLogger(UserDetailsServiceImpl.class);
  27. // 注入查询User的dao层
  28. @Autowired
  29. private UserDao userDao;
  30. @Override
  31. public UserDetails loadUserByUsername(String username)
  32. throws UsernameNotFoundException {
  33. LOGGER.info("认证用户:" + username);
  34. // 查询数据库获取改用户的信息
  35. AcctUser acctUser = userDao.findByNickName(username);
  36. if (null == acctUser) {
  37. throw new UsernameNotFoundException("用户:" + username + "不存在");
  38. }
  39. Set<GrantedAuthority> authorities = getAuthorities(acctUser);
  40. // 将没有使用到的属性设置为true
  41. UserDetails userDetails = new User(acctUser.getNickName(),
  42. acctUser.getNickPassword(), true, true, true, true, authorities);
  43. return userDetails;
  44. }
  45. // 获得用户所有角色的权限
  46. private Set<GrantedAuthority> getAuthorities(AcctUser acctUser) {
  47. Set<GrantedAuthority> authoritySet = new HashSet<GrantedAuthority>();
  48. // 默认所有的用户有"浏览用户"的权利
  49. authoritySet.add(new SimpleGrantedAuthority("ROLE_浏览用户"));
  50. // 依次添加
  51. if (null != acctUser.getAcctRoles()
  52. && acctUser.getAcctRoles().size() > 0)
  53. for (AcctRole role : acctUser.getAcctRoles()) {
  54. if (null != role.getAcctAuthorities()
  55. && role.getAcctAuthorities().size() > 0)
  56. for (AcctAuthority authority : role.getAcctAuthorities()) {
  57. authoritySet.add(new SimpleGrantedAuthority(authority
  58. .getPrefixedName()));
  59. }
  60. }
  61. return authoritySet;
  62. }
  63. }
  64. </span>

涉及到的AcctUser,AcctRole,AcctAuthority类我就不贴了,不然一大把,我会提供源码。

5、Security的认证错误提示

我们可以通过sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message获取认证错误。

6、Security获取session中的用户名和用户信息

security将用户信息存放在session中,可以通过以下两种获得:

6.1、后台获取

  1. <span style="font-size:14px;">        //获取security的上下文
  2. SecurityContext securityContext = SecurityContextHolder.getContext();
  3. //获取认证对象
  4. Authentication authentication = securityContext.getAuthentication();
  5. //在认证对象中获取主体对象
  6. Object principal = authentication.getPrincipal();
  7. String username = "";
  8. if(principal instanceof UserDetails){
  9. username = ((UserDetails) principal).getUsername();
  10. }else {
  11. username = principal.toString();
  12. }</span>

6.1、前台获取

先引入security的标签库:

  1. <span style="font-size:14px;"><%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%></span>

在查看:

  1. <span style="font-size:14px;"><security:authentication property="name"/></span>

7、前台标签授权

通过security:authorize标签设置权限,其有三种属性分别如下:

ifAnyGranted::只有当前用户拥有所指定的权限中的一个的时候,就能显示标签内部的内容(相当于“或”的关系)

ifAllGranted:只有当前用户拥有所指定的权限时,才显示标签的内容(相当于“与”的关系)

ifNotGranted:  没有指定的权限的时候,显示标签内容(相当于“非”的关系)

自然也可以通过method限制是那种http的请求(http的请求有8种:- GET - DELETE - HEAD - OPTIONS    - POST     - PUT    - PATCH    - TRACE)。

8、后台Controller

LoginController

  1. <span style="font-size:14px;"><span style="font-size:14px;">package org.andy.work.controller;
  2. import org.andy.work.entity.AcctUser;
  3. import org.apache.log4j.Logger;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.validation.Errors;
  6. import org.springframework.web.bind.annotation.ModelAttribute;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestParam;
  9. /**
  10. * 创建时间:2015-2-10 下午9:23:34
  11. *
  12. * @author andy
  13. * @version 2.2 描述:
  14. */
  15. @Controller
  16. @RequestMapping("/login")
  17. public class LoginController {
  18. private static final Logger LOGGER = Logger
  19. .getLogger(LoginController.class);
  20. @RequestMapping("/login")
  21. public String login(@ModelAttribute AcctUser acctUser,
  22. @RequestParam(required = false) Boolean logout,
  23. Errors errors
  24. ) {
  25. LOGGER.info("login");
  26. if(null != logout){
  27. errors.reject("msg", "已经安全退出");
  28. }
  29. return "/login/login";
  30. }
  31. }</span>
  32. </span>

UserController类

  1. <span style="font-size:14px;">package org.andy.work.controller;
  2. import java.util.List;
  3. import org.andy.work.entity.AcctUser;
  4. import org.andy.work.service.UserService;
  5. import org.apache.log4j.Logger;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.security.core.Authentication;
  8. import org.springframework.security.core.context.SecurityContext;
  9. import org.springframework.security.core.context.SecurityContextHolder;
  10. import org.springframework.security.core.userdetails.UserDetails;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.ui.ModelMap;
  13. import org.springframework.web.bind.annotation.PathVariable;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16. /**
  17. * 创建时间:2015-2-7 上午11:49:00
  18. * @author andy
  19. * @version 2.2
  20. * 描述: 用户Controller
  21. */
  22. @Controller
  23. @RequestMapping("/user")
  24. public class UserController {
  25. private static final Logger LOGGER = Logger.getLogger(UserController.class);
  26. @Autowired
  27. private UserService userService;
  28. @RequestMapping("/showInfo/{userId}")
  29. public String showUserInfo(ModelMap modelMap, @PathVariable String userId){
  30. LOGGER.info("查询用户:" + userId);
  31. AcctUser userInfo = userService.load(userId);
  32. modelMap.addAttribute("userInfo", userInfo);
  33. return "/user/showInfo";
  34. }
  35. @RequestMapping("/showInfos")
  36. public @ResponseBody List<AcctUser> showUserInfos(){
  37. LOGGER.info("查询用户全部用户");
  38. List<AcctUser> userInfos = userService.findAll();
  39. return userInfos;
  40. }
  41. @RequestMapping("/main")
  42. public String main(ModelMap modelMap){
  43. LOGGER.info("显示主页面");
  44. //后台获取security保存的session中的用户信息
  45. //获取security的上下文
  46. SecurityContext securityContext = SecurityContextHolder.getContext();
  47. //获取认证对象
  48. Authentication authentication = securityContext.getAuthentication();
  49. //在认证对象中获取主体对象
  50. Object principal = authentication.getPrincipal();
  51. String username = "";
  52. if(principal instanceof UserDetails){
  53. username = ((UserDetails) principal).getUsername();
  54. }else {
  55. username = principal.toString();
  56. }
  57. modelMap.addAttribute("username", username);
  58. return "/user/main";
  59. }
  60. @RequestMapping("/manage")
  61. public String manage(ModelMap modelMap){
  62. LOGGER.info("显示主页面");
  63. modelMap.addAttribute("msg", "manage");
  64. return "/user/option";
  65. }
  66. @RequestMapping("/save")
  67. public String save(ModelMap modelMap){
  68. LOGGER.info("保存");
  69. modelMap.addAttribute("msg", "save");
  70. return "/user/option";
  71. }
  72. @RequestMapping("/update")
  73. public String update(ModelMap modelMap){
  74. LOGGER.info("修改");
  75. modelMap.addAttribute("msg", "update");
  76. return "/user/option";
  77. }
  78. @RequestMapping("/delete")
  79. public String delete(ModelMap modelMap){
  80. LOGGER.info("删除");
  81. modelMap.addAttribute("msg", "delete");
  82. return "/user/option";
  83. }
  84. }
  85. </span>

9、前台

login.jsp

  1. <span style="font-size:14px;"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
  3. <%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
  4. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  5. <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
  6. <%
  7. String path = request.getContextPath();
  8. String basePath = request.getScheme() + "://"
  9. + request.getServerName() + ":" + request.getServerPort()
  10. + path + "/";
  11. %>
  12. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  13. <html>
  14. <head>
  15. <base href="<%=basePath%>" />
  16. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  17. <title>login</title>
  18. </head>
  19. <body>
  20. <div>${sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message}</div>
  21. <form:form action="j_spring_security_check" modelAttribute="acctUser" method="post">
  22. <form:errors path="*" cssStyle="color:red;" />
  23. <br />
  24. 用户:<form:input path="nickName" />
  25. <br />
  26. 密码:<form:password path="nickPassword" />
  27. <br />
  28. <form:button>登录</form:button>
  29. </form:form>
  30. </body>
  31. </html></span>

main.jsp

  1. <span style="font-size:14px;"><%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
  3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  4. <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  5. <%@taglib prefix="security" uri="http://www.springframework.org/security/tags"%>
  6. <%
  7. String path = request.getContextPath();
  8. String basePath = request.getScheme() + "://"
  9. + request.getServerName() + ":" + request.getServerPort()
  10. + path + "/";
  11. %>
  12. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  13. <html>
  14. <head>
  15. <base href="<%=basePath%>" />
  16. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  17. <title>login</title>
  18. </head>
  19. <body>
  20. welcome! <security:authentication property="name"/>
  21. <br/>
  22. 后台获取用户名:${username }
  23. <div style="border: 1px; "><a target="_blank" href="j_spring_security_logout">注销</a></div>
  24. <br/>
  25. <security:authorize ifAnyGranted="ROLE_浏览用户">
  26. <div>
  27. <a target="_blank" href="user/showInfo.htmls">全部用户</a>
  28. </div>
  29. </security:authorize>
  30. <security:authorize ifAllGranted="ROLE_管理用户">
  31. <div>
  32. <a target="_blank" href="user/manage.htmls">管理用户</a>
  33. </div>
  34. </security:authorize>
  35. <div>
  36. <a target="_blank" href="user/save.htmls">添加用户</a>
  37. </div>
  38. <div>
  39. <a target="_blank" href="user/update.htmls">修改部用户</a>
  40. </div>
  41. <div>
  42. <a target="_blank" href="user/delete.htmls">删除用户</a>
  43. </div>
  44. </body>
  45. </html></span>

10、测试

现在andy用户拥有“浏览用户”和“添加用户”权限

用户密码错误时:

正确密码登陆后:

点击添加用户,正确跳转。如下:

点击全部用户,无权限提示。

11、Spring security自定义认证错误提示

首先,拷贝spring-security-core写的messages_zh_CN.properties国际化文件,放到项目的src/main/resources目录中

修改对应的提示,按照我们自己的需求,我命名为messages.properties

其次, 我们需在spring的配置文件中添加如下内容:

  1. <span style="font-size:14px;"><span style="font-size:14px;">    <!-- 定义上下文返回的消息的国际化 -->
  2. <bean id="messageSource"
  3. class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  4. <property name="basename" value="classpath:messages" />
  5. </bean>
  6. <bean id="localeResolver"
  7. class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" /></span></span>

ok,Maven搭建Spring+Hibernate+security整合完毕。

后续

遗留问题,通用的重写security提示信息,其他的都能国际化汉语提示,但是

唯独

ConcurrentSessionControlStrategy.exceededAllowed=\u5DF2\u7ECF\u6709
{0}
\u4E2A\u7528\u6237\u767B\u5F55\uFF0C\u4E0D\u80FD\u91CD\u590D\u767B\u5F55

我修改重复登录提示时,还是security原来自带的提示,如下:

希望又遇到的共同留言探讨。

博客地址http://blog.csdn.net/fengshizty

源码地址:http://download.csdn.net/detail/fengshizty/8444061

Maven搭建Spring Security3.2项目详解的更多相关文章

  1. Maven搭建Spring+Struts2+Hibernate项目详解

    http://www.bubuko.com/infodetail-648898.html

  2. IDEA中maven搭建Spring+SpringMVC+mybatis项目

    一.介绍 使用IDEA搭建maven web项目,整合框架Spring+SpringMVC+mybatis 项目结构图:

  3. Myeclipse下使用Maven搭建spring boot2.0项目

    现在需要搭建spring boot框架,并实现一个HelloWorld的项目,让程序真正运行起来. 一.在pom.xml中引入spring-boot-start-parent,spring官方的叫st ...

  4. python关于Django搭建简单博客项目 详解二-setting.py

    这一篇我们来讲解setting.py,具体内容以注释形式写入到下面的setting.py代码中,篇幅所限已把官方所给英文注释删除. 全部源代码和详解请参看http://github.com/Cheng ...

  5. 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+SpringMVC项目详解

    http://blog.csdn.net/noaman_wgs/article/details/53893948 利用Intellij+MAVEN搭建Spring+Mybatis+MySql+Spri ...

  6. JAVA Eclipse使用Maven构建web项目详解(SSM框架)

    tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...

  7. eclipse里面构建maven项目详解(转载)

    本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1       环境安装及分配 Maven是基于项目对象模 ...

  8. Maven 搭建spring boot多模块项目(附源码),亲测可以,感谢原创

    原创地址:https://segmentfault.com/a/1190000005020589 我的DEMO码云地址,持续添加新功能: https://gitee.com/itbase/Spring ...

  9. Myeclipse下使用Maven搭建spring boot项目

    开发环境:Myeclipse2017.JDK1.6.Tomcat 8.0.Myeclipse下使用Maven搭建spring boot项目,详细过程如下: 1. New -> Project.. ...

随机推荐

  1. debian8平滑升级到debian9

    本文在Creative Commons许可证下发布. 首先,在升级时可以查看一下自己的版本号: uname -a ##查看内核信息 cat /etc/issue ##查看发行版本号   方法1:利用网 ...

  2. [转]LNMP环境下的Web常见问题排查(精品)

    来源:http://mp.weixin.qq.com/s? __biz=MjM5NzUwNDA5MA==&mid=200596752&idx=1&sn=37ecae802f32 ...

  3. androidclient和站点数据交互的实现(基于Http协议获取数据方法)

    androidclient一般不直接訪问站点数据库,而是像浏览器一样发送get或者post请求.然后站点返回client能理解的数据格式,client解析这些数据.显示在界面上.经常使用的数据格式是x ...

  4. Codeforces 429D Tricky Function 近期点对

    题目链接:点击打开链接 暴力出奇迹. 正解应该是近期点对.以i点为x轴,sum[i](前缀和)为y轴,求随意两点间的距离. 先来个科学的暴力代码: #include<stdio.h> #i ...

  5. hdu5372 Segment Game

    Problem Description Lillian is a clever girl so that she has lots of fans and often receives gifts f ...

  6. HDU1788 Chinese remainder theorem again【中国剩余定理】

    题目链接: pid=1788">http://acm.hdu.edu.cn/showproblem.php?pid=1788 题目大意: 题眼下边的描写叙述是多余的... 一个正整N除 ...

  7. Java io流的学习

    近期几天细致学了Java的io流.本来是打算看视频通过视频来学习的.但是后来发现事实上视频看不怎么懂也感觉不是非常easy上手,所以就通过百度和api文档学习了Java的io流 io流能够有两个分类, ...

  8. hdu1234 开门人和关门人 (等价转换)

    开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  9. es8 --- 新特性

    ES8尚未发布(2017年1月),下面是它已经完成起草的一些特性: Object.values() Object.entries() padStart() padEnd() Object.getOwn ...

  10. js --- 事件流

    1.事件流 事件发生时会在元素节点与根节点之间按照特定的顺序传播,路径所经过的所有节点都会收到该事件,这个传播过程即DOM事件流. 2.两种事件流模型 1.冒泡型事件流:事件的传播是从最特定的事件目标 ...