本章学习目标 小风 Java 实战系列教程 Shiro 核心功能 Shiro 的 Web 集成 Spring 与 Shiro 整合 SpringBoot 整合 Shiro 1. Shiro 核心功能 1.1. RBAC 模型 在 RBAC 的模型, 涉及到三个关键的元素 : 1) 用户 : 系统的使

Size: px
Start display at page:

Download "本章学习目标 小风 Java 实战系列教程 Shiro 核心功能 Shiro 的 Web 集成 Spring 与 Shiro 整合 SpringBoot 整合 Shiro 1. Shiro 核心功能 1.1. RBAC 模型 在 RBAC 的模型, 涉及到三个关键的元素 : 1) 用户 : 系统的使"

Transcription

1 本章学习目标 Shiro 核心功能 Shiro 的 Web 集成 Spring 与 Shiro 整合 SpringBoot 整合 Shiro 1. Shiro 核心功能 1.1. RBAC 模型 在 RBAC 的模型, 涉及到三个关键的元素 : 1) 用户 : 系统的使用用户 ( 登录用户 ) 2) 角色 : 拥有相同的权限的用户 3) 权限 : 系统可以被用户操作的元素 ( 例如 : 系统菜单, 超链接, 文件等 ) 以上三个元素有一定的关系 : 1) 用户和角色是多对多的关系 2) 角色和权限是多对多的关系 1.2. 设计权限表结构 使用 PowerDesigner

2 1.3. Shiro 框架简介 Shiro 是 Apache 组织的开源的 Java 安全框架 Shiro 的 6 个核心功能 :

3 其中, 认证与授权是 Shiro 的基础核心功能 1.4. Shiro 的三大核心 API

4 1)Subject 关联 SecurityManager 2)SecurityManager 关联 Realm 1.5. Shiro 的认证操作 建立 maven 项目, 导入 shiro 的坐标 <!-- 导入 shiro 的坐标 --> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-all</artifactid> <version>1.3.2</version> </dependency>

5 注意 :Shiro 底层依赖 commons-logging 包, 如果不导入的话 : <dependency> <groupid>commons-logging</groupid> <artifactid>commons-logging</artifactid> <version>1.2</version> </dependency> 建立自定义 Realm package cn.sm1234.realms; import org.apache.shiro.authc.authenticationexception; import org.apache.shiro.authc.authenticationinfo; import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authz.authorizationinfo; import org.apache.shiro.realm.authorizingrealm; import org.apache.shiro.subject.principalcollection; /** * 自定义 Realm lenovo * */ public class MyRealm extends AuthorizingRealm{

6 // 授权方法 : protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { return null; // 认证方法 : protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { return null; 建立 ini 配置 SecurityManager 关联 Realm 建立 shiro.ini 配置, 内容如下 : myrealm=cn.sm1234.realms.myrealm securitymanager.realm=$myrealm 编写 Shiro 的认证流程 package cn.sm1234.shiro; import org.apache.shiro.securityutils;

7 import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authc.incorrectcredentialsexception; import org.apache.shiro.authc.unknownaccountexception; import org.apache.shiro.authc.usernamepasswordtoken; import org.apache.shiro.config.inisecuritymanagerfactory; import org.apache.shiro.mgt.securitymanager; import org.apache.shiro.subject.subject; import org.apache.shiro.util.factory; /** * 执行 Shiro 的认证流程 lenovo * */ public class Demo1 { public static void main(string[] args) { //1. 创建安全管理器工厂 Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); //2. 创建安全管理器 SecurityManager securitymanager = factory.getinstance(); //3. 初始化 SecurityUtils 工具类 SecurityUtils.setSecurityManager(securityManager); //4. 从 SecurityUtils 工具中获取 Subject Subject subject = SecurityUtils.getSubject();

8 //5. 认证操作 ( 登录 ) //AuthenticationToken: 用于封装用户输入的账户信息 AuthenticationToken token = new UsernamePasswordToken("eric", "123456"); try { subject.login(token); // 如果 login 方法没有任何异常, 代表认证成功 System.out.println(" 登录成功 "); catch (UnknownAccountException e) { // 账户不存在 System.out.println(" 账户不存在 "); catch (IncorrectCredentialsException e) { // 密码错误 System.out.println(" 密码错误 "); catch (Exception e) { // 系统错误 System.out.println(" 系统错误 "); 在 Realm 编写认证的逻辑 package cn.sm1234.realms; import org.apache.shiro.authc.authenticationexception;

9 import org.apache.shiro.authc.authenticationinfo; import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authc.simpleauthenticationinfo; import org.apache.shiro.authc.usernamepasswordtoken; import org.apache.shiro.authz.authorizationinfo; import org.apache.shiro.realm.authorizingrealm; import org.apache.shiro.subject.principalcollection; /** * 自定义 Realm lenovo * */ public class MyRealm extends AuthorizingRealm{ // 授权方法 : protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { return null; // 认证方法 : protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { System.out.println(" 执行认证方法..."); // 判断用户名是否存在, 判断密码是否正确

10 //1. 如果获取用户输入的账户信息? UsernamePasswordToken token = (UsernamePasswordToken)arg0; String username = token.getusername(); //2. 如果获取数据库的账户信息? // 模拟数据库的账户信息 String name = "jack"; String password = "1234"; // 判断用户名 if(!username.equals(name)){ return null; // shiro 底层自动抛出 UnknownAccountException // 判断密码 /** * 参数一 :principal, 用于把数据回传到 login 方法 * 参数二 : 数据库的密码 * Shiro 底层对比密码的结果 : * 1) 密码正确 : 认证通过 * 2) 密码不正确 : 自动抛出 IncorrectCredentialsException * 参数三 :realm 的名称, 只有在多个 realm 的是才会使用 */ return new SimpleAuthenticationInfo("callback",password,"");

11 1.6. Shiro 的授权操作 Shiro 的授权操作分为两种不同方式 : 1) 基于资源的授权必须得到资源的授权码才可以访问该资源 2) 基于角色的授权必须得到该角色, 才可以访问该资源 注意 : 如果要进行 Shiro 的授权操作, 必须先完成 Shiro 的认证 基于资源的授权 // 进行 Shiro 的授权 //1. 基于资源的授权 // 判断当前登录用户是否有 商品添加 功能 //ispermitted(): 返回 true, 有权限, false: 没有权限 System.out.println("productAdd="+subject.isPermitted("productAdd")); Realm 的授权方法 : // 授权方法 : protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { System.out.println(" 执行授权方法..."); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 资源授权码 info.addstringpermission("productadd");

12 return info; 基于角色的授权 //2. 基于角色的授权 // 判断当前登录用户是否为 超级管理员 System.out.println("admin="+subject.hasRole("admin")); // 授权方法 : protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { System.out.println(" 执行授权方法..."); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 资源授权码 //info.addstringpermission("productadd"); // 进行通配符授权 info.addstringpermission("product:*"); // 角色授权码 info.addrole("admin"); return info;

13 2. Shiro 的 Web 集成 2.1. Shiro 与 Web 集成环境搭建 建立 maven 的 web 项目, 导入坐标 <!-- shiro 坐标 --> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-all</artifactid> <version>1.3.2</version> </dependency> <dependency> <groupid>commons-logging</groupid> <artifactid>commons-logging</artifactid> <version>1.2</version> </dependency> <!-- servlet,jsp 坐标 --> <dependency> <groupid>javax.servlet</groupid>

14 <artifactid>javax.servlet-api</artifactid> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupid>javax.servlet</groupid> <artifactid>jsp-api</artifactid> <version>2.0</version> <scope>provided</scope> </dependency> 配置 web.xml(*) <!-- shiro 的 web 环境的初始化 : 监听器 --> <!-- EnvironmentLoaderListener: 在 web 应用中加载 shiro 的环境, 加载 shiro.ini --> <listener> <listener-class>org.apache.shiro.web.env.environmentloaderlistener</listener-cl ass> </listener> <!-- 默认加载 WEB-INF/shiro.ini 文件, 如果需要修改路径 --> <context-param> <param-name>shiroconfiglocations</param-name> <param-value>classpath:shiro.ini</param-value> </context-param> <!-- shiro 的过滤器 --> <filter>

15 <filter-name>shirofilter</filter-name> <filter-class>org.apache.shiro.web.servlet.shirofilter</filter-class> </filter> <filter-mapping> <filter-name>shirofilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 定义 Realm package cn.sm1234.realms; import org.apache.shiro.authc.authenticationexception; import org.apache.shiro.authc.authenticationinfo; import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authz.authorizationinfo; import org.apache.shiro.realm.authorizingrealm; import org.apache.shiro.subject.principalcollection; public class MyRealm extends protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { System.out.println(" 执行了授权方法 "); return protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException {

16 System.out.println(" 执行了认证方法 "); return null; 配置 shiro.ini [main] myrealm=cn.sm1234.realms.myrealm securitymanager.realm=$myrealm 2.2. Shiro 的 web 内置过滤器 (*) shiro 的 web 内置过滤器,shiro 自己提供一些专门用于认证, 授权的过滤器 shiro 分为两种过滤器 : 1) 认证过滤器 : anon: 用户不需要认证也可以访问 authc: 用户必须认证才可以访问 user: 用户只要 rememberme, 就可以访问 2) 授权过滤器 perms: 基于资源的授权过滤器 roles : 基于角色的授权过滤器 例如 : [main]

17 myrealm=cn.sm1234.realms.myrealm securitymanager.realm=$myrealm [urls] /index.jsp=authc 2.3. 编写 Shiro 的认证操作 登录页面 page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> 登录页面 </title> </head> <body> <h3> 用户登录 </h3> <form method="post" action="${pagecontext.request.contextpath/login"> 用户名 :<input type="text" name="name"/><br/> 密码 :<input type="password" name="password"/><br/> <input type="submit" value=" 登录 "> </form> </body> </html>

18 编写 LoginServlet package cn.sm1234.web; import java.io.ioexception; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.apache.shiro.securityutils; import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authc.incorrectcredentialsexception; import org.apache.shiro.authc.unknownaccountexception; import org.apache.shiro.authc.usernamepasswordtoken; import org.apache.shiro.subject.subject; /** * 登录 Servlet */ public class LoginServlet extends HttpServlet { private static final long serialversionuid = 1L; protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { //1. 设置请求编码 request.setcharacterencoding("utf-8");

19 //2. 接收用户名和密码 String name = request.getparameter("name"); String password = request.getparameter("password"); //3. 调用 login 方法 //3.1 获取 Subject Subject subject = SecurityUtils.getSubject(); AuthenticationToken token = new UsernamePasswordToken(name, password); try { subject.login(token); // 获取 Principal String dbname = (String)subject.getPrincipal(); // 把用户信息存储到 session request.getsession().setattribute("username", name); // 登录成功 response.sendredirect(request.getcontextpath()+"/index.jsp"); catch (UnknownAccountException e) { request.setattribute("msg", " 用户名不存在 "); request.getrequestdispatcher("/login.jsp").forward(request, response); catch (IncorrectCredentialsException e) { request.setattribute("msg", " 密码错误 "); request.getrequestdispatcher("/login.jsp").forward(request, response);

20 protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { doget(request, response); 编写 Realm 的认证方法 package cn.sm1234.realms; import org.apache.shiro.authc.authenticationexception; import org.apache.shiro.authc.authenticationinfo; import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authc.simpleauthenticationinfo; import org.apache.shiro.authc.usernamepasswordtoken; import org.apache.shiro.authz.authorizationinfo; import org.apache.shiro.realm.authorizingrealm; import org.apache.shiro.subject.principalcollection; public class MyRealm extends protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { System.out.println(" 执行了授权方法 "); return null;

21 @Override protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { System.out.println(" 执行了认证方法 "); //1. 获取用户输入的账户信息 UsernamePasswordToken token = (UsernamePasswordToken)arg0; // 模拟数据库的密码 String name = "jack"; String password = "1234"; if(!token.getusername().equals(name)){ // 用户不存在 return null; // 返回密码 return new SimpleAuthenticationInfo(name,password,""); 注意 :login 登录请求必须使用 anon 放行 : [main] myrealm=cn.sm1234.realms.myrealm

22 securitymanager.realm=$myrealm [urls] /product/list.jsp=anon /login=anon /**=authc 2.4. 编写 Shiro 的授权操作 使用 Shiro 内置授权过滤器 [main] myrealm=cn.sm1234.realms.myrealm securitymanager.realm=$myrealm [urls] /product/list.jsp=anon /login=anon /product/add.jsp=perms[product:add] /**=authc 配置未授权提示页面 [main] perms.unauthorizedurl=/unauth.jsp myrealm=cn.sm1234.realms.myrealm securitymanager.realm=$myrealm [urls]

23 /product/list.jsp=anon /login=anon /product/add.jsp=perms[product:add] /**=authc 编写 Realm 的授权逻辑 package cn.sm1234.realms; import org.apache.shiro.authc.authenticationexception; import org.apache.shiro.authc.authenticationinfo; import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authc.simpleauthenticationinfo; import org.apache.shiro.authc.usernamepasswordtoken; import org.apache.shiro.authz.authorizationinfo; import org.apache.shiro.authz.simpleauthorizationinfo; import org.apache.shiro.realm.authorizingrealm; import org.apache.shiro.subject.principalcollection; public class MyRealm extends protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { System.out.println(" 执行了授权方法 "); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addstringpermission("product:add");

24 return protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { System.out.println(" 执行了认证方法 "); //1. 获取用户输入的账户信息 UsernamePasswordToken token = (UsernamePasswordToken)arg0; // 模拟数据库的密码 String name = "jack"; String password = "1234"; if(!token.getusername().equals(name)){ // 用户不存在 return null; // 返回密码 return new SimpleAuthenticationInfo(name,password,"");

25 2.5. 分析 Shiro 内置过滤器的原理 authc:org.apache.shiro.web.filter.authc.formauthenticationfilter anon:org.apache.shiro.web.filter.authc.anonymousfilter perms:org.apache.shiro.web.filter.authz.permissionsauthorizationfilter roles:org.apache.shiro.web.filter.authz.rolesauthorizationfilter 3. Spring 整合 Shiro(SSM 整合 ) 3.1. 搭建项目环境 ( 导入 SpringMVC) 建立 maven 项目, 导入 Shiro 的坐标 <dependencies> <!-- shiro 坐标 --> <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-all</artifactid> <version>1.3.2</version> </dependency>

26 <dependency> <groupid>commons-logging</groupid> <artifactid>commons-logging</artifactid> <version>1.2</version> </dependency> <!-- servlet,jsp 坐标 --> <dependency> <groupid>javax.servlet</groupid> <artifactid>javax.servlet-api</artifactid> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupid>javax.servlet</groupid> <artifactid>jsp-api</artifactid> <version>2.0</version> <scope>provided</scope> </dependency> <!-- 导入 SpringMVC 支持 --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>4.3.3.release</version> </dependency> </dependencies>

27 配置 web.xml, 启动 SpringMVC <!-- 启动 SpringMVC --> <servlet> <servlet-name>dispatcherservlet</servlet-name> <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class > <load-on-startup>1</load-on-startup> <init-param> <param-name>contextconfiglocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherservlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 配置 spring-mvc.xml <?xml version="1.0" encoding="utf-8"?> <beans xmlns=" xmlns:mvc=" xmlns:contenxt=" xmlns:xsi=" xsi:schemalocation="

28 <!-- Controller 类扫描包 --> <contenxt:component-scan base-package="cn.sm1234.controller"/> <!-- 注解驱动 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.internalresourceviewresolver"> <!-- 前缀 --> <property name="prefix" value="/web-inf/jsp/"/> <!-- 后缀 --> <property name="subffix" value=".jsp"></property> </bean> </beans> 然后拷贝 shiro-web 项目的 jsp 页面到当前项目 :

29 编写 Controller 类 package cn.sm1234.controller; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; /** * 主控制器 lenovo public class MainController

30 public String index(){ return public String tologin(){ return public String unauth(){ return "unauth"; package cn.sm1234.controller; import org.springframework.stereotype.controller; public class ProductController public String toadd(){ return "product/add";

31 @RequestMapping("/toList") public String tolist(){ return public String toupdate(){ return "product/update"; 3.2. Spring 整合 Shiro 导入 Spring 的坐标 <!-- 导入 Spring 的坐标 --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-web</artifactid> <version>4.3.3.release</version> </dependency> 配置 web.xml (*) <!-- 配置 Spring 整合 Shiro 的过滤器 --> <!-- DelegatingFilterProxy: 这个类的作用是把请求拦截下来, 把请求交给 Spirng 容器的一个 bean

32 处理 (bean 的 id 就是 filter-name 的名称 ) --> <filter> <filter-name>shirofilter</filter-name> <filter-class>org.springframework.web.filter.delegatingfilterproxy</filter-clas s> </filter> <filter-mapping> <filter-name>shirofilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 启动 Spring 环境 --> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listener -class> </listener> <context-param> <param-name>contextconfiglocation</param-name> <param-value>classpath:applicationcontext.xml</param-value> </context-param> 编写 applicationcontext.xml(*) <?xml version="1.0" encoding="utf-8"?> <beans xmlns=" xmlns:p="

33 xmlns:xsi=" xsi:schemalocation=" <!-- Shiro 与 Spring 整合 --> <bean id="shirofilter" class="org.apache.shiro.spring.web.shirofilterfactorybean"> <!-- 关联 SecurityManager --> <property name="securitymanager" ref="securitymanager"/> </bean> <bean id="securitymanager" class="org.apache.shiro.web.mgt.defaultwebsecuritymanager"> <!-- 关联 realm --> <property name="realm" ref="realm"/> </bean> <bean id="realm" class="cn.sm1234.realms.myrealm"/> </beans> 编写 Realm package cn.sm1234.realms; import org.apache.shiro.authc.authenticationexception; import org.apache.shiro.authc.authenticationinfo; import org.apache.shiro.authc.authenticationtoken;

34 import org.apache.shiro.authz.authorizationinfo; import org.apache.shiro.realm.authorizingrealm; import org.apache.shiro.subject.principalcollection; public class MyRealm extends protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { // TODO Auto-generated method stub return protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { // TODO Auto-generated method stub return null; 3.3. 使用 Shiro 的认证过滤器拦截页面 <!-- Shiro 与 Spring 整合 --> <bean id="shirofilter" class="org.apache.shiro.spring.web.shirofilterfactorybean"> <!-- 关联 SecurityManager --> <property name="securitymanager" ref="securitymanager"/>

35 <!-- 使用 Shiro 的内置过滤器拦截资源 --> <property name="filterchaindefinitions"> <value> /product/tolist=anon /**=authc </value> </property> </bean> <!-- 修改 shiro 的默认登录请求 --> <property name="loginurl" value="/tologin"/> 3.4. 编写 Shiro 的认证操作 登录页面 <h3> 用户登录 </h3> <font color="red">${msg</font> <form method="post" action="${pagecontext.request.contextpath/user/login"> 用户名 :<input type="text" name="name"/><br/> 密码 :<input type="password" name="password"/><br/> <input type="submit" value=" 登录 "> </form> 编写 Controller package cn.sm1234.controller; import javax.servlet.http.httpservletrequest;

36 import org.apache.shiro.securityutils; import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authc.incorrectcredentialsexception; 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.requestmapping; public class UserController { /** * 登录 public String login(user user,httpservletrequest request,model model){ // 使用 Shiro 的认证操作 //1. 获取 Subject 对象 Subject subject = SecurityUtils.getSubject(); //2. 封装用户信息 AuthenticationToken token = new UsernamePasswordToken(user.getName(),

37 user.getpassword()); //3. 执行认证 try { subject.login(token); String username = (String)subject.getPrincipal(); request.getsession().setattribute("username", username); // 登录成功 return "redirect:/index"; catch (UnknownAccountException e) { model.addattribute("msg", " 用户不存在 "); catch (IncorrectCredentialsException e) { model.addattribute("msg", " 密码输入有误 "); return "login"; 编写 Realm protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { // 1. 获取用户输入的账户信息 UsernamePasswordToken token = (UsernamePasswordToken) arg0;

38 // 模拟数据库的密码 String name = "jack"; String password = "1234"; if (!token.getusername().equals(name)) { // 用户不存在 return null; // 返回密码 return new SimpleAuthenticationInfo(name, password, protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { // 1. 获取用户输入的账户信息 UsernamePasswordToken token = (UsernamePasswordToken) arg0; // 模拟数据库的密码 String name = "jack"; String password = "1234"; if (!token.getusername().equals(name)) { // 用户不存在 return null; // 返回密码

39 return new SimpleAuthenticationInfo(name, password, ""); 注意 : 必须放行登录请求 : <!-- 使用 Shiro 的内置过滤器拦截资源 --> <property name="filterchaindefinitions"> <value> /product/tolist=anon /user/login=anon /**=authc </value> </property> 3.5. 编写 Shiro 的授权操作 使用 Shiro 授权过滤器拦截资源 <!-- Shiro 与 Spring 整合 --> <bean id="shirofilter" class="org.apache.shiro.spring.web.shirofilterfactorybean"> <!-- 关联 SecurityManager --> <property name="securitymanager" ref="securitymanager"/> <!-- 使用 Shiro 的内置过滤器拦截资源 --> <property name="filterchaindefinitions"> <value> /product/tolist=anon /user/login=anon /product/toadd=perms[product:add] /**=authc </value>

40 </property> </bean> <!-- 修改 shiro 的默认登录请求 --> <property name="loginurl" value="/tologin"/> 配置未授权提示页面 <!-- Shiro 与 Spring 整合 --> <bean id="shirofilter" class="org.apache.shiro.spring.web.shirofilterfactorybean"> <!-- 关联 SecurityManager --> <property name="securitymanager" ref="securitymanager"/> <!-- 使用 Shiro 的内置过滤器拦截资源 --> <property name="filterchaindefinitions"> <value> /product/tolist=anon /user/login=anon /product/toadd=perms[product:add] /**=authc </value> </property> <!-- 修改 shiro 的默认登录请求 --> <property name="loginurl" value="/tologin"/> <!-- 添加未授权提示页面 --> <property name="unauthorizedurl" value="/unauth"/> </bean>

41 编写 Realm protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); // 基于资源的授权 info.addstringpermission("product:add"); return info; 3.6. 整合 MyBatis 导入相关 jar 包 <!-- mybatis 的坐标 --> <dependency> <groupid>org.mybatis</groupid> <artifactid>mybatis</artifactid> <version>3.4.4</version> </dependency> <!-- mybatis 与 spring 整合 --> <dependency> <groupid>org.mybatis</groupid> <artifactid>mybatis-spring</artifactid> <version>1.3.0</version> </dependency> <!-- 连接池 --> <dependency>

42 <groupid>com.alibaba</groupid> <artifactid>druid</artifactid> <version>1.1.7</version> </dependency> <!-- mysql 驱动程序 --> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>5.1.41</version> </dependency> <!-- Spring 持久层支持 --> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-jdbc</artifactid> <version>4.3.3.release</version> </dependency> jdbc.properties jdbc.url = jdbc:mysql://localhost:3306/shiro jdbc.driverclassname = com.mysql.jdbc.driver jdbc.user = root jdbc.password = root 编写 applicationcontext.xml 配置 <?xml version="1.0" encoding="utf-8"?>

43 <beans xmlns=" xmlns:p=" xmlns:context=" xmlns:tx=" xmlns:xsi=" xsi:schemalocation=" <!-- 加载 applicationcontext-shiro.xml --> <import resource="classpath:applicationcontext-shiro.xml"/> <!-- 加载 mybatis 与 Spring 相关配置 --> <!-- 加载 jdbc.properties 配置 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 创建数据源 --> <bean id="datasource" class="com.alibaba.druid.pool.druiddatasource"> <property name="url" value="${jdbc.url"/> <property name="driverclassname" value="${jdbc.driverclassname"/> <property name="username" value="${jdbc.user"/> <property name="password" value="${jdbc.password"/> <property name="maxactive" value="10"/> </bean>

44 <!-- mybatis 与 spring 整合 --> <bean id="sqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean"> <property name="datasource" ref="datasource"/> <!-- mybatis 别名包扫描 --> <property name="typealiasespackage" value="cn.sm1234.domain"/> </bean> <!-- mybatis 的 Mapper 接口的扫描 --> <bean class="org.mybatis.spring.mapper.mapperscannerconfigurer"> <property name="basepackage" value="cn.sm1234.dao"/> </bean> <!-- 开启 jdbc 事务 --> <bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> </bean> <!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionmanager"/> </beans> <context:component-scan base-package="cn.sm1234"/> 编写 Mapper 接口 package cn.sm1234.dao; import cn.sm1234.domain.user;

45 public interface UserMapper { public User findbyname(string name); 编写 Mapper 映射文件 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//dtd Mapper 3.0//EN" " <mapper namespace="cn.sm1234.dao.usermapper"> <select id="findbyname" parametertype="string" resulttype="user"> select id, name, password from shiro.t_user where name = #{value </select> </mapper> 编写测试类 package cn.sm1234.test;

46 import javax.annotation.resource; import org.junit.test; import org.junit.runner.runwith; import org.springframework.test.context.contextconfiguration; import org.springframework.test.context.junit4.springjunit4classrunner; import cn.sm1234.dao.usermapper; public class UserMapperTest private UserMapper public void testfindbyname(){ User user = usermapper.findbyname("eric"); System.out.println(user);

47 3.7. 编写动态认证和授权代码 动态认证代码 Mapper 接口 public interface UserMapper { public User findbyname(string name); Service 接口和实现 接口 : package cn.sm1234.service; import cn.sm1234.domain.user; public interface UserService { public User findbyname(string name); 实现 : package cn.sm1234.service.impl; import javax.annotation.resource; import org.springframework.stereotype.service;

48 import org.springframework.transaction.annotation.transactional; import cn.sm1234.dao.usermapper; import cn.sm1234.domain.user; public class UserServiceImpl implements UserService private UserMapper public User findbyname(string name) { return usermapper.findbyname(name); MyReal // protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { // 1. 获取用户输入的账户信息

49 UsernamePasswordToken token = (UsernamePasswordToken) arg0; /* // 模拟数据库的密码 String name = "jack"; String password = "1234"; if (!token.getusername().equals(name)) { // 用户不存在 return null; */ // 实现动态认证 User dbuser = userservice.findbyname(token.getusername()); if(dbuser==null){ // 用户不存在 return null; // 返回密码 return new SimpleAuthenticationInfo(dbUser, dbuser.getpassword(), ""); 动态授权代码 模拟查询用户拥有的权限码 SQL 语句 : -- 查询某个用户目前拥有的权限 SELECT p.permission FROM t_user u

50 INNER JOIN t_user_role ur ON u.id = ur.user_id INNER JOIN t_role_permission rp ON ur.role_id = rp.role_id INNER JOIN t_permission p ON rp.permission_id = p.id WHERE u.id = 2; UserMapper 接口 package cn.sm1234.dao; import java.util.list; import cn.sm1234.domain.user; public interface UserMapper { /** * 根据用户名查询用户 name */ public User findbyname(string name); /** * 根据用户 ID 查询用户拥有的资源授权码 */ public List<String> findpermissionbyuserid(integer userid);

51 Mapper 映射文件 <select id="findpermissionbyuserid" parametertype="int" resulttype="string"> SELECT p.permission FROM t_user u INNER JOIN t_user_role ur ON u.id = ur.user_id INNER JOIN t_role_permission rp ON ur.role_id = rp.role_id INNER JOIN t_permission p ON rp.permission_id = p.id WHERE u.id = #{value; </select> Service 接口和实现 接口 : public List<String> findpermissionbyuserid(integer userid); 实现 public List<String> findpermissionbyuserid(integer userid) { return usermapper.findpermissionbyuserid(userid); MyRealm // protected AuthorizationInfo dogetauthorizationinfo(principalcollection arg0) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

52 /*// 基于资源的授权 info.addstringpermission("product:add"); // 基于角色的授权 info.addrole("admin");*/ // 给当前登录用户进行动态授权 //1. 获取当前用户的 pricipal Subject subject = SecurityUtils.getSubject(); User dbuser = (User)subject.getPrincipal(); //2. 查询当前用户拥有的资源授权码 List<String> perms = userservice.findpermissionbyuserid(dbuser.getid()); if(perms!=null){ // 遍历授权 for (String perm : perms) { if(!stringutils.isempty(perm)){ info.addstringpermission(perm); return info; 注意此时的 shiro 过滤器配置 : <!-- 使用 Shiro 的内置过滤器拦截资源 --> <property name="filterchaindefinitions">

53 <value> /user/login=anon /product/tolist=perms[product:list] /product/toadd=perms[product:add] /product/toupdate=perms[product:update] /**=authc </value> </property> 3.8. 使用 Shiro 的 JSP 权限标签 在 JSP 页面导入 shiro 标签库 taglib uri=" prefix="shiro"%> 使用 Shiro 权限标签 <shiro:haspermission name="product:add"> <a href="${pagecontext.request.contextpath/product/toadd"> 商品添加 </a><br/> </shiro:haspermission> <shiro:haspermission name="product:update"> <a href="${pagecontext.request.contextpath/product/toupdate"> 商品修改 </a><br/> </shiro:haspermission> <shiro:haspermission name="product:list"> <a href="${pagecontext.request.contextpath/product/tolist"> 商品列表 </a><br/> </shiro:haspermission>

54 4. Spring Boot 整合 Shiro( 整合 SSM) 4.1. 搭建 Spring Boot 项目环境 建立 maven 项目, 导入坐标 <project xmlns=" xmlns:xsi=" xsi:schemalocation=" <modelversion>4.0.0</modelversion> <!-- Spring Boot 父工程 --> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>1.5.4.release</version> </parent> <groupid>cn.sm1234</groupid> <artifactid>shiro-springboot</artifactid> <version>0.0.1-snapshot</version>

55 <dependencies> <!-- web 支持,SpringMVC, Servlet 支持等 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <!-- 导入 thymeleaf 支持 --> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-thymeleaf</artifactid> </dependency> </dependencies> <!-- 属性 --> <properties> <!-- JDK 编译版本 --> <java.version>1.8</java.version> <!-- 把 thymeleaf 升级为 3.0 以上 --> <thymeleaf.version>3.0.2.release</thymeleaf.version> <thymeleaf-layout-dialect.version>2.0.4</thymeleaf-layout-dialect.version> </properties> </project> 编写 Controller package cn.sm1234.controller; import org.springframework.stereotype.controller;

56 import org.springframework.web.bind.annotation.requestmapping; /** * 主控制器 lenovo public class MainController public String index(){ return public String tologin(){ return public String unauth(){ return "unauth"; package cn.sm1234.controller;

57 import org.springframework.stereotype.controller; public class ProductController public String toadd(){ return public String tolist(){ return public String toupdate(){ return "product/update";

58 编写 html 页面 4.2. Shiro 整合 导入 shiro 整合坐标 <dependency> <groupid>org.apache.shiro</groupid> <artifactid>shiro-spring</artifactid> <version>1.4.0</version> </dependency> 编写 Shiro 配置类 package cn.sm1234.shiro; import org.apache.shiro.spring.web.shirofilterfactorybean; import org.apache.shiro.web.mgt.defaultwebsecuritymanager; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration;

59 /** * Shiro 的配置类 lenovo * public class ShiroConfig { /** * 1. 创建 ShiroFilterFactoryBean public ShiroFilterFactoryBean shirofilterfactorybean(defaultwebsecuritymanager securitymanager){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); // 关联 SecurityManager bean.setsecuritymanager(securitymanager); return bean; /** * 2. 创建 SecurityManager public DefaultWebSecurityManager defaultwebsecuritymanager(myrealm realm){ DefaultWebSecurityManager manager = new DefaultWebSecurityManager();

60 // 关联 realm manager.setrealm(realm); return manager; /** * 3. 创建 Realm public MyRealm myreal(){ MyRealm realm = new MyRealm(); return realm; 4.3. 配置 Shiro 认证过滤器实现资源拦截 /** * 1. 创建 ShiroFilterFactoryBean public ShiroFilterFactoryBean shirofilterfactorybean(defaultwebsecuritymanager securitymanager){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); // 关联 SecurityManager

61 bean.setsecuritymanager(securitymanager); Map<String,String> filtermap = new LinkedHashMap<>(); // 认证过滤器 filtermap.put("/product/toadd", "anon"); filtermap.put("/**", "authc"); // 添加 shiro 过滤器 bean.setfilterchaindefinitionmap(filtermap); // 修改登录请求 bean.setloginurl("/tologin"); return bean; 4.4. 编写 Shiro 的认证操作 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> 登录页面 </title> </head> <body> <h3> 用户登录 </h3> <font color="red"></font> <form method="post" action="/user/login"> 用户名 :<input type="text" name="name"/><br/>

62 密码 :<input type="password" name="password"/><br/> <input type="submit" value=" 登录 "> </form> </body> </html> 编写 UserController package cn.sm1234.controller; import javax.servlet.http.httpservletrequest; import org.apache.shiro.securityutils; import org.apache.shiro.authc.authenticationtoken; import org.apache.shiro.authc.incorrectcredentialsexception; 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.requestmapping; public class UserController { /** * 登录

63 public String login(user user,httpservletrequest request,model model){ // 使用 shiro 进行登录 Subject subject = SecurityUtils.getSubject(); AuthenticationToken token = new UsernamePasswordToken(user.getName(), user.getpassword()); try { subject.login(token); // 登录成功 User dbuser = (User)subject.getPrincipal(); request.getsession().setattribute("username", dbuser.getname()); return "redirect:/index"; catch (UnknownAccountException e) { model.addattribute("msg", " 用户名不存在 "); return "login"; catch (IncorrectCredentialsException e) { model.addattribute("msg", " 密码 "); return "login";

64 编写 MyReal 的代码 // protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { // 1. 获取用户输入的账户信息 UsernamePasswordToken token = (UsernamePasswordToken) arg0; // 模拟数据库的密码 String name = "jack"; String password = "1234"; if (!token.getusername().equals(name)) { // 用户不存在 return null; User dbuser = new User(); dbuser.setname(name); dbuser.setpassword(password); // 返回密码 return new SimpleAuthenticationInfo(dbUser, dbuser.getpassword(), ""); 登录页面提示 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

65 " <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> 登录页面 </title> </head> <body> <h3> 用户登录 </h3> <font color="red" th:text="${msg"></font> <form method="post" action="/user/login"> 用户名 :<input type="text" name="name"/><br/> 密码 :<input type="password" name="password"/><br/> <input type="submit" value=" 登录 "> </form> </body> </html> 4.5. 编写 shiro 的授权操作 /** * 1. 创建 ShiroFilterFactoryBean public ShiroFilterFactoryBean shirofilterfactorybean(defaultwebsecuritymanager securitymanager){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); // 关联 SecurityManager bean.setsecuritymanager(securitymanager);

66 Map<String,String> filtermap = new LinkedHashMap<>(); // 认证过滤器 filtermap.put("/product/toadd", "anon"); // 放行登录页面 filtermap.put("/user/login", "anon"); // 授权过滤器 filtermap.put("/product/toadd", "perms[product:add]"); filtermap.put("/product/toupdate", "perms[product:update]"); filtermap.put("/**", "authc"); // 添加 shiro 过滤器 bean.setfilterchaindefinitionmap(filtermap); // 修改登录请求 bean.setloginurl("/tologin"); // 添加未授权提示页面 bean.setunauthorizedurl("/unauth"); return protected AuthorizationInfo dogetauthorizationinfo(principalcollection principals) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addstringpermission("product:add");

67 return info; 4.6. 整合 MyBatis 导入 mybatis 相关坐标 <!-- SpringBoot 的 Mybatis 启动器 --> <dependency> <groupid>org.mybatis.spring.boot</groupid> <artifactid>mybatis-spring-boot-starter</artifactid> <version>1.1.1</version> </dependency> <!-- druid 连接池 --> <dependency> <groupid>com.alibaba</groupid> <artifactid>druid</artifactid> <version>1.0.9</version> </dependency> <!-- mysql --> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> </dependency> 配置 application.properties spring.datasource.url=jdbc:mysql://localhost:3306/shiro

68 spring.datasource.driverclassname=com.mysql.jdbc.driver spring.datasource.username=root spring.datasource.password=root spring.datasource.type=com.alibaba.druid.pool.druiddatasource mybatis.type-aliases-package=cn.sm1234.domain 编写 Mapper 接口和映射 Mapper 接口 package cn.sm1234.dao; import cn.sm1234.domain.user; public interface UserMapper { public User findbyname(string name); Mapper 映射 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//dtd Mapper 3.0//EN" " <mapper namespace="cn.sm1234.dao.usermapper"> <select id="findbyname" parametertype="string" resulttype="user">

69 SELECT id, NAME, PASSWORD FROM shiro.t_user where name = #{value </select> </mapper> 修改 public class ShiroApplication { public static void main(string[] args) { SpringApplication.run(ShiroApplication.class, args); 测试环境 package cn.sm1234.test; import javax.annotation.resource; import org.junit.test; import org.junit.runner.runwith;

70 import org.springframework.boot.test.context.springboottest; import org.springframework.test.context.junit4.springjunit4classrunner; import cn.sm1234.shiroapplication; import cn.sm1234.dao.usermapper; public class UserMapperTest private UserMapper public void testfindbyname(){ User user = usermapper.findbyname("eric"); System.out.println(user); 4.7. 改造为动态认证和授权 public class MyRealm extends AuthorizingRealm private UserService

71 protected AuthorizationInfo dogetauthorizationinfo(principalcollection principals) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //info.addstringpermission("product:add"); // 得到当前用户 Subject subject = SecurityUtils.getSubject(); User dbuser = (User)subject.getPrincipal(); List<String> perms = userservice.findpermissionbyuserid(dbuser.getid()); if(perms!=null){ for (String perm : perms) { if(!stringutils.isempty(perm)){ info.addstringpermission(perm); return info; // protected AuthenticationInfo dogetauthenticationinfo(authenticationtoken arg0) throws AuthenticationException { // 1. 获取用户输入的账户信息 UsernamePasswordToken token = (UsernamePasswordToken) arg0;

72 /*// 模拟数据库的密码 String name = "jack"; String password = "1234"; if (!token.getusername().equals(name)) { // 用户不存在 return null; User dbuser = new User(); dbuser.setname(name); dbuser.setpassword(password);*/ User dbuser = userservice.findbyname(token.getusername()); if(dbuser==null){ // 用户不存在 return null; // 返回密码 return new SimpleAuthenticationInfo(dbUser, dbuser.getpassword(), ""); 4.8. Thymeleaf 整合 Shiro 权限标签 导入整合坐标 <!-- thymeleaf 整合 shiro 标签 -->

73 <dependency> <groupid>com.github.theborakompanioni</groupid> <artifactid>thymeleaf-extras-shiro</artifactid> <version>2.0.0</version> </dependency> 配置 ShiroConfig 在类中添加一个方法 : /** * 整合 Shiro 标签 public ShiroDialect shirodialect(){ return new ShiroDialect(); 在 html 页面使用 shiro 标签 <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> 商品管理系统后台主页 </title> </head> <body> <h3> 商品管理系统后台主页 </h3>

74 当前用户名 :<span th:text="${session.username"></span> <hr/> <span shiro:haspermission="product:add"> <a href="/product/toadd"> 商品添加 </a><br/> </span> <span shiro:haspermission="product:update"> <a href="/product/toupdate"> 商品修改 </a><br/> </span> <span shiro:haspermission="product:list"> <a href="/product/tolist"> 商品列表 </a><br/> </span> </body> </html> 4.9. Shiro 注销功能 idnex.hmtl <a href="/user/logout"> 注销 </a> 编写 UserController /** * 注销方法

75 public String logout(){ Subject subject = SecurityUtils.getSubject(); subject.logout(); //shiro 底层删除 session 的会话信息 return "redirect:/tologin"; 实现 RememberMe 功能 配置 ShiroConfig 类 /** * Shiro 的配置类 lenovo * public class ShiroConfig { /** * 1. 创建 ShiroFilterFactoryBean public ShiroFilterFactoryBean shirofilterfactorybean(defaultwebsecuritymanager securitymanager){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); // 关联 SecurityManager bean.setsecuritymanager(securitymanager); Map<String,String> filtermap = new LinkedHashMap<>();

76 // 认证过滤器 filtermap.put("/product/toadd", "perms[product:add]"); // 放行登录页面 filtermap.put("/user/login", "anon"); // 授权过滤器 filtermap.put("/product/tolist", "perms[product:list]"); filtermap.put("/product/toupdate", "perms[product:update]"); // 添加 user 过滤器 filtermap.put("/index", "user"); // /index 的请求只要使用 rememberme 功能, 就可 以访问了 filtermap.put("/**", "authc"); // 添加 shiro 过滤器 bean.setfilterchaindefinitionmap(filtermap); // 修改登录请求 bean.setloginurl("/tologin"); // 添加未授权提示页面 bean.setunauthorizedurl("/unauth"); return bean; /** * 2. 创建 SecurityManager public DefaultWebSecurityManager defaultwebsecuritymanager(myrealm realm,cookieremembermemanager remembermemanager){

77 DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); // 关联 realm manager.setrealm(realm); // 关联 remembermemanager manager.setremembermemanager(remembermemanager); return manager; // 创建 public CookieRememberMeManager cookieremembermemanager(simplecookie cookie){ CookieRememberMeManager manager = new CookieRememberMeManager(); manager.setcookie(cookie); return manager; /** * RememberMe 的功能 */ // 创建 public SimpleCookie simplecookie(){ SimpleCookie cookie = new SimpleCookie("rememberMe"); // 设置 cookie 的时间长度 cookie.setmaxage(120); // 设置只读模型

78 cookie.sethttponly(true); return cookie; /** * 3. 创建 Realm public MyRealm myreal(){ MyRealm realm = new MyRealm(); return realm; /** * 整合 Shiro 标签 public ShiroDialect shirodialect(){ return new ShiroDialect(); 修改 login.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " <html> <head>

79 <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title> 登录页面 </title> </head> <body> <h3> 用户登录 </h3> <font color="red" th:text="${msg"></font> <form method="post" action="/user/login"> 用户名 :<input type="text" name="name"/><br/> 密码 :<input type="password" name="password"/><br/> 是否记住我 :<input type="checkbox" name="rememberme" value="1"/><br/> <input type="submit" value=" 登录 "> </form> </body> </html> 修改 UserController /** * 登录 public String login(user user,string rememberme,httpservletrequest request,model model){ // 使用 shiro 进行登录 Subject subject = SecurityUtils.getSubject(); //AuthenticationToken token = new UsernamePasswordToken(user.getName(), user.getpassword());

80 UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), user.getpassword()); // 设置 remenmberme 的功能 if(rememberme!=null && rememberme.equals("1")){ token.setrememberme(true); try { subject.login(token); // 登录成功 User dbuser = (User)subject.getPrincipal(); dbuser.getname()); request.getsession().setattribute("username", return "redirect:/index"; catch (UnknownAccountException e) { model.addattribute("msg", " 用户名不存在 "); return "login"; catch (IncorrectCredentialsException e) { model.addattribute("msg", " 密码错误 "); return "login"; 自定义 Filter 找回 Session 信息 package cn.sm1234.filter;

81 import javax.servlet.servletrequest; import javax.servlet.servletresponse; import org.apache.shiro.session.session; import org.apache.shiro.subject.subject; import org.apache.shiro.web.filter.authc.formauthenticationfilter; import cn.sm1234.domain.user; /** * 自定义认证过滤器, 加入 RememberMe 的功能 lenovo * */ public class UserFormAuthenticationFilter extends FormAuthenticationFilter protected boolean isaccessallowed(servletrequest request, ServletResponse response, Object mappedvalue) { Subject subject = getsubject(request, response); // 如果 isauthenticated 为 false 证明不是登录过的, 同时 isrememberd 为 true // 证明是没登陆直接通过记住我功能进来的 if (!subject.isauthenticated() && subject.isremembered()) { // 获取 session 看看是不是空的 Session session = subject.getsession(true); // 查看 session 属性当前是否是空的 if (session.getattribute("username") == null) {

82 // 如果是空的才初始化 User dbuser = (User)subject.getPrincipal(); // 存入用户数据 session.setattribute("username", dbuser.getname()); // 这个方法本来只返回 subject.isauthenticated() 现在我们加上 subject.isremembered() // 让它同时也兼容 remember 这种情况 return subject.isauthenticated() subject.isremembered(); 使用 Shiro 的加密算法改造登录 /** * 登录 public String login(user user,string rememberme,httpservletrequest request,model model){ // 使用 shiro 进行登录 Subject subject = SecurityUtils.getSubject(); //AuthenticationToken token = new UsernamePasswordToken(user.getName(), user.getpassword());

83 // 使用 Shiro 对密码进行加密 Md5Hash hash = new Md5Hash(user.getPassword(), user.getname(), 2); UsernamePasswordToken token = new UsernamePasswordToken(user.getName(), hash.tostring()); // 设置 remenmberme 的功能 if(rememberme!=null && rememberme.equals("1")){ token.setrememberme(true); try { subject.login(token); // 登录成功 User dbuser = (User)subject.getPrincipal(); request.getsession().setattribute("username", dbuser.getname()); return "redirect:/index"; catch (UnknownAccountException e) { model.addattribute("msg", " 用户名不存在 "); return "login"; catch (IncorrectCredentialsException e) { model.addattribute("msg", " 密码错误 "); return "login";

84 4.13. Kaptcha 验证码 导入 Kaptcha 坐标 <!-- 验证码 --> <dependency> <groupid>com.github.penggle</groupid> <artifactid>kaptcha</artifactid> <version>2.3.2</version> </dependency> 编写 Kaptcha 配置类 package cn.sm1234.shiro; import java.util.properties; import org.springframework.context.annotation.bean; import org.springframework.stereotype.component; import com.google.code.kaptcha.impl.defaultkaptcha; import public class KaptcharConfig public DefaultKaptcha getdefaultkaptcha() { com.google.code.kaptcha.impl.defaultkaptcha defaultkaptcha = new com.google.code.kaptcha.impl.defaultkaptcha();

85 Properties properties = new Properties(); properties.setproperty("kaptcha.border", "yes"); properties.setproperty("kaptcha.border.color", "105,179,90"); properties.setproperty("kaptcha.textproducer.font.color", "blue"); properties.setproperty("kaptcha.image.width", "110"); properties.setproperty("kaptcha.image.height", "40"); properties.setproperty("kaptcha.textproducer.font.size", "30"); properties.setproperty("kaptcha.session.key", "code"); properties.setproperty("kaptcha.textproducer.char.length", "4"); properties.setproperty("kaptcha.textproducer.font.names", " 宋体, 楷体, 微软雅黑 "); Config config = new Config(properties); defaultkaptcha.setconfig(config); return defaultkaptcha; KaptchaController package cn.sm1234.controller; import java.awt.image.bufferedimage; import java.io.bytearrayoutputstream; import javax.annotation.resource; import javax.imageio.imageio; import javax.servlet.servletoutputstream; import javax.servlet.http.httpservletrequest;

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

将 MD5 的工具类拷贝到项目中 二 微服务模块的搭建 我们将权限的查询放到一个单独的模块中, 这个模块提供接口供给消费者远程调用 (RPC), 这次范例是微服开发的雏形, 在以后你使用 springcloud 的时候会使用到今天的概念 1 使用 maven 创建新的模块 (microboot-sh

将 MD5 的工具类拷贝到项目中 二 微服务模块的搭建 我们将权限的查询放到一个单独的模块中, 这个模块提供接口供给消费者远程调用 (RPC), 这次范例是微服开发的雏形, 在以后你使用 springcloud 的时候会使用到今天的概念 1 使用 maven 创建新的模块 (microboot-sh Shiro 的环境搭建 一 公共模块的搭建 在实际的开发中, 一个项目可能会分多个模块进行实际的开发, 但是这些模块需要使用一些公 共的操作, 那么这些公共的操作不应该在每个模块中重新定义, 而是将这些公共的操作专门定 义在一个公共的模块之后哦在模块中的 pom 文件里面引入这个公共的模块, 比如说 vo 类就是 一个公共的模块, 所以定义到公共类中 1. 定义公共模块 (microboot-shiro-api)maven

More information

1.2. Sql 映射配置 小风 Java 实战系列教程 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//dtd Mapper 3.0//EN" "

1.2. Sql 映射配置 小风 Java 实战系列教程 <?xml version=1.0 encoding=utf-8?> <!DOCTYPE mapper PUBLIC -//mybatis.org//dtd Mapper 3.0//EN 本章学习目标 小风 Java 实战系列教程 CRM 开发环境搭建 客户列表展示 客户分页显示 客户添加 客户信息修改回显 客户信息更新保存 客户信息删除 1. 客户列表展示 1.1. Mapper 接口 package cn.sm1234.dao; import java.util.list; import cn.sm1234.domain.customer; public interface CustomerMapper

More information

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat 本章学习目标 小风 Java 实战系列教程 AOP 思想概述 AOP 底层技术实现 AOP 术语介绍 SpringAOP 的 XML 方式 HelloWorld SpringAOP 的 XML 方式配置细节 SpringAOP 的注解方式 SpringAOP 的零配置方式 1. AOP 思想概述 1.1. AOP 思想简介 1.2. AOP 的作用 2. AOP 底层技术实现 小风 Java 实战系列教程

More information

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

More information

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) 09 (File Processes) 9-1 9-2 (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) Java Servlet 9-1 Servlet (File Processes) Client Servlet Servlet Java Java (Stream)

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

Untitled

Untitled Spring 4.0.0 spring-framework-reference QQ 413615763 Weibo le Email not-three@foxmail.com 2013.12.16 2.2 2013.12.17 2.3 : 2013.12.18 2.3 : 2013.12.18 2.3 :- Commons Logging Spring Spring Spring IoC StrutsHibernate

More information

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ 第 四 章 Filter( 过 滤 器 ) 样 题 A 卷 一 选 择 题 ( 每 小 题 2 分, 共 20 分 ) 1 下 面 选 项 中, 用 于 实 现 初 始 化 过 滤 器 的 方 法 是 ( ) A init(filterconfig filterconfig) B dofilter(servletrequest req,servletresponse resp,filterchain

More information

untitled

untitled PowerBuilder Tips 利 PB11 Web Service 年度 2 PB Tips PB9 EAServer 5 web service PB9 EAServer 5 了 便 web service 來說 PB9 web service 力 9 PB11 release PB11 web service 力更 令.NET web service PB NVO 論 不 PB 來說 說

More information

Microsoft Word - 扉页.doc

Microsoft Word - 扉页.doc 第 5 章 chapter 5 数据验证 学习目的与要求本章重点讲解 Spring MVC 框架的输入验证体系 通过本章的学习, 理解输入验证的流程, 能够利用 Spring 的自带验证框架和 JSR 303(Java 验证规范 ) 对数据进行验证 本章主要内容 数据验证概述 Spring 验证 JSR 303 验证所有用户的输入一般都是随意的, 为了保证数据的合法性, 数据验证是所有 Web 应用必须处理的问题

More information

第03章 控制反转(Spring IoC)

第03章  控制反转(Spring IoC) 3 Spring IoC GoF Design Patterns: Elements of Reusable Object-Oriented Software Programming to an Interface not an Implementation Java Java Java GoF Service Locator IoC IoC Spring IoC 3.1 IoC IoC IoC Dependency

More information

<!-- import outer proper

<!-- import outer proper 概述 基于 Spring 支持的客户端编程, 包括发送方客户端 接收方客户端 发送方客户端代码 :jms-producer 接收方客户端代码 :jms-consumer 发送方客户端 这里基于 demo 进行说明 这个 demo 将往 example.queue 和 example.topic 各发一条信息 文件目录结构 1. src/main/resources/ 2. ---- jndi.properties

More information

基于CDIO一体化理念的课程教学大纲设计

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

More information

IoC容器和Dependency Injection模式.doc

IoC容器和Dependency Injection模式.doc IoC Dependency Injection /Martin Fowler / Java Inversion of Control IoC Dependency Injection Service Locator Java J2EE open source J2EE J2EE web PicoContainer Spring Java Java OO.NET service component

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

Servlet

Servlet Servlet Allen Long Email: allen@huihoo.com http://www.huihoo.com 2004-04 Huihoo - Enterprise Open Source http://www.huihoo.com 1 Huihoo - Enterprise Open Source http://www.huihoo.com 2 GET POST Huihoo

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-065Big5 Title : Sun Certified Programmer for the Java 2 Platform, SE 6.0 Version : Demo 1 / 14 1. 35. String #name = "Jane Doe"; 36. int

More information

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问 内置对象的取得和多人开发 一 内置对象的取得 在使用的 servlet 的时候可以通过 HttpServletResquest 获取到一些内置对象, 但是在 struts2 中为了方便取得内置对象, 专门提供了一个 ServletActionContext 这个类取得取得内置对象, 观察如下方法 public static javax.servlet.jsp.pagecontext() 取得 pagecontext

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY

More information

Stateless Session Beans(无状态bean)的学习

Stateless Session Beans(无状态bean)的学习 一 Stateless Session Beans( 无状态 bean) 的学习 第一步 : 要定义一个会话 Bean, 首先需要定义一个包含他所有业务方法的接口 这个接口不需要任何注释, 就像普通的 java 接口那样定义 调用 EJB 的客户端通过使用这个接口引用从 EJB 容器得到的会话 Bean 对象 stub 接口的定义如下: HelloWorld.java package com.foshanshop.ejb3;

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

FileMaker 16 ODBC 和 JDBC 指南

FileMaker 16 ODBC 和 JDBC 指南 FileMaker 16 ODBC JDBC 2004-2017 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. FileMaker WebDirect FileMaker Cloud FileMaker,

More information

使用 XFire 与 Spring 开发 Web Service 2 实现功能与特点 基于 J2EE 平台的 Web Service 服务 开发方便, 配置简单 设计接口 实现服务 配置暴露接口 XFire 将自动生成对应的 wsdl 支持高级详细配置 与 Spring 无缝集成 运行环境 JDK

使用 XFire 与 Spring 开发 Web Service 2 实现功能与特点 基于 J2EE 平台的 Web Service 服务 开发方便, 配置简单 设计接口 实现服务 配置暴露接口 XFire 将自动生成对应的 wsdl 支持高级详细配置 与 Spring 无缝集成 运行环境 JDK 使用 XFire 与 Spring 开发 Web Service 1 使用 XFire 与 Spring 开发 Web Service 王啸宇信易诚 wangxiao1@mail.yuchengtech.com 目录 实现功能与特点... 2 运行环境... 2 开发平台... 2 实施步骤... 2 概述... 2 新建 Java Project... 3 新建 WTP 动态 WEB 工程...

More information

untitled

untitled 4.1AOP AOP Aspect-oriented programming AOP 來說 AOP 令 理 Cross-cutting concerns Aspect Weave 理 Spring AOP 來 AOP 念 4.1.1 理 AOP AOP 見 例 來 例 錄 Logging 錄 便 來 例 行 留 錄 import java.util.logging.*; public class HelloSpeaker

More information

输入 project name 选择完成

输入 project name 选择完成 JAVA 程序访问 HighGo DB 的环境准备 山东瀚高科技有限公司版权所有仅允许不作任何修改的转载和转发 Hibernate 的配置 MyEclipse 中创建新项目 : 选择菜单栏 file---new---project 选择 web project 进行下一步 输入 project name 选择完成 4. 单击 " 添加 JAR/ 文件夹 ", 会如下图出现 JDBC 下载 Hibernate

More information

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型 文 章 编 号 :1007-757X(2012)1-0036-04 领 域 驱 动 模 型 的 WEB 软 件 系 统 设 计 研 究 摘 要 : J2EE 3 JDK1.7 Tomcat WEB 关 键 词 : 中 图 分 类 号 :TP311 文 献 标 志 码 :A 0 引 言 Web 软 件 系 统 的 分 层 结 构 典 型 的 J2EE 软 件 系 统 开 发 方 法 分 为 三 层 结

More information

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject("exception", writer.tostring()); mv.setviewname("error"); return

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject(exception, writer.tostring()); mv.setviewname(error); return 本章学习目标 小风 Java 实战系列教程 SpringMVC 异常处理 SpringMVC 文件上传 SpringMVC 处理 JSON 格式数据 SpringMVC 拦截器 SpringMVC 对 restful 风格的支持 1. SpringMVC 异常处理 1.1. @ExceptionHandler 注解处理异常 @ExceptionHandler 该注解使用在异常处理方法上面 1.1.1.

More information

new 进行创建对象, 是程序主动去创建依赖对象 ; 而 IoC 是有专门一个容器来创建这些对象, 即由 Ioc 容器来控制对象的创建 ; 谁控制谁? 当然是 IoC 容器控制了对象 ; 控制什么? 那就是主要控制了外部资源获取 ( 不只是对象包括比如文件等 ) 为何是反转, 哪些方面反转了 : 有

new 进行创建对象, 是程序主动去创建依赖对象 ; 而 IoC 是有专门一个容器来创建这些对象, 即由 Ioc 容器来控制对象的创建 ; 谁控制谁? 当然是 IoC 容器控制了对象 ; 控制什么? 那就是主要控制了外部资源获取 ( 不只是对象包括比如文件等 ) 为何是反转, 哪些方面反转了 : 有 本章学习目标 小风 Java 实战系列教程 Spring 框架简介 SpringIOC 的概念和作用 工厂模式设计一个简单的 IOC 容器 SpringIOC 的 XML 方式 HelloWorld SpringIOC 的 XML 方式创建对象配置细节 SpringIOC 的 XML 方式依赖注入 SpringIOC 的注解方式 Spring 整合 Junit 简化测试类编写 1. Spring 框架简介

More information

5-1 nav css 5-2

5-1 nav css 5-2 5 HTML CSS HTML CSS Ê Ê Ê Ê 5-1 nav css 5-2 5-1 5 5-1-1 5-01 css images 01 index.html 02 5-3 style.css css 03 CH5/5-01/images 04 images index.html style.css 05

More information

拦截器(Interceptor)的学习

拦截器(Interceptor)的学习 二 拦截器 (Interceptor) 的学习 拦截器可以监听程序的一个或所有方法 拦截器对方法调用流提供了细粒度控制 可以在无状态会话 bean 有状态会话 bean 和消息驱动 bean 上使用它们 拦截器可以是同一 bean 类中的方法或是一个外部类 下面介绍如何在 Session Bean 类中使用外部拦截器类 @Interceptors 注释指定一个或多个在外部类中定义的拦截器 下面拦截器

More information

北 风 网 讲 师 原 创 作 品 ---- 仅 供 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见

北 风 网 讲 师 原 创 作 品 ---- 仅 供  学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见 北 风 网 讲 师 原 创 作 品 ---- 仅 供 www.ibeifeng.com 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见 者 远 ; 顺 风 而 呼, 声 非 加 疾 也, 而 闻 者 彰 假 舆 马 者, 非 利 足 也,

More information

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

设计模式 Design Patterns

设计模式 Design Patterns Spring 与 Struts Hibernate 的集成 丁勇 Email:18442056@QQ.com 学习目标 掌握 Spring 与 Struts 的集成 掌握 Spring 与 Hibernate 的集成 学会使用 Spring 实现声明式事务 Spring 与 Hibernate 集成 使用 Spring 简化 Hibernate 编程 使现有使现有 Java Java EE EE 技术更易用

More information

Flume-ng与Mysql整合开发

Flume-ng与Mysql整合开发 Flume-ng 与 Mysql 整合开发 我们知道,Flume 可以和许多的系统进行整合, 包括了 Hadoop Spark Kafka Hbase 等等 ; 当然, 强悍的 Flume 也是可以和 Mysql 进行整合, 将分析好的日志存储到 Mysql( 当然, 你也可以存放到 pg oracle 等等关系型数据库 ) 不过我这里想多说一些 :Flume 是分布式收集日志的系统 ; 既然都分布式了,

More information

untitled

untitled How to using M-Power Report API M-Power Report API 力 了 M-Power Report -- Java (Library) M-Power Report API 行 Java M-Power Report M-Power Report API ( 30 ) PDF/HTML/CSV/XLS JPEG/PNG/SVG 料 料 OutputStream

More information

RUN_PC連載_10_.doc

RUN_PC連載_10_.doc PowerBuilder 8 (10) Jaguar CTS ASP Jaguar CTS PowerDynamo Jaguar CTS Microsoft ASP (Active Server Pages) ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar CTS ASP Jaguar Server ASP

More information

Microsoft PowerPoint - 02-Servlet-Basics-Chinese.ppt

Microsoft PowerPoint - 02-Servlet-Basics-Chinese.ppt 2004 Marty Hall servlet 基础 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

RunPC2_.doc

RunPC2_.doc PowerBuilder 8 (5) PowerBuilder Client/Server Jaguar Server Jaguar Server Connection Cache Thin Client Internet Connection Pooling EAServer Connection Cache Connection Cache Connection Cache Connection

More information

正文(新).indd

正文(新).indd 第 1 章 第一个 Spring Boot 项目 本章主要介绍学习 Spring Boot 之前的环境准备, 包括如何一分钟快速搭建 Spring Boot Spring Boot 文件目录的简单介绍以及 Maven Helper 插件的安装和使用等 1.1 Spring Boot 简单介绍 Spring Boot 是目前流行的微服务框架, 倡导 约定优先于配置, 其设计目的是用来简化新 Spring

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M ASP.NET MVC Visual Studio 2017 1 1-4 MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\MvcExamples firstmvc MVC 1-7 ASP.NET MVC 1-9 ASP.NET

More information

优迈科技教学大纲2009版本

优迈科技教学大纲2009版本 java 软 件 工 程 师 培 训 教 学 大 纲 1 JAVA 软 件 工 程 师 培 训 教 学 大 纲 深 圳 软 件 园 人 才 实 训 基 地 2009 年 3 月 目 录 java 软 件 工 程 师 培 训 教 学 大 纲 2 教 学 阶 段...3 第 一 章 JAVA 起 步...3 第 二 章 面 向 对 象 的 编 程...4 第 三 章 数 据 结 构 IO 线 程 网 络...5

More information

XXXXXXXX http://cdls.nstl.gov.cn 2 26

XXXXXXXX http://cdls.nstl.gov.cn 2 26 [ ] [ ] 2003-7-18 1 26 XXXXXXXX http://cdls.nstl.gov.cn 2 26 (2003-7-18) 1...5 1.1...5 1.2...5 1.3...5 2...6 2.1...6 2.2...6 2.3...6 3...7 3.1...7 3.1.1...7 3.1.2...7 3.1.2.1...7 3.1.2.1.1...8 3.1.2.1.2...10

More information

resp.getwriter().print(j + "*" + i + "=" + j * i+" "); resp.getwriter().print("<br/>"); protected void dopost(httpservletrequest req, HttpServletRespo

resp.getwriter().print(j + * + i + = + j * i+ ); resp.getwriter().print(<br/>); protected void dopost(httpservletrequest req, HttpServletRespo 第三章补充案例 案例 3-1 HttpServlet 一 案例描述 1 考核知识点名称 :HttpServlet 编号 : 2 练习目标 掌握 HttpServlet 的 doget() 方法和 dopost() 方法 3 需求分析由于大多数 Web 应用都是通过 HTTP 协议和客户端进行交互, 因此, 在 Servlet 接口中, 提供了 一个抽象类 javax.servlet.http.httpservlet,

More information

2 Java 语 言 程 序 设 计 教 程 1.2.1 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

2 Java 语 言 程 序 设 计 教 程 1.2.1 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难 第 1 章 Java 概 述 Java 的 诞 生 Java 的 特 点 Java 开 发 环 境 安 装 与 配 置 创 建 并 运 行 一 个 简 单 的 Java 程 序 Java 语 言 是 当 今 计 算 机 软 件 行 业 中 最 热 门 的 网 络 编 程 语 言, 以 Java 为 核 心 的 芯 片 技 术 编 译 技 术 数 据 库 连 接 技 术, 以 及 基 于 企 业 级

More information

基于ECO的UML模型驱动的数据库应用开发1.doc

基于ECO的UML模型驱动的数据库应用开发1.doc ECO UML () Object RDBMS Mapping.Net Framework Java C# RAD DataSetOleDbConnection DataGrod RAD Client/Server RAD RAD DataReader["Spell"].ToString() AObj.XXX bug sql UML OR Mapping RAD Lazy load round trip

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc Java C++ Pascal C# C# if if if for while do while foreach while do while C# 3.1.1 ; 3-1 ischeck Test() While ischeck while static bool ischeck = true; public static void Test() while (ischeck) ; ischeck

More information

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌 语 言 程 序 设 计 郑 莉 胡 家 威 编 著 清 华 大 学 逸 夫 图 书 馆 北 京 内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌 握 语

More information

OSWorkflow Documentation

OSWorkflow Documentation OSWorkflow Documentation Update Time: 05/09/15 OSWorkflow Java workflow engine API 理 flow 行 XML 來 流 Database UI 不 流 GUI Designer end user 行 JSP+Servlet 行 OSWorkflow 2.8 說 2.7 2.7 了 OSWorkflow library library

More information

《大话设计模式》第一章

《大话设计模式》第一章 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜

More information

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 JAVA 程 序 设 计 ( 肆 ) 徐 东 / 数 学 系 使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 使 用 Java class 代 表 保 险 箱 public class SaveBox 类 名 类 类 体 实 现 封 装 性 使 用 class SaveBox 代 表 保

More information

使用MapReduce读取XML文件

使用MapReduce读取XML文件 使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

jsp

jsp JSP Allen Long Email: allen@huihoo.com http://www.huihoo.com 2004-04 Huihoo - Enterprise Open Source http://www.huihoo.com 1 JSP JSP JSP JSP MVC Huihoo - Enterprise Open Source http://www.huihoo.com 2

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

FileMaker 15 ODBC 和 JDBC 指南

FileMaker 15 ODBC 和 JDBC 指南 FileMaker 15 ODBC JDBC 2004-2016 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. / FileMaker WebDirect FileMaker, Inc. FileMaker

More information

untitled

untitled ArcGIS Server Web services Web services Application Web services Web Catalog ArcGIS Server Web services 6-2 Web services? Internet (SOAP) :, : Credit card authentication, shopping carts GIS:, locator services,

More information

服务框架 HSF 使用与配置 一江更新时间 : 目录 HSF 常用 OPS 和开发工具介绍... 1 HSF 的使用和配置... 2 下载和安装 HSF... 2 服务开发与部署... 5 服务查询 服务调用 HSFUNIT 测试包的使用 HSF

服务框架 HSF 使用与配置 一江更新时间 : 目录 HSF 常用 OPS 和开发工具介绍... 1 HSF 的使用和配置... 2 下载和安装 HSF... 2 服务开发与部署... 5 服务查询 服务调用 HSFUNIT 测试包的使用 HSF 服务框架 HSF 使用与配置 一江更新时间 :2011-7-20 目录 HSF 常用 OPS 和开发工具介绍... 1 HSF 的使用和配置... 2 下载和安装 HSF... 2 服务开发与部署... 5 服务查询... 10 服务调用... 11 HSFUNIT 测试包的使用... 13 HSF Jetty 插件的使用... 15 路由规则和限流规则的介绍... 21 HSF 常用 OPS 和开发工具介绍

More information

1

1 PRIMETON TECHNOLOGIES, LTD. EOS EOS Manager No part of this document may be reproduced, stored in any electronic retrieval system, or transmitted in any form or by any means, mechanical, photocopying,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 友乾营 报表的 SQL 植入风险 规避风险 : 让你的报表变的安全起来 SQL 植入的概念 恶意的 SQL 归根结底 : 执行了不该允许执行的 SQL 命令, 达到非法的目的 常见案例 骗过登录验证非法获取账号信息篡改 删除数据 为什么存在 SQL 植入 植入原理 如何攻击 特殊的输入参数 未处理特殊字符 -- # 数据库配置不合理 植入原理 : 案例 1, 特殊输入参数 union or 猜表名

More information

JavaIO.PDF

JavaIO.PDF O u t p u t S t ream j a v a. i o. O u t p u t S t r e a m w r i t e () f l u s h () c l o s e () public abstract void write(int b) throws IOException public void write(byte[] data) throws IOException

More information

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO CHAPTER 使用 Hadoop 打造自己的雲 8 8.3 測試 Hadoop 雲端系統 4 Nodes Hadoop Map Reduce Hadoop WordCount 4 Nodes Hadoop Map/Reduce $HADOOP_HOME /home/ hadoop/hadoop-0.20.2 wordcount echo $ mkdir wordcount $ cd wordcount

More information

D C 93 2

D C 93 2 D9223468 3C 93 2 Java Java -- Java UML Java API UML MVC Eclipse API JavadocUML Omendo PSPPersonal Software Programming [6] 56 8 2587 56% Java 1 epaper(2005 ) Java C C (function) C (reusability) eat(chess1,

More information

Mac Java import com.apple.mrj.*;... public class MyFirstApp extends JFrame implements ActionListener, MRJAboutHandler, MRJQuitHandler {... public MyFirstApp() {... MRJApplicationUtils.registerAboutHandler(this);

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 掌握 Model I 体系结构 掌握 Model II 体系结构 掌握 MVC 应用程序 Model I 体系结构 6 1 Model I 体系结构结合使用 JSP 页面和 Bean 来开发 Web 应用程序 应用服务器 请求 JSP 页面 响应 Bean 数据库服务器 Model I 体系结构 6 2 Model I 体系结构用于开发简单的应用程序

More information

TopTest_Adminstrator.doc

TopTest_Adminstrator.doc 壹 前 言... 3 貳 系 統 簡 介... 4 一 TKB multimedia Top-Test 系 統 架 構...4 1. 使 用 者 介 面 層 (Presentation tier)...5 2. 商 業 邏 輯 層 (business logic tier)...5 3. 資 料 服 務 層 (data services tier)...5 二 TKB Multimedia Top-Test

More information

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址   access_token=access_token (http 停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 https://webapi.zego.im/cgi/stop-mix? access_token=access_token (https://webapi.zego.im/cgi/stop-mix? access_token=access_token)

More information

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt 2004 Marty Hall 服务器响应的生成 : HTTP 状态代码 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

Microsoft Word - PHP7Ch01.docx

Microsoft Word - PHP7Ch01.docx PHP 01 1-6 PHP PHP HTML HTML PHP CSSJavaScript PHP PHP 1-6-1 PHP HTML PHP HTML 1. Notepad++ \ch01\hello.php 01: 02: 03: 04: 05: PHP 06:

More information

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074> 程 序 设 计 实 习 INFO130048 3-2.C++ 面 向 对 象 程 序 设 计 重 载 继 承 多 态 和 聚 合 复 旦 大 学 计 算 机 科 学 与 工 程 系 彭 鑫 pengxin@fudan.edu.cn 内 容 摘 要 方 法 重 载 类 的 继 承 对 象 引 用 和 拷 贝 构 造 函 数 虚 函 数 和 多 态 性 类 的 聚 集 复 旦 大 学 计 算 机 科 学

More information

高级 Web 技术 SOFT , 2018 春季学期 View on GitHub 高级 Web 技术 Lab 2:Spring Boot 与 MyBatis [TOC] Part 1: Spring Boot 前后端分离的 Web 架构中, 后端一般是一个提供 Restful 接口

高级 Web 技术 SOFT , 2018 春季学期 View on GitHub 高级 Web 技术 Lab 2:Spring Boot 与 MyBatis [TOC] Part 1: Spring Boot 前后端分离的 Web 架构中, 后端一般是一个提供 Restful 接口 高级 Web 技术 SOFT130050.01, 2018 春季学期 View on GitHub 高级 Web 技术 Lab 2:Spring Boot 与 MyBatis [TOC] Part 1: Spring Boot 前后端分离的 Web 架构中, 后端一般是一个提供 Restful 接口的服务器, 为前端提供所需数据 目前主流的 Restful 后端的语言与框架有 : JavaScript,

More information

untitled

untitled Work Managers 什 Work Managers? WebLogic Server 9.x 行 (thread) 理 thread pool 數量 立 execute queues 來 量 理 thread count, thread priority 參數 理 thread pool 數量? WebLogic Server 9.x 理 行 (thread) (self-tuning) 句

More information

Microsoft Word - Learn Objective-C.doc

Microsoft Word - Learn Objective-C.doc Learn Objective C http://cocoadevcentral.com/d/learn_objectivec/ Objective C Objective C Mac C Objective CC C Scott Stevenson [object method]; [object methodwithinput:input]; output = [object methodwithoutput];

More information

使用Cassandra和Spark 2.0实现Rest API服务

使用Cassandra和Spark 2.0实现Rest API服务 使用 Cassandra 和 Spark 2.0 实现 Rest API 服务 在这篇文章中, 我将介绍如何在 Spark 中使用 Akkahttp 并结合 Cassandra 实现 REST 服务, 在这个系统中 Cassandra 用于数据的存储 我们已经见识到 Spark 的威力, 如果和 Cassandra 正确地结合可以实现更强大的系统 我们先创建一个 build.sbt 文件, 内容如下

More information

(CIP) Web /,. :,2005. 1 ISBN 7 81058 782 X.W............T P393.4 CIP (2004) 118797 Web ( 99 200436) ( http:/ / www.shangdapress.com 66135110) : * 787

(CIP) Web /,. :,2005. 1 ISBN 7 81058 782 X.W............T P393.4 CIP (2004) 118797 Web ( 99 200436) ( http:/ / www.shangdapress.com 66135110) : * 787 Web (CIP) Web /,. :,2005. 1 ISBN 7 81058 782 X.W............T P393.4 CIP (2004) 118797 Web ( 99 200436) ( http:/ / www.shangdapress.com 66135110) : * 787 1092 1/ 16 30.75 748 2005 1 1 2005 1 1 : 1 3 100

More information

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile..

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile.. WebSphere Studio Application Developer IBM Portal Toolkit... 1/21 WebSphere Studio Application Developer IBM Portal Toolkit Portlet Doug Phillips (dougep@us.ibm.com),, IBM Developer Technical Support Center

More information

JAR 包 : doget 方法 : 1. import java.io.ioexception; 2. import java.io.printwriter; 3. import javax.servlet.servletexception; 4. import javax.servlet.htt

JAR 包 : doget 方法 : 1. import java.io.ioexception; 2. import java.io.printwriter; 3. import javax.servlet.servletexception; 4. import javax.servlet.htt Java Servlet 技术的实现原理 程天任 摘要 : Server Applet 全称 Java Servlet, 是用 Java 编写的服务器端程序 其主要功能在于交互式地浏览和修改数据, 生成动态 Web 内容 狭义的 Servlet 是指 Java 语言实现的一个接口, 广义的 Servlet 是指任何实现了这个 Servlet 接口的类, 一般情况下, 人们将 Servlet 理解为后者

More information

05 01 accordion UI containers 03 Accordion accordion UI accordion 54

05 01 accordion UI containers 03 Accordion accordion UI accordion 54 jquery UI plugin Accordion 05 01 accordion UI containers 03 Accordion accordion UI accordion 54 05 jquery UI plugin 3-1

More information

中 国 矿 业 大 学

中 国 矿 业 大 学 实验一动态网页设计基础 实验目的 : 1 掌握 HTML 的常用标签 2 掌握 HTML 设计基本网页 3 掌握 HTML 设计网络中常用的表单 4 了解 JavaScript 的简单应用, 实验环境 : 操作系统 Windows XP 或更高版本实验内容 : 1 编写一个简单的学生信息注册页面, 包括学号 姓名 密码 专业, 其中学号 姓名用单行文本框 密码使用密码框 专业使用下拉菜单 ; 2 使用框架将一个页面均分为四个区域,

More information

untitled

untitled 653 JAVA 2008 11 Institution of Software Engineer... 2... 4... 4... 5... 5... 8... 8... 8... 8... 8... 9... 9... 9... 11... 13... 13... 13... 13... 15... 15... 15... 15... 16... 16... 17... 17... 17...

More information

Java 1 Java String Date

Java 1 Java String Date JAVA SCJP Java 1 Java String Date 1Java 01 Java Java 1995 Java Java 21 Java Java 5 1-1 Java Java 1990 12 Patrick Naughton C++ C (Application Programming Interface API Library) Patrick Naughton NeXT Stealth

More information

Microsoft PowerPoint - ch6 [相容模式]

Microsoft PowerPoint - ch6 [相容模式] UiBinder wzyang@asia.edu.tw UiBinder Java GWT UiBinder XML UI i18n (widget) 1 2 UiBinder HelloWidget.ui.xml: UI HelloWidgetBinder HelloWidget.java XML UI Owner class ( Composite ) UI XML UiBinder: Owner

More information

空白处应该填写的内容为 ( ) A Integer B Long C Float D Double 9 以下关于 Query 对象获取查询结果的说法, 不正确的是 ( ) A list() 方法返回的结果为 List 集合 B list() 方法返回结果数据总量为 1 到多条数据 C uniquer

空白处应该填写的内容为 ( ) A Integer B Long C Float D Double 9 以下关于 Query 对象获取查询结果的说法, 不正确的是 ( ) A list() 方法返回的结果为 List 集合 B list() 方法返回结果数据总量为 1 到多条数据 C uniquer 第 7 章初识 Hibernate 样题 A 卷 一 选择题 ( 每小题 2 分, 共 20 分 ) 1 下面关于 Hibernate 的说法中, 正确的是 ( ) A Hibernate 是 ORM 的一种实现方式 B Hibernate 不需要 JDBC 的支持 C 属于控制层 D 属于业务逻辑层 2 下面关于 Hibernate 的描述中, 错误的是 ( ) A Hibernate 对 JDBC

More information

在 ongodb 中实现强事务

在 ongodb 中实现强事务 在 ongodb 中实现强事务 600+ employees 2,000+ customers 13 offices worldwide 15,000,000+ Downloads RANK DBMS MODEL SCORE GROWTH (20 MO) 1. Oracle Rela+onal DBMS 1,442-5% 2. MySQL Rela+onal DBMS 1,294 2% 3.

More information

Swing-02.pdf

Swing-02.pdf 2 J B u t t o n J T e x t F i e l d J L i s t B u t t o n T e x t F i e l d L i s t J F r a m e 21 2 2 Swing C a n v a s C o m p o n e n t J B u t t o n AWT // ToolbarFrame1.java // java.awt.button //

More information