0%

关于Shiro实现资源匹配权限的方式及实现动态权限思路

shiro使用filter的进行权限认证和过滤,其原理是将url和权限标识配对,生成filterchain,当请求进入时,对用户进行验权,因而要实现动态权限,只要更新filterchain即可。源码

首先查看shiro的filterchain的生成

在文档中可以看到,shiro的filter实例都是由

ShiroFilterFactoryBean

来生成,其主要属性包含

1
2
3
4
5
6
7
private SecurityManager securityManager;
private Map<String, Filter> filters;
private Map<String, String> filterChainDefinitionMap; //资源权限对应map
private String loginUrl;
private String successUrl;
private String unauthorizedUrl;
private AbstractShiroFilter instance;

其中filterChainDefinitionMap属性就是我们所要动态改变的,

Read more »

HTTP响应码和说明

2xx 成功
200 正常;请求已完成。
201 正常;紧接 POST 命令。
202 正常;已接受用于处理,但处理尚未完成。
203 正常;部分信息 — 返回的信息只是一部分。
204 正常;无响应 — 已接收请求,但不存在要回送的信息。
3xx 重定向
301 已移动 — 请求的数据具有新的位置且更改是永久的。
302 已找到 — 请求的数据临时具有不同 URI。
HTTP 303 请参阅其它 — 可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。
HTTP 304 未修改 — 未按预期修改文档。
HTTP 305 使用代理 — 必须通过位置字段中提供的代理来访问请求的资源。
HTTP 306 未使用 — 不再使用;保留此代码以便将来使用。
HTTP 4xx 客户机中出现的错误
HTTP 400 错误请求 — 请求中有语法问题,或不能满足请求。
HTTP 401 未授权 — 未授权客户机访问数据。
HTTP 402 需要付款 — 表示计费系统已有效。
HTTP 403 禁止 — 即使有授权也不需要访问。
HTTP 404 找不到 — 服务器找不到给定的资源;文档不存在。
HTTP 407 代理认证请求 — 客户机首先必须使用代理认证自身。
HTTP 415 介质类型不受支持 — 服务器拒绝服务请求,因为不支持请求实体的格式。
HTTP 5xx 服务器中出现的错误
HTTP 500 内部错误 — 因为意外情况,服务器不能完成请求。
HTTP 501 未执行 — 服务器不支持请求的工具。
HTTP 502 错误网关 — 服务器接收到来自上游服务器的无效响应。
HTTP 503 无法获得服务 — 由于临时过载或维护,服务器无法处理请求。


Read more »

关于JEESESSIONID

一般的J2EE项目,默认会使用JEESESSIONID作为会话id的标识,在服务器端和客户端交互中带上这个标识及其值,特别是shiro默认会在url后带这个后缀

servlet3.0以后session id的保存方式

  1. COOKIE 保存在客户端COOKIE中,通过请求读取cookie确认会话归属
  2. URL 跟在url接连后面,默认方式,通过读取url后缀确认会话归属
  3. SSL 使用SSL连接确认会话归属,这个最安全,但成本最高

如何去掉url后缀的”;JEESESSIONID=”

从上面看出,默认使用后缀,因此,只要改变session id的保存方式即可去掉,具体使用2中方式

设置web.xml

如果使用Tomcat7及以上版本,且开发基于servlet3.0+可以通过web.xml经行配置,如下

1
2
3
<session-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
Read more »

git 将本地仓库推送到远程仓库 **

  1. 首先要在远程的git仓库上新建仓库,并记录地址,例如,我们创建的地址是

    1
    git@git.yanglong.com:root/example.git
  2. gitbash进入本地已有代码的项目根文件夹下,执行下面的代码

    1
    2
    3
    4
    5
    git init
    git add ./
    git commit -m "init"
    git remote add origin git@git.yanglong.com:root/example.git
    git push -u origin master

关于Spring 无法注入接口的实现类,通常报错类似:

1
Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [xxxx] to required type [xxxxImpl] for property 'xxxx': no matching editors or conversion strategy found

首先检查aop设置,确认当前配置文件中配置了

1
<aop:aspectj-autoproxy proxy-target-class="true"/>

其次

重命名你的接口,然后实现类实现的接口也更新为新的接口名称。

如果还不能解决,确认依赖jar包完整和其他配置无误。

** 环境说明**

博客根目录I:\IDEAWorkspace\blog
主题根目录:I:\IDEAWorkspace\blog\themes\yilia

分类配置文件说明

首先在博客根目录下有一个 _config.yml 配置文件,此配置文件是全局配置文件,具体配置信息参考网上,这里只说分类,打开此文件找到

1
2
archive_dir: archives
category_dir: categories

如上,保持默认即可,此配置的意思是分类的目录为 categories 我们的md文件在服务器运行时的访问路径是

127.0.0.1:4000/categories/{我们定义的分类}

那么分类如何定义呢?

Read more »

#Shiro整合Freemark标签
写个java类,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
Copyright DR.YangLong

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package com.dr.architecture.common.shiro;

import com.dr.architecture.common.shiro.tags.ShiroTags;
import freemarker.template.TemplateException;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import java.io.IOException;

/**
* com.up360.extension.security.shiro
* functional describe:shiro freemark标签 https://github.com/jagregory/shiro-freemarker-tags
*
* @author DR.YangLong
* @version 1.0 datetime:2014/12/10 16:06
*/
public class ShiroFreemarkTagsConfigurer extends FreeMarkerConfigurer {
@Override
public void afterPropertiesSet() throws IOException, TemplateException {
super.afterPropertiesSet();
this.getConfiguration().setSharedVariable("shiro", new ShiroTags());
}
}

在配置spring的视图解析器时,将FreeMarkerConfigurer替换为此类即可。具体可参考shiro-freemarker-tags项目中的说明。

Oracle RAC的优势在于利用多个节点(数据库实例)组成一个数据库,这样在保证了数据库高可用性的情况下更充分的利用了多个主机的性能,而且可以通过增加节点进行性能的扩展。实现Oracle RAC需要解决的关键问题就是多节点进行数据访问时如何保证数据的一致性,Oracle是通过各节点间的私有连接进行内存融合(cache fusion)来保证各节点数据访问的一致性。用一个例子来解释一下内存融合的过程,在存在A、B两个节点的RAC环境中,当A节点使用DML语句(如Update)对一个数据块中的数据进行修改时,A节点实例会到GRD(Global Resource Directory)中查找该数据块的信息,这些信息包括该数据块的Master(第一次读这个数据块的节点),Owner(当前拥有这个数据块的节点),以及数据块在各个节点间的传递记录。A节点如果发现GRD中没有需要读取的数据块的信息,说明该数据块是一个干净的数据块,A节点从磁盘或Buffer Cache中获得该数据块,然后对需要修改的行加锁,进行相应的修改,当然SCN会随之增加。在A完成修改而没有提交或回滚的情况下,如果B节点也需要访问这个数据块修改某些行(假设不同于A修改的行),B同样去到GRD中查找该数据块的信息,当然B发现该数据块的Master为A,Owner也为A,为了保证A的修改不丢失,B需要发信息给A,让A将需要修改的数据块通过私有连接直接从内存中传给B,当然该数据块中包含A的锁信息,这样A节点与B节点间的一次内存的数据传递就是内存融合。Oracle RAC的内存融合也面临一些问题,继续刚刚的例子,如果A又再次请求对该数据块修改或者结束事务(提交或回滚)的时候,又需要从B节点内存中取得数据块,又要发生内存融合,这样在两个节点业务没有合理分割的情况下,数据库繁忙时,大量的内存融合会对数据库性能造成严重的影响。通过对Oracle RAC技术的理解,在实现Oracle RAC架构时的业务分割就成为了保证系统性能的重要手段,业务分割的根本在于使不同的实例不能访问相同的数据块,这样业务分割规则可以小到表的级别(不同的表不会共享一个数据块),大到表空间、Schema的级别。心跳应该用独立的网卡。

  当然,rac本身之保证了数据库服务器的高可用和高性能,所以最好有其他的存储技术来保证存储的高可用,例如raid\vplex等。

  在距离不太远(几十公里),且速度较快(例如裸光纤)下,延时较小,,米足够多,可以考虑使用oracle rac实现双活或者灾备,RTO RPO=0。

Read more »

首先安装node js

安装npm可以省略,最新版的node已经集成

首先进入某个目录,此例子为D:\

安装hexo

1
D:\>npm install hexo-cli -g

###初始化博客

1
D:\>hexo init blog

###进入blog并安装

1
2
D:\>cd blog
D:\blog>npm install
Read more »

1.下载JDK

    从官网JDK下载解压放到/usr/lib/jdk/jdk8中

1
sudo gedit /etc/profile

末尾添加

1
2
3
4
5
6
7
export JAVA_HOME=/usr/lib/jdk/jdk8
export JRE_HOME=/usr/lib/jdk/jdk8/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
# for hadoop if exist
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin

配置系统默认jdk,300是一个优先级数值:

1
2
3
4
sudo update-alternatives --install /usr/bin/java java /usr/lib/jdk/jdk8/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jdk/jdk8/bin/javac 300
sudo update-alternatives --config java 选择安装的jdk
sudo update-alternatives --config javac