Spring学习之旅(八) Spring Security的使用

辛苦堆砌,转载请注明出处,谢谢!

        之前的User校验我们自己通过比较用户名和密码来完成,这样可能存在一些安全隐患,还需要自己处理Session的问题。本篇文章使用Spring Security进行安全校验,对项目进行重构。

        Spring Security是Spring实现的安全框架,可以对请求和方法进行安全保护,Spring Security根本上是一套Filter链,当配置使用Spring Security时,Spring会向项目中添加Filter,从而对请求进行拦截,并进行必要的安全校验。

        首先,为了让Spring支持Spring Security,需要添加必要的依赖,这是因为Spring Security不属于Spring Framework,是一个独立的项目。

<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-web</artifactId>
	<version>${spring-security-web.version}</version>
</dependency>
<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-config</artifactId>
	<version>${spring-security-web.version}</version>
</dependency>
然后,创建如下的类

package com.yjp.springmvc.blog.config;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;

public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {
}
该类派生自AbstractSecurityWebApplicationInitializer,这样,当启用Spring Security时,会加入安全校验需要的Filter链。 最后,启用Spring Security,并配置拦截规则和用户数据源

package com.yjp.springmvc.blog.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	
	@Autowired
	private UserDetailsService userDetailsService;
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		//配置拦截规则
		http
			.formLogin()
				.loginPage("/login")
				.failureUrl("/loginError")
			.and()
			.logout()
				.logoutSuccessUrl("/login")
			.and()
			.authorizeRequests()
				.antMatchers("/").authenticated()
				.antMatchers("/**").permitAll();
	}
	
	@Override
	protected void configure(AuthenticationManagerBuilder auth) 
			throws Exception {
		auth.userDetailsService(userDetailsService);
	}
}
我们派生了WebSecurityConfigurerAdapter类,并重新实现了两个方法,其中,configure以HttpSecurity为参数的方法,用来定制拦截规则,我们这里拦截"/"请求,其他请求放行,然后通过表单认证,认证表单为login,验证失败进入loginError请求,注销时,默认会进入logout请求,注销成功跳转到login请求。通过 configure以AuthenticationManagerBuilder为参数的方法,我们返回数据源,数据源Spring会从UserDetailsService获取。记得将该配置类引入到RootConfig中。

        下面调整我们之前的项目,删除LoginController,创建SecurityController

package com.yjp.springmvc.blog.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class SecurityController {
	
	@RequestMapping(method=RequestMethod.GET, value="/login")
	public String login(String error) {
		return "login";
	}
	
	@RequestMapping(method=RequestMethod.GET, value="/loginError")
	public String loginError(Model model) {
		model.addAttribute("error", "用户名或密码错误");
		return "login";
	}
}
主要用来处理login流程的请求,将请求与对应的视图挂钩,看看login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>简微</title>
	<link rel="stylesheet" type="text/css" href="resources/css/login.css">
	<link rel="stylesheet" type="text/css" href="resources/css/error.css">
</head>
<body>
	<div class="loginPanel">
	    <div>
	        <img src="resources/images/logo.png" alt="简微"/>
	    </div>
	    <form method="post" action="login">
	        <table>
	            <tr>
	                <td colspan="2" align="center" style="font-weight:bold">会员登录</td>
	            </tr>
	            <tr>
	                <td>名称:</td>
	                <td><input type="text" name="username"/></td>
	            </tr>
	            <tr>
	                <td>密码:</td>
	                <td><input type="password" name="password"/></td>
	            </tr>
	            <tr>
	        		<td colspan="2" align="center"><span class="error">${error}</span></td>
	        	</tr>
	            <tr>
	                <td colspan="2" align="center"><input type="submit" value="登入"></td>
	            </tr>
            	<tr>
            		<td align="center"><a href="registerPage">注册</a></td>
                	<td align="center"><a href="forgotPage">忘记密码?</a></td>
            	</tr>
	        </table>
	        <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
	    </form>
    </div>
    <div>
        <h1>简微</h1>
        <ul>
	        <li>说你想说</li>
	        <li>看你想看</li>
	        <li>就这么简单</li>
    	</ul>
    </div>
</body>
</html>
删除了之前用Spring标签库做的内容,表单发送POST请求到login,这里千万注意,我们拦截规则的formPage中的/login是GET请求,会发送到我们的SecurityController处理,然后返回login.jsp视图,而视图表单中的login是POST给Spring Security处理的,会完成及鉴权相关的工作。另外,编单中添加了一个
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
这个是防止CSRF攻击的,Spring Security要求要有这个表单域。这样,如果我们输入的用户名密码与数据源比较通过校验,就会进入"/"请求,我们在HomeController中处理该请求

package com.yjp.springmvc.blog.web.controller;

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
	@RequestMapping(method=RequestMethod.GET, value="/")
	public String home(Model model) {
		//通过Spring Security获取当前的用户
		UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext()
			    .getAuthentication()
			    .getPrincipal();
		
		model.addAttribute("username", userDetails.getUsername());
		return "home";
	}
}
该请求会跳转到home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isELIgnored="false"%>
<!DOCTYPE html">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>简微</title>
	<link rel="stylesheet" href="resources/css/home.css" type="text/css">
</head>
<body>
	<div class="leftPanel">
		<img src="resources/images/logo.png" alt="简微" /><br><br>
		<form method="post" action="logout" style="">
			<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
			<button type="submit">注销 ${username}</button>
		</form>
	</div>
	
	<form method="post" action="message">
		说说你的事...<br><br>
        <textarea cols='60' rows='4' name='blabla'></textarea><br><br>
		<button type="submit">送出</button>
	</form>
</body>
</html>
这里的home.jsp我们已经完成了注销功能,注意有一个发送POST logout请求的表单,这个同样的道理,注销流程会交给Spring Security处理,主要是清除及鉴权相关的数据。

        最后,由于我们要给鉴权提供数据源,持久层做了相应的改动,首先看看UserService

package com.yjp.springmvc.blog.beans.service;

import org.springframework.security.core.userdetails.UserDetailsService;

import com.yjp.springmvc.blog.beans.model.User;

public interface UserService extends UserDetailsService {
	boolean saveUser(User user);
}


package com.yjp.springmvc.blog.beans.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.yjp.springmvc.blog.beans.model.User;
import com.yjp.springmvc.blog.beans.repository.UserRepository;

@Service
public class UserServiceImpl implements UserService {
	
	@Autowired
	private UserRepository userRepository;
	
	@Override
	public boolean saveUser(User user) {
		User saveUser = userRepository.save(user);
		return saveUser != null;
	}

	@Override
	public UserDetails loadUserByUsername(String username) 
			throws UsernameNotFoundException {
		UserDetails findUser = 
				userRepository.findUserByUsername(username);
		if (findUser != null) {
			return findUser;
		} else {
			return null;
		}
	}
}
UserService实现了UserDetailsService接口,用来提供数据源,我们的数据源就是User对象,但是User对象实现了UserDetails接口

package com.yjp.springmvc.blog.beans.model;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

@Entity
@Table(name="users")
public class User implements Serializable, UserDetails {
			
	private static final long serialVersionUID = 9038460243059691075L;
	
	@Id
	@GenericGenerator(strategy = "assigned", name = "username")
	private String username;
	
	@Column
	private String password;
	
	@Column
	private String email;
	
	public User() {}
	
	public User(String username, String password, String email) {
		this.username = username;
		this.password = password;
		this.email = email;
	}

	public String getUsername() {
		return username;
	}
	
	public void setUsername(String username) {
		this.username = username;
	}
	
	public String getPassword() {
		return password;
	}
	
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String getEmail() {
		return email;
	}
	
	public void setEmail(String email) {
		this.email = email;
	}

	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		//返回用户权限
		return Arrays.asList(new SimpleGrantedAuthority("USER"));
	}

	@Override
	public boolean isAccountNonExpired() {
		//账户是否会过期
		return true;
	}

	@Override
	public boolean isAccountNonLocked() {
		//用户是否被锁定
		return true;
	}

	@Override
	public boolean isCredentialsNonExpired() {
		//密码是否会过期
		return true;
	}

	@Override
	public boolean isEnabled() {
		//用户是否使能
		return true;
	}

}
UserDetails接口的方法已经添加注释,可以酌情修改。这样就完成了Spring Security的配置,并将其使用在了我们的项目中。














  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 基本Bean装配 2.1 容纳你的Bean 2.1.1 BeanFactory介绍 2.1.2 使用应用上下文 2.1.3 Bean的生命 2.2 创建Bean 2.2.1 声明一个简单的Bean 2.2.2 通过构造函数注入 2.3 注入Bean属性 2.3.1 注入简单的数值 2.3.2 使用其他的Bean 2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean 2.6 小结 第3章 高级Bean装配 3.1 声明父Bean和子Bean 3.1.1 抽象基Bean类型 3.1.2 抽象共同属性 3.2 方法注入 3.2.1 基本的方法替换 3.2.2 获取器注入 3.3 注入非Spring Bean 3.4 注册自定义属性编辑器 3.5 使用Spring的特殊Bean 3.5.1 后处理Bean 3.5.2 Bean工厂的后处理 3.5.3 配置属性的外在化 3.5.4 提取文本消息 3.5.5 程序事件的解耦 3.5.6 让Bean了解容器 3.6 脚本化的Bean 3.6.1 给椰子上Lime 3.6.2 脚本化Bean 3.6.3 注入脚本化Bean的属性 3.6.4 刷新脚本化Bean 3.6.5 编写内嵌的脚本化Bean 3.7 小结 第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源连接池 5.2.3 基于JDBC驱动的数据源 5.3 在Spring使用JDBC 5.3.1 处理失控的JDBC代码 5.3.2 使用JDBC模板 5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS的DAO 5.7 缓存 5.7.1 配置缓存方案 5.7.2 缓存的代理Bean 5.7.3 注解驱动的缓存 5.8 小结 第6章 事务管理 6.1 理解事务 6.1.1 仅用4个词解释事务 6.1.2 理解Spring对事务管理的支持 6.2 选择事务管理器 6.2.1 JDBC事务 6.2.2 Hibernate事务 6.2.3 JPA事务 6.2.4 JDO事务 6.2.5 JTA事务 6.3 在Spring中编写事务 6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5 小结 第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider Manager 7.2.2 根据数据库验证身份 7.2.3 根据LDAP仓库进行身份验证 7.3 控制访问 7.3.1 访问决策投票 7.3.2 决定如何投票 7.3.3 处理投票弃权 7.4 保护Web应用程序 7.4.1 代理Spring Security的过滤器 7.4.2 处理安全上下文 7.4.3 提示用户登录 7.4.4 处理安全例外 7.4.5 强制Web安全性 7.4.6 确保一个安全的通道 7.5 视图层安全 7.5.1 有条件地渲染内容 7.5.2 显示用户身份验证信息 7.6 保护方法调用 7.6.1 创建一个安全切面 7.6.2 使用元数据保护方法 7.7 小结 第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap的远程调用 8.3.1 访问Hessian/Burlap服务 8.3.2 用Hessian或Burlap公开Bean的功能 8.4 使用HTTP invoker 8.4.1 通过HTTP访问服务 8.4.2 把Bean作为HTTP服务公开 8.5 Spring和Web服务 8.5.1 使用XFire将Bean输出为Web服务 8.5.2 使用JSR-181注释声明Web服务 8.5.3 消费Web服务 8.5.4 使用XFire客户端代理Web服务 8.6 小结 第9章 在Spring中建立契约优先Web服务 9.1 介绍Spring-WS 9.2 定义契约(首先!) 9.3 使用服务端点处理消息 9.3.1 建立基于JDOM消息的端点 9.3.2 序列化消息载荷 9.4 合并在一起 9.4.1 Spring-WS:全景视图 9.4.2 将消息映射到端点 9.4.3 置入服务端点 9.4.4 配置消息序列化器 9.4.5 处理端点异常 9.4.6 提供WSDL文件 9.4.7 部署服务 9.5 消费Spring-WS Web服务 9.5.1 使用Web服务模板 9.5.2 使用Web服务的网关支持 9.6 小结 第10章 Spring消息 10.1 JMS简介 10.1.1 构建JMS 10.1.2 介绍JMS的优点 10.1.3 在Spring中安装ActiveMQ 10.2 协同使用JMS和Spring 10.2.1 处理冗长失控的JMS代码 10.2.2 使用JMS模板 10.2.3 转换消息 10.2.4 将Spring的网关支持类应用于JMS 10.3 创建消息驱动POJO 10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP 10.4 使用基于消息的RPC 10.4.1 引入Lingo 10.4.2 输出服务 10.4.3 代理JMS 10.5 小结 第11章 Spring和EJB 11.1 在Spring中置入EJB 11.1.1 代理会话Bean(EJB 2.x) 11.1.2 将EJB置入Spring Bean 11.2 开发Spring驱动的EJB(EJB 2.x) 11.3 Spring和EJB3 11.3.1 引入Pitchfork 11.3.2 从Pitchfork起步 11.3.3 通过注释注入资源 11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送器 12.2.2 构建电子邮件 12.3 调度任务 12.3.1 使用Java Timer调度任务 12.3.2 使用Quartz调度器 12.3.3 按调度计划调用方法 12.4 使用JMX管理Spring Bean 12.4.1 将Spring Bean输出为MBean 12.4.2 远程访问MBean 12.4.3 处理通知 12.5 小结 第三部分 Spring客户端 第13章 处理Web请求 13.1 开始Spring MVC之旅 13.1.1 请求生命中的一天 13.1.2 配置DispatcherServlet 13.1.3 Spring MVC概述 13.2 将请求映射到控制器 13.2.1 使用SimpleUrlHandler Mapping 13.2.2 使用ControllerClassName HandlerMapping 13.2.3 使用元数据映射控制器 13.2.4 使用多映射处理器 13.3 用控制器处理请求 13.3.1 处理命令 13.3.2 处理表单提交 13.3.3 用向导处理复杂表单 13.3.4 使用一次性控制器 13.4 处理异常 13.5 小结 第14章 渲染Web视图 14.1 视图解析 14.1.1 使用模板视图 14.1.2 解析视图Bean 14.1.3 选择视图解析器 14.2 使用Spring模板 14.2.1 绑定表单数据 14.2.2 渲染被存储在外部的文本 14.2.3 显示错误 14.3 使用Tile设计页面布局 14.3.1 Tile视图 14.3.2 Tile控制器 14.4 使用JSP的替代技术 14.4.1 使用Velocity模板 14.4.2 使用FreeMarker 14.5 产生非HTML输出 14.5.1 产生Excel工作表 14.5.2 产生PDF文档 14.5.3 开发自定义视图 14.6 小结 第15章 使用Spring Web Flow 15.1 开始Spring Web Flow之旅 15.1.1 安装Spring Web Flow 15.1.2 配置流程执行程序 15.1.3 登记流程定义 15.2 布置流程的基础 15.2.1 流程变量 15.2.2 start和end状态 15.2.3 搜集顾客信息 15.2.4 绑定比萨饼订单 15.2.5 完成订单 15.2.6 几个结束工作 15.3 高级Web流程技术 15.3.1 使用decision状态 15.3.2 提炼子流程并使用子状态 15.4 集成Spring Web Flow与其他框架 15.4.1 Jakarts Struts 15.4.2 JavaServer Face 15.5 小结 第16章 集成其他Web框架 16.1 协同使用Spring和Struts 16.1.1 向Struts注册Spring插件 16.1.2 编写知晓Spring的Struts动作 16.1.3 委托Spring配置的动作 16.1.4 关于Struts 2 16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring Bean 16.4.3 在JSF页面中使用Spring Bean 16.4.4 在JSF中暴露应用程序环境 16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把Spring添加为一个Maven 2依赖项 A.3 Spring与Ant A.4 Spring与Log4j 附录B 用(和不用)Spring进行测试 B.1 测试简介 B.1.1 理解不同类型的测试 B.1.2 使用JUnit B.1.3 Spring在测试中的角色 B.2 单元测试Spring MVC控制器 B.2.1 模拟对象 B.2.2 断言ModelAndView的内容 B.3 使用Spring进行综合测试 B.3.1 测试装配后的对象 B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在JUnit 4中进行测试 B.4 小结
目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 1.3.1依赖注入 1.3.2di应用 1.3.3企业级应用中的依赖注入 1.4应用aop 1.4.1aop介绍 1.4.2aop使用 1.5小结 第2章基本bean装配 2.1容纳你的bean 2.1.1beanfactory介绍 2.1.2使用应用上下文 2.1.3bean的生命 2.2创建bean 2.2.1声明一个简单的bean 2.2.2通过构造函数注入 2.3注入bean属性 2.3.1注入简单的数值 2.3.2使用其他的bean 2.3.3装配集合 2.3.4装配空值 2.4自动装配 2.4.1四种自动装配类型 2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁bean 2.6小结 第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基bean类型 3.1.2抽象共同属性 3.2方法注入 3.2.1基本的方法替换 3.2.2获取器注入 3.3注入非springbean 3.4注册自定义属性编辑器 3.5使用spring的特殊bean 3.5.1后处理bean 3.5.2bean工厂的后处理 3.5.3配置属性的外在化 3.5.4提取文本消息 3.5.5程序事件的解耦 3.5.6让bean了解容器 3.6脚本化的bean 3.6.1给椰子上lime 3.6.2脚本化bean 3.6.3注入脚本化bean的属性 3.6.4刷新脚本化bean 3.6.5编写内嵌的脚本化bean 3.7小结 第4章通知bean 4.1aop简介 4.1.1定义aop术语 4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动代理 4.3.2自动代理@aspectj切面 4.4定义纯粹的pojo切面 4.5注入aspectj切面 4.6小结 第二部分企业spring 第5章使用数据库 5.1spring的数据访问哲学 5.1.1了解spring数据访问的异常体系 5.1.2数据访问的模板化 5.1.3使用dao支持类 5.2配置数据源 5.2.1使用jndi数据源 5.2.2使用数据源连接池 5.2.3基于jdbc驱动的数据源 5.3在spring使用jdbc 5.3.1处理失控的jdbc代码 5.3.2使用jdbc模板 5.3.3使用spring对jdbc的dao支持类 5.4在spring里集成hibernate 5.4.1选择hibernate的版本 5.4.2使用hibernate模板 5.4.3建立基于hibernate的dao 5.4.4使用hibernate3上下文会话 5.5spring和java持久api 5.5.1使用jpa模板 5.5.2创建一个实体管理器工厂 5.5.3建立使用jpa的dao 5.6spring和ibatis 5.6.1配置ibatis客户模板 5.6.2建立基于ibatis的dao 5.7缓存 5.7.1配置缓存方案 5.7.2缓存的代理bean 5.7.3注解驱动的缓存 5.8小结 第6章事务管理 6.1理解事务 6.1.1仅用4个词解释事务 6.1.2理解spring对事务管理的支持 6.2选择事务管理器 6.2.1jdbc事务 6.2.2hibernate事务 6.2.3jpa事务 6.2.4jdo事务 6.2.5jta事务 6.3在spring中编写事务 6.4声明式事务 6.4.1定义事务参数 6.4.2代理事务 6.4.3在spring2.0里声明事务 6.4.4定义注释驱动事务 6.5小结 第7章保护spring 7.1springsecurity介绍 7.2验证用户身份 7.2.1配置providermanager 7.2.2根据数据库验证身份 7.2.3根据ldap仓库进行身份验证 7.3控制访问 7.3.1访问决策投票 7.3.2决定如何投票 7.3.3处理投票弃权 7.4保护web应用程序 7.4.1代理springsecurity的过滤器 7.4.2处理安全上下文 7.4.3
当然可以,以下是一份关于您的Java SpringBoot项目的简介描述: 探索Java的SpringBoot魔法 亲爱的开发者们,准备好一起踏上这次深入Java的SpringBoot之旅了吗?如果您正在寻找一个现代化、高效且易于扩展的开发框架,那么这个SpringBoot项目将是您的理想选择。 主要特点: 快速开发:SpringBoot通过自动配置和约定大于配置的原则,大大简化了项目设置和开发过程。 易于扩展:SpringBoot与生俱来的灵活性使您可以轻松集成各种服务和数据库,以满足您日益增长的需求。 安全性:内置的安全特性,如OAuth2和Spring Security,确保您的应用程序安全无虞。 微服务支持:SpringBoot是微服务架构的理想选择,可以帮助您构建模块化、可扩展的应用程序。 社区支持:全球的开发者社区意味着您可以在遇到问题时找到大量的资源和支持。 无论您是初出茅庐的Java新手,还是经验丰富的开发者,这个项目都将为您提供一个深入了解SpringBoot的机会。无论您是想学习新的技能,还是想提高现有应用程序的性能,这个项目都将是您的宝贵资源。 内容概览 项目设置和初始化 控制器设计和实现 数据持久化与数据库集成 安全性和身份验证 性能优化和监控 部署和生产环境考虑 现在,是时候让您的Java技能得到充分发挥,并掌握SpringBoot的魔法了!这个项目将带领您从基础到高级,探索SpringBoot的每一个角落。
第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 基本Bean装配 2.1 容纳你的Bean 2.1.1 BeanFactory介绍 2.1.2 使用应用上下文 2.1.3 Bean的生命 2.2 创建Bean 2.2.1 声明一个简单的Bean 2.2.2 通过构造函数注入 2.3 注入Bean属性 2.3.1 注入简单的数值 2.3.2 使用其他的Bean 2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 初始化和销毁Bean 2.6 小结 第3章 高级Bean装配 3.1 声明父Bean和子Bean 3.1.1 抽象基Bean类型 3.1.2 抽象共同属性 3.2 方法注入 3.2.1 基本的方法替换 3.2.2 获取器注入 3.3 注入非Spring Bean 3.4 注册自定义属性编辑器 3.5 使用Spring的特殊Bean 3.5.1 后处理Bean 3.5.2 Bean工厂的后处理 3.5.3 配置属性的外在化 3.5.4 提取文本消息 3.5.5 程序事件的解耦 3.5.6 让Bean了解容器 3.6 脚本化的Bean 3.6.1 给椰子上Lime 3.6.2 脚本化Bean 3.6.3 注入脚本化Bean的属性 3.6.4 刷新脚本化Bean 3.6.5 编写内嵌的脚本化Bean 3.7 小结 第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据访问的异常体系 5.1.2 数据访问的模板化 5.1.3 使用DAO支持类 5.2 配置数据源 5.2.1 使用JNDI数据源 5.2.2 使用数据源连接池 5.2.3 基于JDBC驱动的数据源 5.3 在Spring使用JDBC 5.3.1 处理失控的JDBC代码 5.3.2 使用JDBC模板 5.3.3 使用Spring对JDBC的DAO支持类 5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS的DAO 5.7 缓存 5.7.1 配置缓存方案 5.7.2 缓存的代理Bean 5.7.3 注解驱动的缓存 5.8 小结 第6章 事务管理 6.1 理解事务 6.1.1 仅用4个词解释事务 6.1.2 理解Spring对事务管理的支持 6.2 选择事务管理器 6.2.1 JDBC事务 6.2.2 Hibernate事务 6.2.3 JPA事务 6.2.4 JDO事务 6.2.5 JTA事务 6.3 在Spring中编写事务 6.4 声明式事务 6.4.1 定义事务参数 6.4.2 代理事务 6.4.3 在Spring 2.0里声明事务 6.4.4 定义注释驱动事务 6.5 小结 第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider Manager 7.2.2 根据数据库验证身份 7.2.3 根据LDAP仓库进行身份验证 7.3 控制访问 7.3.1 访问决策投票 7.3.2 决定如何投票 7.3.3 处理投票弃权 7.4 保护Web应用程序 7.4.1 代理Spring Security的过滤器 7.4.2 处理安全上下文 7.4.3 提示用户登录 7.4.4 处理安全例外 7.4.5 强制Web安全性 7.4.6 确保一个安全的通道 7.5 视图层安全 7.5.1 有条件地渲染内容 7.5.2 显示用户身份验证信息 7.6 保护方法调用 7.6.1 创建一个安全切面 7.6.2 使用元数据保护方法 7.7 小结 第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap的远程调用 8.3.1 访问Hessian/Burlap服务 8.3.2 用Hessian或Burlap公开Bean的功能 8.4 使用HTTP invoker 8.4.1 通过HTTP访问服务 8.4.2 把Bean作为HTTP服务公开 8.5 Spring和Web服务 8.5.1 使用XFire将Bean输出为Web服务 8.5.2 使用JSR-181注释声明Web服务 8.5.3 消费Web服务 8.5.4 使用XFire客户端代理Web服务 8.6 小结 第9章 在Spring中建立契约优先Web服务 9.1 介绍Spring-WS 9.2 定义契约(首先!) 9.3 使用服务端点处理消息 9.3.1 建立基于JDOM消息的端点 9.3.2 序列化消息载荷 9.4 合并在一起 9.4.1 Spring-WS:全景视图 9.4.2 将消息映射到端点 9.4.3 置入服务端点 9.4.4 配置消息序列化器 9.4.5 处理端点异常 9.4.6 提供WSDL文件 9.4.7 部署服务 9.5 消费Spring-WS Web服务 9.5.1 使用Web服务模板 9.5.2 使用Web服务的网关支持 9.6 小结 第10章 Spring消息 10.1 JMS简介 10.1.1 构建JMS 10.1.2 介绍JMS的优点 10.1.3 在Spring中安装ActiveMQ 10.2 协同使用JMS和Spring 10.2.1 处理冗长失控的JMS代码 10.2.2 使用JMS模板 10.2.3 转换消息 10.2.4 将Spring的网关支持类应用于JMS 10.3 创建消息驱动POJO 10.3.1 创建消息监听器 10.3.2 编写纯POJO MDP 10.4 使用基于消息的RPC 10.4.1 引入Lingo 10.4.2 输出服务 10.4.3 代理JMS 10.5 小结 第11章 Spring和EJB 11.1 在Spring中置入EJB 11.1.1 代理会话Bean(EJB 2.x) 11.1.2 将EJB置入Spring Bean 11.2 开发Spring驱动的EJB(EJB 2.x) 11.3 Spring和EJB3 11.3.1 引入Pitchfork 11.3.2 从Pitchfork起步 11.3.3 通过注释注入资源 11.3.4 使用注释声明拦截器 11.4 小结 第12章 访问企业服务 12.1 从JNDI中获取对象 12.1.1 使用传统的JNDI 12.1.2 注入JNDI对象 12.1.3 在Spring 2中注入JNDI对象 12.2 发送电子邮件 12.2.1 配置邮件发送器 12.2.2 构建电子邮件 12.3 调度任务 12.3.1 使用Java Timer调度任务 12.3.2 使用Quartz调度器 12.3.3 按调度计划调用方法 12.4 使用JMX管理Spring Bean 12.4.1 将Spring Bean输出为MBean 12.4.2 远程访问MBean 12.4.3 处理通知 12.5 小结 第三部分 Spring客户端 第13章 处理Web请求 13.1 开始Spring MVC之旅 13.1.1 请求生命中的一天 13.1.2 配置DispatcherServlet 13.1.3 Spring MVC概述 13.2 将请求映射到控制器 13.2.1 使用SimpleUrlHandler Mapping 13.2.2 使用ControllerClassName HandlerMapping 13.2.3 使用元数据映射控制器 13.2.4 使用多映射处理器 13.3 用控制器处理请求 13.3.1 处理命令 13.3.2 处理表单提交 13.3.3 用向导处理复杂表单 13.3.4 使用一次性控制器 13.4 处理异常 13.5 小结 第14章 渲染Web视图 14.1 视图解析 14.1.1 使用模板视图 14.1.2 解析视图Bean 14.1.3 选择视图解析器 14.2 使用Spring模板 14.2.1 绑定表单数据 14.2.2 渲染被存储在外部的文本 14.2.3 显示错误 14.3 使用Tile设计页面布局 14.3.1 Tile视图 14.3.2 Tile控制器 14.4 使用JSP的替代技术 14.4.1 使用Velocity模板 14.4.2 使用FreeMarker 14.5 产生非HTML输出 14.5.1 产生Excel工作表 14.5.2 产生PDF文档 14.5.3 开发自定义视图 14.6 小结 第15章 使用Spring Web Flow 15.1 开始Spring Web Flow之旅 15.1.1 安装Spring Web Flow 15.1.2 配置流程执行程序 15.1.3 登记流程定义 15.2 布置流程的基础 15.2.1 流程变量 15.2.2 start和end状态 15.2.3 搜集顾客信息 15.2.4 绑定比萨饼订单 15.2.5 完成订单 15.2.6 几个结束工作 15.3 高级Web流程技术 15.3.1 使用decision状态 15.3.2 提炼子流程并使用子状态 15.4 集成Spring Web Flow与其他框架 15.4.1 Jakarts Struts 15.4.2 JavaServer Face 15.5 小结 第16章 集成其他Web框架 16.1 协同使用Spring和Struts 16.1.1 向Struts注册Spring插件 16.1.2 编写知晓Spring的Struts动作 16.1.3 委托Spring配置的动作 16.1.4 关于Struts 2 16.2 协同使用Spring和WebWork 2/Struts 2 16.3 集成Spring和Tapestry 16.3.1 集成Spring和Tapestry 3 16.3.2 集成Spring和Tapestry 4 16.4 协同使用Spring和JSF 16.4.1 解析JSF管理的属性 16.4.2 解析Spring Bean 16.4.3 在JSF页面中使用Spring Bean 16.4.4 在JSF中暴露应用程序环境 16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A.1.2 构建自己的类路径 A.2 把Spring添加为一个Maven 2依赖项 A.3 Spring与Ant A.4 Spring与Log4j 附录B 用(和不用)Spring进行测试 B.1 测试简介 B.1.1 理解不同类型的测试 B.1.2 使用JUnit B.1.3 Spring在测试中的角色 B.2 单元测试Spring MVC控制器 B.2.1 模拟对象 B.2.2 断言ModelAndView的内容 B.3 使用Spring进行综合测试 B.3.1 测试装配后的对象 B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在JUnit 4中进行测试 B.4 小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值