文章目录

    • 第四章 Web项目集成Shiro
      • 1、Web集成原理分析
        • 【1】web集成的配置
          • 【1.1】新建项目
          • 【1.2】pom.xml配置
          • 【1.3】web.xml配置
        • 【2】SecurityManager对象创建
      • 2、Shiro默认过滤器
        • 【1】认证相关
        • 【2】授权相关
      • 3、Web集成完整案例
        • 【1】编写pom.xml
        • 【2】编写shiro.ini文件
        • 【3】编写LoginService
        • 【4】修改SecurityServiceImpl
        • 【5】添加web层内容
          • 【5.1】LoginServlet
          • 【5.2】HomeServlet
          • 【5.3】OrderAddServlet
          • 【5.4】OrderListServlet
          • 【5.5】LogoutServlet
        • 【6】添加JSP
        • 【7】测试
          • 【7.1】启动
          • 【7.2】登录过滤
          • 【7.3】角色过滤
          • 【7.4】资源过滤
      • 4、web项目授权
        • 【1】基于代码
          • 【1.1】登录相关
          • 【1.2】角色相关
          • 【1.3】资源相关
          • 【1.4】案例
            • 【1.4.1】创建项目
            • 【1.4.2】修改shiro.ini
            • 【1.4.3】登录相关
            • 【1.4.4】角色相关
            • 【1.4.5】资源相关
        • 【2】基于Jsp标签
          • 【2.1】使用方式
          • 【2.2】相关标签
          • 【2.3】案例
            • 【2.3.1】新建项目
            • 【2.3.2】修改home.jsp

第四章 Web项目集成Shiro

1、Web集成原理分析

【1】web集成的配置

还记得吗,以前我们在没有与WEB环境进行集成的时候,为了生成SecurityManager对象,是通过手动读取配置文件生成工厂对象,再通过工厂对象获取到SecurityManager的。就像下面代码展示的那样

 /*** @Description 登录方法*/
private Subject shiroLogin(String loginName,String password) {//导入权限ini文件构建权限工厂Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");//工厂构建安全管理器SecurityManager securityManager = factory.getInstance();//使用SecurityUtils工具生效安全管理器SecurityUtils.setSecurityManager(securityManager);//使用SecurityUtils工具获得主体Subject subject = SecurityUtils.getSubject();//构建账号tokenUsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginName, password);//登录操作subject.login(usernamePasswordToken);return subject;
}

不过,现在我们既然说要与WEB集成,那么首先要做的事情就是把我们的shiro.ini这个配置文件交付到WEB环境中,定义shiro.ini文件如下

#声明自定义的realm,且为安全管理器指定realms
[main]
definitionRealm=com.itheima.shiro.realm.DefinitionRealm
securityManager.realms=$definitionRealm
【1.1】新建项目

HelloShiro

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ndyNTRb-1642943449742)(image\1580538893171.png)]

【1.2】pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>HelloShiro</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.3.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency></dependencies><build><plugins><!-- tomcat7插件,命令: mvn tomcat7:run -DskipTests --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><uriEncoding>utf-8</uriEncoding><port>8080</port><path>/platform</path></configuration></plugin><!-- compiler插件, 设定JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>8</source><target>8</target><showWarnings>true</showWarnings></configuration></plugin></plugins></build>
</project>
【1.3】web.xml配置
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>shiro-day01-07web</display-name><!-- 初始化SecurityManager对象所需要的环境--><context-param><param-name>shiroEnvironmentClass</param-name><param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value></context-param><!-- 指定Shiro的配置文件的位置 --><context-param><param-name>shiroConfigLocations</param-name><param-value>classpath:shiro.ini</param-value></context-param><!-- 监听服务器启动时,创建shiro的web环境。即加载shiroEnvironmentClass变量指定的IniWebEnvironment类--><listener><listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class></listener><!-- shiro的l过滤入口,过滤一切请求 --><filter><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></web-app>

【2】SecurityManager对象创建

上面我们集成shiro到web项目了,下面我们来追踪下源码,看下SecurityManager对象是如何创建的

(1)我启动了服务器,监听器捕获到了服务器启动事件。我现在所处的位置EnvironmentLoaderListener监听器的入口处

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存失败,源站可能有防盗链机制,建议将图片保存下来直接上传下上传(iOmV4upF9KIY-1642943449743)(image\1580539365062.png)(image\1580539365062.png)]

(2)进入方法内查看,它先根据我们的shiroEnvironmentClass变量的值org.apache.shiro.web.env.IniWebEnvironment,初始化一个shiro环境对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7sEOE27L-1642943449744)(image\1580539658469.png)]

(3)最后在创建一个SecurityManager对象,再将其绑定到刚才通过字节码创建的Shiro环境对象中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G53Lfr1N-1642943449752)(image\1580540126770.png)]在这里插入图片描述
在这里插入图片描述

到这来SecurityManager就完成了初始化

2、Shiro默认过滤器

Shiro内置了很多默认的过滤器,比如身份验证、授权等相关的。默认过滤器可以参考org.apache.shiro.web.filter.mgt.DefaultFilter中的枚举过滤器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2cjLq1Nb-1642943449758)(image\1580542509773.png)]

【1】认证相关

过滤器过滤器类说明默认
authcFormAuthenticationFilter基于表单的过滤器;如“/**=authc”,如果没有登录会跳到相应的登录页面登录
logoutLogoutFilter退出过滤器,主要属性:redirectUrl:退出成功后重定向的地址,如“/logout=logout”/
anonAnonymousFilter匿名过滤器,即不需要登录即可访问;一般用于静态资源过滤;示例“/static/**=anon”

【2】授权相关

过滤器过滤器类说明默认
rolesRolesAuthorizationFilter角色授权拦截器,验证用户是否拥有所有角色;主要属性: loginUrl:登录页面地址(/login.jsp);unauthorizedUrl:未授权后重定向的地址;示例“/admin/**=roles[admin]”
permsPermissionsAuthorizationFilter权限授权拦截器,验证用户是否拥有所有权限;属性和roles一样;示例“/user/**=perms[“user:create”]”
portPortFilter端口拦截器,主要属性:port(80):可以通过的端口;示例“/test= port[80]”,如果用户访问该页面是非80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样
restHttpMethodPermissionFilterrest风格拦截器,自动根据请求方法构建权限字符串(GET=read, POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create)构建权限字符串;示例“/users=rest[user]”,会自动拼出“user:read,user:create,user:update,user:delete”权限字符串进行权限匹配(所有都得匹配,isPermittedAll)
sslSslFilterSSL拦截器,只有请求协议是https才能通过;否则自动跳转会https端口(443);其他和port拦截器一样;

3、Web集成完整案例

基于HelloShiro继续集成

【1】编写pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>HelloShiro</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>HelloShiro Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><dependencies><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.3.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency></dependencies><build><plugins><!-- tomcat7插件,命令: mvn tomcat7:run -DskipTests --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><uriEncoding>utf-8</uriEncoding><port>8080</port><path>/platform</path></configuration></plugin><!-- compiler插件, 设定JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>8</source><target>8</target><showWarnings>true</showWarnings></configuration></plugin></plugins></build>
</project>

【2】编写shiro.ini文件

#声明自定义的realm,且为安全管理器指定realms
[main]
definitionRealm=com.xh.shiro.realm.DefinitionRealm
securityManager.realms=$definitionRealm
#用户退出后跳转指定JSP页面
logout.redirectUrl=/login.jsp
#若没有登录,则被authc过滤器重定向到login.jsp页面
authc.loginUrl = /login.jsp
[urls]
/login=anon
#发送/home请求需要先登录
/home= authc
#发送/order/list请求需要先登录
/order-list = roles[admin]
#提交代码需要order:add权限
/order-add = perms["order:add"]
#更新代码需要order:del权限
/order-del = perms["order:del"]
#发送退出请求则用退出过滤器
/logout = logout

【3】编写LoginService

package com.xh.shiro.service;import org.apache.shiro.authc.UsernamePasswordToken;/*** @Description:登录服务*/
public interface LoginService {/*** @param token 登录对象* @return* @Description 登录方法*/boolean login(UsernamePasswordToken token);/*** @Description 登出方法*/void logout();
}
package com.xh.shiro.service.impl;import com.xh.shiro.service.LoginService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;/*** @Description:登录服务*/
public class LoginServiceImpl implements LoginService {@Overridepublic boolean login(UsernamePasswordToken token) {Subject subject = SecurityUtils.getSubject();try {subject.login(token);}catch (Exception e){return false;}return subject.isAuthenticated();}@Overridepublic void logout() {Subject subject = SecurityUtils.getSubject();subject.logout();}
}

【4】修改SecurityServiceImpl

package com.xh.shiro.service.impl;import com.xh.shiro.service.SecurityService;
import com.xh.shiro.utils.DigestsUtil;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class SecurityServiceImpl implements SecurityService {@Overridepublic Map<String,String> findPasswordByLoginName(String loginName) {//模拟数据库中存储的密文信息return  DigestsUtil.entryptPassword("123");}@Overridepublic List<String> findRoleByloginName(String loginName) {List<String> list = new ArrayList<>();if ("admin".equals(loginName)){list.add("admin");}list.add("dev");return list;}@Overridepublic List<String>  findPermissionByloginName(String loginName) {List<String> list = new ArrayList<>();if ("jay".equals(loginName)){list.add("order:list");list.add("order:add");list.add("order:del");}return list;}
}

【5】添加web层内容

【5.1】LoginServlet
package com.itheima.shiro.web;import com.itheima.shiro.service.LoginService;
import com.itheima.shiro.service.impl.LoginServiceImpl;
import org.apache.shiro.authc.UsernamePasswordToken;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;package com.xh.shiro.web;import com.xh.shiro.service.LoginService;
import com.xh.shiro.service.impl.LoginServiceImpl;
import org.apache.shiro.authc.UsernamePasswordToken;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:登录方法*/
@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//获取输入的帐号密码String username = req.getParameter("loginName");String password = req.getParameter("password");//封装用户数据,成为Shiro能认识的token标识UsernamePasswordToken token = new UsernamePasswordToken(username, password);LoginService loginService = new LoginServiceImpl();//将封装用户信息的token进行验证boolean isLoginSuccess = loginService.login(token);if (!isLoginSuccess) {//重定向到未登录成功页面resp.sendRedirect("login.jsp");return;}req.getRequestDispatcher("/home").forward(req, resp);}
}
【5.2】HomeServlet
package com.xh.shiro.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:系统home页面*/
@WebServlet(urlPatterns = "/home")
public class HomeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.getRequestDispatcher("home.jsp").forward(req, resp);}
}
【5.3】OrderAddServlet
package com.xh.shiro.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:添加页码*/
@WebServlet(urlPatterns = "/order-add")
public class OrderAddServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.getRequestDispatcher("order-add.jsp").forward(req, resp);}}
【5.4】OrderListServlet
package com.xh.shiro.web;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:订单列表*/
@WebServlet(urlPatterns = "/order-list")
public class OrderListServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.getRequestDispatcher("order-list.jsp").forward(req, resp);}
}
【5.5】LogoutServlet
package com.xh.shiro.web;import com.xh.shiro.service.LoginService;
import com.xh.shiro.service.impl.LoginServiceImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:登出*/
@WebServlet(urlPatterns = "/logout")
public class LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {LoginService loginService = new LoginServiceImpl();loginService.logout();}}

【6】添加JSP

login.jsp登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Title</title>
</head>
<body>
<form method="post" action="${pageContext.request.contextPath}/login"><table><tr><th>登陆名称</th><td><input type="text"  name="loginName"></td></tr><tr><th>密码</th><td><input type="password" name="password"></td></tr><tr><td colspan="2"><input type="submit" value="提交"/></td></tr></table></form>
</body>
</html>

home.jsp系统页

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title></title>
</head>
<body>
<h6><a href="${pageContext.request.contextPath}/logout">退出</a><a href="${pageContext.request.contextPath}/order-list">列表</a><a href="${pageContext.request.contextPath}/order-add">添加</a>
</h6>
</body>
</html>

order-add.jsp订单添加(伪代码)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Title</title>
</head>
<body>
添加页面
</body>
</html>

order-list.jsp订单列表

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入jstl标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>用户列表jsp页面</title><style>table {border:1px solid #000000}table th{border:1px solid #000000}table td{border:1px solid #000000}</style></head>
<body>
<table cellpadding="0" cellspacing="0" width="80%"><tr><th>编号</th><th>公司名称</th><th>信息来源</th><th>所属行业</th><th>级别</th><th>联系地址</th><th>联系电话</th></tr><tr><td>1</td><td>传智播客</td><td>网络营销</td><td>互联网</td><td>普通客户</td><td>津安创意园</td><td>0208888887</td></tr><tr><td>2</td><td>黑马程序员</td><td>j2ee</td><td>互联网</td><td>VIP客户</td><td>津安创意园</td><td>0208888887</td></tr><tr><td>3</td><td>黑马程序员</td><td>大数据</td><td>互联网</td><td>VIP客户</td><td>津安创意园</td><td>0208888887</td></tr>
</table>
</body></html>

【7】测试

【7.1】启动

在这里插入图片描述

【7.2】登录过滤

访问http://localhost:8080/platform/home的时候,会被
在这里插入图片描述

在这里插入图片描述

【7.3】角色过滤

使用“admin”用户登录,密码:123

在这里插入图片描述
在这里插入图片描述

登录成功之后:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tkGCqi9z-1642943449762)(image\1580713214523.png)]

此时点击“列表”,因为当前admin用户是有admin角色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMHutvdK-1642943449762)(image\1580713320621.png)]
所有可以正常访问
点击“添加”,因为当前admin用户是没有order:add的资源

在这里插入图片描述
所以回401

【7.4】资源过滤

点击“退出”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxdy1UL2-1642943449763)(image\1580713654616.png)]

使用“jay”用户登录,密码为123

在这里插入图片描述

点击“添加”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LleXThPf-1642943449764)(image\1580713818625.png)]

因为SecurityServiceImpl中为jay用户添加如下的资源

在这里插入图片描述

点击“添加”之后正常访问

点击“列表”之后,因为“jay”用户没有“admin”角色,所以访问受限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUIkD4cH-1642943449765)(image\1580713925370.png)]

4、web项目授权

前面我们学习了基于ini文件配置方式来完成授权,下面我们来看下其他2种方式的授权

【1】基于代码

【1.1】登录相关
Subject 登录相关方法描述
isAuthenticated()返回true 表示已经登录,否则返回false。
【1.2】角色相关
Subject 角色相关方法描述
hasRole(String roleName)返回true 如果Subject 被分配了指定的角色,否则返回false。
hasRoles(List roleNames)返回true 如果Subject 被分配了所有指定的角色,否则返回false。
hasAllRoles(CollectionroleNames)返回一个与方法参数中目录一致的hasRole 结果的集合。有性能的提高如果许多角色需要执行检查(例如,当自定义一个复杂的视图)。
checkRole(String roleName)安静地返回,如果Subject 被分配了指定的角色,不然的话就抛出AuthorizationException。
checkRoles(CollectionroleNames)安静地返回,如果Subject 被分配了所有的指定的角色,不然的话就抛出AuthorizationException。
checkRoles(String… roleNames)与上面的checkRoles 方法的效果相同,但允许Java5 的var-args 类型的参数
【1.3】资源相关
Subject 资源相关方法描述
isPermitted(Permission p)返回true 如果该Subject 被允许执行某动作或访问被权限实例指定的资源,否则返回false
isPermitted(List perms)返回一个与方法参数中目录一致的isPermitted 结果的集合。
isPermittedAll(Collectionperms)返回true 如果该Subject 被允许所有指定的权限,否则返回false有性能的提高如果需要执行许多检查(例如,当自定义一个复杂的视图)
isPermitted(String perm)返回true 如果该Subject 被允许执行某动作或访问被字符串权限指定的资源,否则返回false。
isPermitted(String…perms)返回一个与方法参数中目录一致的isPermitted 结果的数组。有性能的提高如果许多字符串权限检查需要被执行(例如,当自定义一个复杂的视图)。
isPermittedAll(String…perms)返回true 如果该Subject 被允许所有指定的字符串权限,否则返回false。
checkPermission(Permission p)安静地返回,如果Subject 被允许执行某动作或访问被特定的权限实例指定的资源,不然的话就抛出AuthorizationException 异常。
checkPermission(String perm)安静地返回,如果Subject 被允许执行某动作或访问被特定的字符串权限指定的资源,不然的话就抛出AuthorizationException 异常。
checkPermissions(Collection perms)安静地返回,如果Subject 被允许所有的权限,不然的话就抛出AuthorizationException 异常。有性能的提高如果需要执行许多检查(例如,当自定义一个复杂的视图)
checkPermissions(String… perms)和上面的checkPermissions 方法效果相同,但是使用的是基于字符串的权限。
【1.4】案例
【1.4.1】创建项目

HelloShiro

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-efhktjAr-1642943449765)(image/1580799013486.png)]

【1.4.2】修改shiro.ini
#声明自定义的realm,且为安全管理器指定realms
[main]
definitionRealm=com.itheima.shiro.realm.DefinitionRealm
securityManager.realms=$definitionRealm
#用户退出后跳转指定JSP页面
logout.redirectUrl=/login.jsp
#若没有登录,则被authc过滤器重定向到login.jsp页面
authc.loginUrl = /login.jsp
[urls]
/login=anon
#发送/home请求需要先登录
#/home= authc
#发送/order/list请求需要先登录
#/order-list = roles[admin]
#提交代码需要order:add权限
#/order-add = perms["order:add"]
#更新代码需要order:del权限
#/order-del = perms["order:del"]
#发送退出请求则用退出过滤器
/logout = logout
【1.4.3】登录相关

修改HomeServlet的doPost方法

package com.xh.shiro.web;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:系统home页面*/
@WebServlet(urlPatterns = "/home")
public class HomeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//通过subjectd对象去判断是否登录Subject subject = SecurityUtils.getSubject();boolean flag  = subject.isAuthenticated();if (flag){resp.sendRedirect("home.jsp");}else {req.getRequestDispatcher("/login").forward(req, resp);}}
}

访问http://localhost:8080/platform/home 进行debug

在这里插入图片描述

此时我们通过subject.isAuthenticated()判断是否登录,如果登录则重定向到home.jsp,如果没有登录则转发到/login对应的servlet

【1.4.4】角色相关

修改OrderListServlet的doPost方法,判断是否有admin角色,如果有则转发order-list.jsp,没有则转发/login

package com.xh.shiro.web;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:订单列表*/
@WebServlet(urlPatterns = "/order-list")
public class OrderListServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {Subject subject = SecurityUtils.getSubject();//判断当前角色boolean flag = subject.hasRole("admin");if (flag){req.getRequestDispatcher("order-list.jsp").forward(req, resp);}else {req.getRequestDispatcher("/login").forward(req, resp);}}
}

访问http://localhost:8080/platform/order-list

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ec219Uoo-1642943449765)(image\1580801658680.png)]

因为此时我未登录,也就是说当前没有admin角色,这是通过subject.hasRole(“admin”)返回未false

【1.4.5】资源相关

修改OrderAddServlet

package com.xh.shiro.web;import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @Description:添加页码*/
@WebServlet(urlPatterns = "/order-add")
public class OrderAddServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {Subject subject = SecurityUtils.getSubject();//判断是否有对应资源boolean flag = subject.isPermitted("order:add");if (flag){req.getRequestDispatcher("order-add.jsp").forward(req, resp);}else {req.getRequestDispatcher("/login").forward(req, resp);}}
}

访问http://localhost:8080/platform/order-add

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvQh69Kq-1642943449766)(image\1580802789329.png)]

因为此时我未登录,也就是说当前没有order:add资源,通过 subject.isPermitted(“order:add”)返回未false

【2】基于Jsp标签

【2.1】使用方式

Shiro提供了一套JSP标签库来实现页面级的授权控制, 在使用Shiro标签库前,首先需要在JSP引入shiro标签:

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> 
【2.2】相关标签
标签说明
< shiro:guest >验证当前用户是否为“访客”,即未认证(包含未记住)的用户
< shiro:user >认证通过或已记住的用户
< shiro:authenticated >已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在
< shiro:notAuthenticated >未认证通过用户。与guest标签的区别是,该标签包含已记住用户
< shiro:principal />输出当前用户信息,通常为登录帐号信息
< shiro:hasRole name=“角色”>验证当前用户是否属于该角色
< shiro:lacksRole name=“角色”>与hasRole标签逻辑相反,当用户不属于该角色时验证通过
< shiro:hasAnyRoles name=“a,b”>验证当前用户是否属于以下任意一个角色
<shiro:hasPermission name=“资源”>验证当前用户是否拥有制定权限
<shiro:lacksPermission name=“资源”>与permission标签逻辑相反,当前用户没有制定权限时,验证通过
【2.3】案例
【2.3.1】新建项目

HelloShiro

在这里插入图片描述

【2.3.2】修改home.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title></title>
</head>
<body>
<h6><a href="${pageContext.request.contextPath}/logout">退出</a><shiro:hasRole name="admin"><a href="${pageContext.request.contextPath}/order-list">列表</a></shiro:hasRole><shiro:hasPermission name="order:add"><a href="${pageContext.request.contextPath}/order-add">添加</a></shiro:hasPermission>
</h6>
</body>
</html>

【2.3.3】测试

访问http://localhost:8080/platform/login

使用admin/123登录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8oOQgyNa-1642943449766)(image\1580806179855.png)]

这个时候我们只能看见“列表”,看不见“添加”,点击“退出”

使用jay/123登录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Ng6jC6U-1642943449766)(image\1580806253525.png)]

这个时候我们只能看见“添加”,看不见“列表”,点击“退出”

需要注意的是,这里只是页面是否显示内容,不能防止盗链的发生

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. MyBatis(MySQL)分组后组内排序

    MySQL根据字段进行分组后组内排序 要求&#xff1a; 根据status进行划分组&#xff0c;再从组内选择一个字段进行排序 这里我们使用更新时间update_time 进行降序排序 分组操作&#xff1a; 根据status进行分组 通过over(partition by status)进行分组操作组内排序&#xff1…...

    2024/5/6 9:27:34
  2. element图片滚动

    效果图&#xff1a; 不多bb直接上代码 <div class"demo-image__lazy"><el-image v-for"url in imgs" :key"url" :src"url" ></el-image> </div> .demo-image__lazy {height: 300px;overflow-y: auto; }这…...

    2024/4/14 5:56:48
  3. AutoCAD许可限制,许可加入白名单

    从事产品研发设计的工程师对三维设计软件AutoCAD应该并不陌生&#xff0c;尤其是在整车厂或零部件研发企业中。大部分企业不得不依托软件设计工具或者是工业软件以提升产品研发效率&#xff0c;但是&#xff0c;有一个问题在企业中不得不考虑&#xff0c;就是设计工具的使用许可…...

    2024/4/14 5:57:33
  4. 摄影|照片宣传网页设计(html + css3 + JavaScript)

    &#x1f496;简介&#xff1a; 微信小程序模板&#xff0c;H5模板&#xff0c;响应式布局模板&#xff0c;定制化项目简历模板、学习资料、面试题库【关注我&#xff0c;都给你】&#x1f496; 工具下载链接&#x1f60e;&#x1f60e;&#x1f60e;&#xff1a; vsCode 前端…...

    2024/4/20 17:32:26
  5. 超声波模块(HC_SR04)串口打印距离

    1 超声波模块 2超声波模块原理 3 结合主要讲解代码 1 实物图 引脚 2超声波模块原理 我们在初始化 都要 发送和接收端 拉低 首先给输出端 至少 10us的 高电平持续时间 之后要把它拉低 等待输入高电平打开 定时器 计算 高电平持续的时间 最后一步 等待高电平的结束 …...

    2024/5/3 22:18:40
  6. 盒子减速滑动案例

    利用JS实现一个盒子的减速滑动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"w…...

    2024/5/3 14:03:29
  7. 题目翻译8

    https://acs.jxnu.edu.cn/problem/HDU1034 糖果分享游戏 描述&#xff1a;一些学生围成一个圈面对着站在圈里的老师。一开始每个学生有偶数块糖果。在老师吹响口哨的同时&#xff0c;每个学生把他的一半的糖果给右边的那个人&#xff0c;任何学生最后有奇数块糖果&#xff0c…...

    2024/4/20 5:27:38
  8. 易语言内存逆向教程(PC电脑端方向最新)+送图色基础+多线程中控(类人猿)

    语言内存老教程非常多&#xff0c;但是很多已经不适合当前的游戏&#xff0c;当前已经新工具和思路原理&#xff0c;市面上大部分教程已经过时的了。我的课程都是最新的方法&#xff0c;综合各家所长的&#xff0c;让大家学有所成的。一分钱一分货&#xff0c;希望大家喜欢我的…...

    2024/4/14 5:57:33
  9. Pytorch:保存函数pytorch.save()和加载函数pytorch.load()的使用

    在Pytorch中&#xff0c;保存和加载操作通常是成对发生的&#xff0c;我们使用pytorch.save()和pytorch.load()函数来分别完成这两个功能。在训练模型时&#xff0c;我们可以将训练得到的模型、模型的权重、优化器的参数甚至一些Tensor都保存下来&#xff0c;在以后使用到该模型…...

    2024/5/3 21:35:27
  10. ubuntu下使用vscode阅读内核源码或uboot源码使用技巧——search.excludefiles.exclude

    各位玩家你们在阅读内核源码时&#xff0c;一般都使用什么工具呢&#xff1f;欢迎到文章末尾投上你的一票&#xff01; 内核源码和uboot源码一般囊括的文件都很多很多&#xff0c;未删减的都能上万个文件&#xff0c;使用一款称手的阅读源码软件可能可以让你的工作效率提高一个…...

    2024/4/14 5:57:38
  11. python_文件操作

    文件操作相关模块概述 名称说明io模块文件流的输入和输出操作input outputos模块基本操作系统功能&#xff0c;包括文件操作glob模块查找符合特定规则的文件路径名fnmatch模块使用模式来匹配文件路径名fileinput模块处理多个输入文件filecmp模块用于文件的比较cvs模块用于csv文…...

    2024/5/3 12:09:08
  12. BGR转灰度图、HSV及二值化

    这次我们将操作封面的图片 #include<iostream> #include<opencv2/opencv.hpp>using namespace cv; using namespace std;int main() {Mat img imread("F:\\image\\7.jpg");Mat gray, hsv;cvtColor(img, gray, COLOR_BGR2GRAY);cvtColor(img, hsv, COL…...

    2024/4/14 5:57:58
  13. 十行Python代码替换证件照背景颜色

    本文教大家通过Python程序替换证件照背景颜色&#xff0c;以后更换证件照背景就不会再苦恼了。 思路&#xff1a; 先去掉原照片的背景颜色 再添上新的背景颜色 步骤很简单&#xff0c;思路清晰&#xff0c;操作起来也很简单&#xff0c;十行代码就可以搞定&#xff0c;保证看完…...

    2024/4/15 18:10:30
  14. 蓝桥杯训练第八天打卡

    文章目录题目一&#xff1a;斐波那契数题解&#xff1a;题目二&#xff1a;第 N 个泰波那契数题解&#xff1a;想法&#xff1a;题目一&#xff1a;斐波那契数 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#x…...

    2024/4/18 22:44:16
  15. 58Linux磁盘分区机制59挂载的经典案例

    文章目录linux分区挂载的经典案例linux分区 挂载(mount) sblk列出有关所有可用或指定块设备的信息。 挂载的经典案例 选n增加分区 永久挂载...

    2024/5/3 18:23:09
  16. 23岁非计算机专业工科妹子裸辞转行程序员,给自己一年时间可行吗?

    写在前面 我从HR转行Python了&#xff0c;从小工科成绩好&#xff0c;大学里对编程也很感兴趣&#xff0c;只是因为一些家长的偏见&#xff0c;身边又没有喜欢计算机的女生&#xff0c;觉得自己是个异类&#xff08;我绝对不是抠脚大汉型&#xff01;人格担保取向正常&#xf…...

    2024/4/14 14:51:40
  17. Java安全学习笔记--反序列化漏洞利用链CC6链

    测试环境&#xff1a; jdk1.8(jdk8u71) Commons Collections4.0 HashSet HashSet使用的是Hash表的数据结构&#xff0c;增删改查的时间复杂度为O(1)&#xff0c;Set是一种集合&#xff0c;元素没有添加顺序&#xff0c;集合中不会有重复元素&#xff0c;结合一下就大概知道Has…...

    2024/4/7 16:43:07
  18. Python 基础学习07 控制语句与函数

    判别语句 1.顺序执行与控制语句 s1{1,2,3} s2{2,3,4} #if判别语句 if s1&s2 !set(): #空集合是set()print(s1&s2) {2, 3} 2.if判别语句结构 if <条件> : …...

    2024/5/3 20:00:13
  19. 全站最硬核 百万字强肝RocketMq源码 火热更新中~(四十八)

    入参就不多看了&#xff0c;方法主体是调用了remotingClient的 invokeAsync(addr, request, timeoutMillis, new InvokeCallback( ) 方法 看下异步调用内部是怎么重写 operationComplete(ResponseFuture responseFuture) 方法的&#xff1a; if (null sendCallback &…...

    2024/4/14 5:57:58
  20. 力扣19:删除链表的倒数第 N 个结点

    题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 例子 # 例1 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]# 例2 输入&#xff1a;head [1], n 1 输出&#xff1a;[]# 例3 输入&#xff1a;head […...

    2024/4/14 5:57:53

最新文章

  1. Vue踩坑,less与less-loader安装,版本不一致

    无脑通过npm i less -D安装less之后&#xff0c;继续无脑通过npm i less-loader -D安装less-loader出现如下错误&#xff1a; 解决方法&#xff1a; 1) npm uninstall less与 npm uninstall less-loader 2) 直接对其版本&#xff1a; npm i less3.0.4 -D npm i less-loader…...

    2024/5/6 11:12:24
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/6 9:38:23
  3. 数据结构--KMP算法

    数据结构–KMP算法 首先我在这里提出以下问题&#xff0c;一会一起进行探讨 1.什么是最长公共前后缀 2. KMP算法怎么实现对匹配原理 3. 最长公共前后缀怎么求解 KMP算法可以用来解决什么问题&#xff1f; 答&#xff1a;在字符串中匹配子串&#xff0c;也称为模式匹配 分析…...

    2024/5/5 0:48:22
  4. 北航2023年考研机试题

    【问题描述】一共6个手机基站&#xff0c;具有记录手机连接基站的能力&#xff0c;6个手机基站分别为ABCDEF&#xff0c;他们具有自己的覆盖范围且任何两个基站的覆盖范围不想交&#xff0c;基站保存的手机登陆日志包括手机号&#xff08;11位&#xff0c;用字符串保存&#xf…...

    2024/5/5 8:38:20
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/6 9:21:00
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57